跳过正文

使用 GitHub Actions 部署博客到服务器

·1230 字·3 分钟
目录

此流程的核心是:当博客仓库有更新时,触发一个 GitHub Action,这个 Action 会通过 SSH 安全地连接到云服务器,并使用 rsync 命令将最新的静态文件同步到 Nginx 的网站根目录。

整体流程概览
#

  1. 服务器端准备:在云服务器上创建一个专门用于部署的低权限用户,并设置好 SSH 密钥认证和网站目录。

  2. GitHub 仓库配置:在源码仓库的 Settings -> Secrets 中添加连接服务器所需的 SSH 密钥和服务器信息。

  3. 创建 GitHub Actions 工作流:编写一个 .yml 文件,定义当代码 push 时,自动连接服务器并同步文件的所有步骤。

  4. 配置 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
#

在博客源码仓库中进行以下操作:进入仓库主页,点击 SettingsSecrets and variablesActions,点击 New repository secret,添加以下 4 个 Secret:

  • DEPLOY_HOST:云服务器的 IP 地址域名

  • DEPLOY_USERdeployer (在第一步中创建的用户名)。

  • 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 }}

将这个文件 commitpush 到源码仓库后,自动部署流程就正式生效了。

duan
作者
duan
愿世界和平