使用GitHub Actions自动部署Hugo博客到远程服务器

在Hugo博客全部内容都准备好之后,可以将博客部署到远程服务器上。本文介绍如何使用 GitHub Actions 自动化部署 Hugo 博客到远程服务器。

为了安全起见,不建议使用密码登录远程服务器。相反,可以使用 SSH 密钥登录。在远程服务器上创建一个新用户,为该用户生成 SSH 密钥,并配置 GitHub Actions 使用该密钥登录到远程服务器并部署 Hugo 博客。

在本地生成 SSH 密钥对

本地生成的SSH密钥对,用于新用户登录到远程服务器。在本地生成SSH密钥对:

1
ssh-keygen -t rsa -b 4096 -C "blog@zair.top"

按提示操作,设置文件保存路径(设置为 ~/.ssh/github-blog-deploy)和密码短语(可以为空)。

生成的文件包括:

  • 公钥文件:github-blog-deploy.pub
  • 私钥文件:github-blog-deploy

在远程服务器上配置新用户的 SSH 公钥

  1. 登录到远程服务器

    1
    
    ssh root@SSH_IP -p SSH_PORT 
  2. 创建新用户

    1
    
    sudo adduser deployuser
  3. 为新用户配置 SSH 登录

    1
    2
    3
    4
    5
    
    sudo mkdir /home/deployuser/.ssh
    sudo chmod 700 /home/deployuser/.ssh
    sudo touch /home/deployuser/.ssh/authorized_keys
    sudo chmod 600 /home/deployuser/.ssh/authorized_keys
    sudo chown -R deployuser:deployuser /home/deployuser/.ssh
  4. 将本地生成的公钥复制到远程服务器

    github-blog-deploy.pub 文件的内容添加到 /home/deployuser/.ssh/authorized_keys 文件中:

    1
    
    cat ~/.ssh/github-blog-deploy.pub | ssh root@SSH_IP -p SSH_PORT  'cat >> /home/deployuser/.ssh/authorized_keys'

    或者手动复制公钥内容并粘贴到 authorized_keys 文件中:

    1
    
    sudo nano /home/deployuser/.ssh/authorized_keys

    粘贴 github-blog-deploy.pub 文件的内容并保存。

  5. 设置新用户的目录权限: 创建网站部署目录并设置权限:

    1
    
    sudo chown -R deployuser:deployuser /var/www/public

更新 GitHub Actions 配置文件

  1. 将私钥添加到 GitHub Secrets

    • 登录 GitHub,进入Hugo博客所在仓库。
    • 依次点击 Settings -> Secrets and variables -> Actions -> New repository secret
    • 添加新的 Secret, SSH_PRIVATE_KEY,值为 github-blog-deploy 文件的内容(私钥)。按照实际情况添加 SSH_PRIVATE_KEYSSH_IPSSH_PORT 三个 Secrets。
  2. 更新 GitHub Actions 配置文件

添加文件内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
name: Deploy Hugo Site

on:
  push:
    branches:
      - main

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v2
        with:
          submodules: true  # This ensures submodules are cloned

      - name: Set up Hugo
        uses: peaceiris/actions-hugo@v2
        with:
          hugo-version: 'latest'
          extended: true  # Ensure the extended version is used

      - name: Build Hugo site
        run: hugo --minify

      - name: Deploy to remote server
        env:
          SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
          SSH_IP: ${{ secrets.SSH_IP }}
          SSH_PORT: ${{ secrets.SSH_PORT }}
        run: |
          set -x  # Enable debugging
          mkdir -p ~/.ssh
          echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
          chmod 600 ~/.ssh/id_rsa
          # Add debugging information to help diagnose ssh-keyscan issues
          ssh-keyscan -p $SSH_PORT $SSH_IP || true  # Continue even if ssh-keyscan fails
          ssh-keyscan -p $SSH_PORT $SSH_IP >> ~/.ssh/known_hosts
          ssh -o StrictHostKeyChecking=no -p $SSH_PORT deployuser@$SSH_IP "mkdir -p /var/www/public"
          rsync -avz -e "ssh -p $SSH_PORT" ./public/ deployuser@$SSH_IP:/var/www/public          
Buy me a coffee~
Tim 支付宝支付宝
Tim 贝宝贝宝
Tim 微信微信
0%