此流程的核心是:当博客仓库有更新时,触发一个 GitHub Action,这个 Action 会通过 SSH 安全地连接到云服务器,并使用 rsync
命令将最新的静态文件同步到 Nginx 的网站根目录。
整体流程概览#
服务器端准备:在云服务器上创建一个专门用于部署的低权限用户,并设置好 SSH 密钥认证和网站目录。
GitHub 仓库配置:在源码仓库的
Settings
->Secrets
中添加连接服务器所需的 SSH 密钥和服务器信息。创建 GitHub Actions 工作流:编写一个
.yml
文件,定义当代码push
时,自动连接服务器并同步文件的所有步骤。配置 Nginx:确保 Nginx 正确配置,以指向存放博客文件的目录。
云服务器准备#
强烈建议不要直接使用 root
用户进行部署。创建一个专用的部署用户可以最大程度地降低安全风险。
创建部署用户#
通过 SSH 登录云服务器,执行以下命令创建一个名为 deployer
的用户。
# 创建用户
sudo useradd -m -s /bin/bash deployer
# 为该用户设置一个密码(设置一个易于记忆的密码,不用担心后续的安全问题,SSH 禁用密码登陆即可)
sudo passwd deployer
配置 SSH 密钥登录 (关键步骤)#
为 GitHub Actions 生成一个专用的 SSH 密钥,让它可以通过这个密钥免密登录 deployer
用户。
# 切换到 deployer 用户
sudo su - deployer
# 在 deployer 的主目录下创建 .ssh 文件夹
mkdir ~/.ssh
chmod 700 ~/.ssh
# 创建一个空的 authorized_keys 文件,用于存放公钥
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
现在,不要关闭这个服务器终端。在本地电脑(这里以 Linux 环境为例,Windows 可参考:创建 SSH 密钥对 | Microsoft Learn)上打开一个新的终端,生成一个 SSH 密钥对:
# 这会在你本地生成 deploy_key (私钥) 和 deploy_key.pub (公钥) 两个文件
ssh-keygen -t rsa -b 4096 -C "GitHub Actions Deploy Key" -f deploy_key
生成后,复制公钥 (deploy_key.pub
) 的内容,回到服务器终端,将其粘贴到 authorized_keys
文件中:
# 在服务器上执行,用你喜欢的编辑器(如 nano 或 vim)打开文件
nano ~/.ssh/authorized_keys
# 将刚才复制的公钥内容粘贴进去,保存并退出。
最后,将私钥 (deploy_key
) 的内容从本地电脑复制出来,下一步会用到。
分配目录权限 让 deployer
用户有权限写入这个目录。
# 将目录的所有权交给 deployer 用户
sudo chown -R deployer:deployer /var/www/my-hugo-blog
现在,服务器端的准备工作已经完成。你可以输入 exit
退回到 root
或你的主用户。
配置 GitHub 仓库 Secrets#
在博客源码仓库中进行以下操作:进入仓库主页,点击 Settings
→ Secrets and variables
→ Actions
,点击 New repository secret
,添加以下 4 个 Secret:
DEPLOY_HOST
:云服务器的 IP 地址 或 域名。DEPLOY_USER
:deployer
(在第一步中创建的用户名)。DEPLOY_KEY
:将在本地电脑上生成的私钥 (deploy_key
文件) 的全部内容复制并粘贴进来。内容应以-----BEGIN OPENSSH PRIVATE KEY-----
开头。DEPLOY_TARGET
:/var/www/my-hugo-blog
(网站根目录)。DEPLOY_PORT
:SSH 端口
创建 GitHub Actions 工作流#
在博客源码仓库中,创建文件 .github/workflows/deploy-to-server.yml
,并粘贴以下内容:
# deploy-to-server.yml
name: Deploy to Cloud Server
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
# 步骤一:检出代码
- name: Checkout Code
uses: actions/checkout@v4
# 步骤二:设置 SSH 环境
# 这个 Action 的作用是把你的私钥加载到 SSH Agent 中,以便后续的 ssh 和 rsync 命令使用
- name: Setup SSH Agent
uses: webfactory/ssh-agent@v0.9.0
with:
ssh-private-key: ${{ secrets.DEPLOY_KEY }}
# 步骤三:使用 rsync 进行部署
- name: Deploy with rsync
run: |
rsync -avz --delete \
-e "ssh -p ${{ secrets.DEPLOY_PORT }} -o StrictHostKeyChecking=no" \
./ \
${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }}:${{ secrets.DEPLOY_TARGET }}
将这个文件 commit
和 push
到源码仓库后,自动部署流程就正式生效了。