Astro 博客 CI/CD 自动部署教程:使用 GitHub Actions 实现服务器自动发布
0. 准备工作
你需要准备
- 一台有
公网IP的Linux服务器 - 一个可以运行的
Astro项目
1. Linux上的部署
在Linux服务器上依次执行如下步骤:
1. 创建角色
创建Github部署时登录的角色
TIP推荐创建一个用户专门用于Github的CI/CD,不建议使用root角色进行CI/CD;
如果使用root需要配置Root的远程登录
sudo adduser github-ci2. 创建文件夹
创建放置部署文件的文件夹并给CI角色赋权
mkdir /var/www/releaseschown -R github-ci:github-ci /var/www/releases3. 安装openssh-server服务
先检查服务器上是否安装了ssh server
which sshwhich sshd如果显示:
root@:~/.ssh# which ssh/usr/bin/sshroot@:~/.ssh# which sshd/usr/sbin/sshd表示已经安装了SSH服务,请跳转到;
如果未显示一个路径地址,则表示没有安装,需要安装,步骤如下:
-
Ubuntu / Debian
Terminal window # 安装服务sudo apt updatesudo apt install -y openssh-server# 设置自启sudo systemctl enable ssh# 启动服务sudo systemctl start ssh -
CentOS / RHEL
Terminal window # 安装服务sudo yum install -y openssh-server# 设置自启sudo systemctl enable sshd# 启动服务sudo systemctl start sshd
4. 权限配置
# 先切换到CI角色su - github-ci# 生成SSH的公钥和私钥chmod 700 ~/.sshssh-keygen -t ed25519# 查看~/.ssh文件夹下有没有authorized_keys文件,如果没有,则创建authorized_keys并赋权touch ~/.ssh/authorized_keyschmod 600 ~/.ssh/authorized_keys# 将公钥(~/.ssh/id_ed25519.pub)的内容添加到 ~/.ssh/authorized_keysgrep "$(cat ~/.ssh/id_ed25519.pub)" ~/.ssh/authorized_keys || cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys5. 安装Nginx服务
先查看服务器有没有安装Nginx
nginx -v如果提示:command not found,则表示未安装Nginx,安装步骤如下:
- Ubuntu / Debian
Terminal window # 安装服务sudo apt updatesudo apt install -y nginx# 设置自启sudo systemctl enable nginx# 启动服务sudo systemctl start nginx - CentOS / RHEL
Terminal window # 安装服务sudo yum install -y nginx# 设置自启sudo systemctl enable nginx# 启动服务sudo systemctl start nginx
验证安装情况:
systemctl status nginx如果显示下列内容,则表示已经安装并启动了Nginx:
github-ci@:~/.ssh$ systemctl status nginx● nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; disabled; vendor preset: enabled) Active: active (running) since Mon 2026-03-23 15:58:11 CST; 1 week 2 days ago Docs: man:nginx(8) Process: 2379804 ExecReload=/usr/sbin/nginx -g daemon on; master_process on; -s reload (code=exited, status=0/SUCCESS) Main PID: 2330136 (nginx) Tasks: 3 (limit: 1834) Memory: 10.2M CPU: 18.277s CGroup: /system.slice/nginx.service ├─2330136 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;" ├─2379805 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" └─2379806 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""6. 配置Nginx
修改Nginx的配置文件
user www-data;worker_processes auto;
events { worker_connections 1024;}
http { server { listen 80; server_name _;
root /var/www/current/dist; index index.html;
location / { try_files $uri $uri/ /index.html; } }}修改完成后,运行检查:
sudo nginx -t如果显示下列内容,则显示配置文件没有问题:
nginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful另外,需要为CI用户添加配置允许无密码执行 nginx reload:
执行:sudo visudo
在文件尾部添加如下内容
github-ci ALL=(ALL) NOPASSWD:/bin/systemctl reload nginx添加完成后键入:ctrl+o
显示 File Name to Write: /etc/sudoers,然后按Enter保存
2. Github上的配置:
根据如下路径配置Github远程登录服务器相关内容:

配置项及描述如下
| 配置项 | 描述 |
|---|---|
| HOST | 服务器的公网IP |
| USER | 1-1中创建的角色名,示例为github-ci |
| SSH_KEY | 1-4中生成的SSH私钥 |
3. 编写deploy.yml
在项目的根目录下,在.github/workflows/下创建deploy.yml,如果没有则创建。
deploy.yml文件内容如下:
name: Astro deployon: push: branches: - main # 这里是分支名称jobs: build: runs-on: ubuntu-latest # 编译运行的平台 steps: # 编译运行的步骤 - name: 拉代码 uses: actions/checkout@v4 - name: Node环境 uses: actions/setup-node@v4 with: node-version: 20 - name: 安装 pnpm uses: pnpm/action-setup@v3 with: version: 9 run_install: false - name: 安装依赖 run: pnpm install --no-frozen-lockfile - name: 构建 run: pnpm build - name: 上传文件 with: host: ${{ secrets.HOST }} username: ${{ secrets.USER }} key: ${{ secrets.SSH_KEY }} source: "dist/" target: "/var/www/releases/${{ github.run_id }}" - name: 部署 with: host: ${{ secrets.HOST }} username: ${{ secrets.USER }} key: ${{ secrets.SSH_KEY }} script: | mkdir -p /var/www/releases/${{ github.run_id }} ln -sfn /var/www/releases/${{ github.run_id }} /var/www/current systemctl reload nginx4. 编写博文
在src/content/post文件夹下,创建一个新的Markdown文件,或者在控制台运行下列命令生成新的文件
pnpm new-post <filename>在其中编写你的博文内容后,将markdown文件commit并push到Github后,在Github中查看编译运行情况:

左侧的Astro Deploy是deploy.yml中的name键的值
点击右侧的Commit Message可以查看这次Push对应的Action详情
这里可以看到每一步操作的日志信息,如果出现错误则进行对应的处理后重新部署
TIP如果你修改了服务器配置或者Github相关配置,没有修改代码但是又需要重新触发CI/CD,你有如下两种方案
- 在Action左侧选择Astro Deploy,在右侧单击最后一次Push,然后在右侧点选
Re-run all jobs
- 你可以通过Commit并Push一次空的提交来触发CI/CD
命令为:git commit --allow-empty -m <commit message>
5. 回滚版本
你可以通过如下的命令将发布的版本回退到指定的版本:
ln -sfn /var/www/releases/旧版本ID /var/www/current这个旧版本ID为github执行CI/CD的run-id
github.run_id 是 GitHub Actions 为每次 workflow run 自动生成的唯一整数 ID,用于区分不同部署版本。
这一项是在deploy.yml中写到的:mkdir -p /var/www/releases/${{ github.run_id }}
在Action中,找到你需要回退到的那一次Push,在详情页面的URL可以找到这次CI/CD对应的run-id

