GitHub Actions 自动部署博客到 Nginx 云服务器

在这篇文章中,我们将详细介绍如何使用 GitHub Actions 将博客自动部署到一台使用 Nginx 的Centos云服务器上,配合 scp-action 实现无缝推送构建后的静态页面。

一、准备工作

1. 创建专用部署用户(deploy)

在服务器上运行以下命令创建用户:

1
2
3
4
sudo adduser deploy

# 可选:设置密码(用于登录)
sudo passwd deploy

如果部署脚本中需要重启 Nginx,也可以添加 sudo 权限:

1
sudo usermod -aG wheel deploy

注意:为安全起见,不建议直接让 deploy 拥有 sudo 权限,除非必须


2. 配置 SSH 公钥认证

生成密钥对(在本地)

1
ssh-keygen -t rsa -b 4096 -C "[email protected]"

会生成两个文件:

  • 私钥:~/.ssh/id_rsa
  • 公钥:~/.ssh/id_rsa.pub

上传公钥到服务器

1
ssh-copy-id -i ~/.ssh/id_rsa.pub deploy@your_server_ip

或者手动将 id_rsa.pub 内容添加到服务器的:

1
/home/deploy/.ssh/authorized_keys

3. 配置博客部署目录

例如目标目录为:

1
/opt/myapps/blog/nginx/public

确保该目录存在并属于 deploy 用户:

1
2
sudo mkdir -p /opt/myapps/blog/nginx/public
sudo chown -R deploy:deploy /opt/myapps/blog/nginx

二、配置 GitHub Secrets

进入你的 GitHub 仓库:

  • Settings → Secrets and variables → Actions → Repository secrets

添加以下 Secret:

名称 说明
HOST 服务器 IP
USERNAME 部署用户(如 deploy)
SSH_KEY 本地生成的 id_rsa 私钥内容

🔐 注意:私钥必须包括完整的头尾标志:

1
2
3
-----BEGIN OPENSSH PRIVATE KEY-----
...
-----END OPENSSH PRIVATE KEY-----

三、编写 GitHub Actions workflow 文件

在项目根目录新建 .github/workflows/deploy.yml 文件:

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
name: Deploy to Server

on:
push:
branches:
- main

jobs:
deploy:
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v3

- name: Install Hexo and dependencies
run: |
npm install
npm install -g hexo-cli

- name: Build Hexo site
run: |
hexo clean
hexo generate

- name: Deploy via SCP
uses: appleboy/[email protected]
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.SSH_KEY }}
source: "public/**"
target: "/opt/myapps/blog/nginx"

四、常见问题排查

1. 报错 ssh: no key foundhandshake failed

说明 GitHub Secrets 中没有正确配置 SSH 私钥,请检查:

  • 是否填入了 id_rsa(私钥内容)
  • 是否保留了 BEGINEND 标志
  • 是否与服务器上的公钥配对

2. 目录权限不足

请确保目标路径由 deploy 用户拥有:

1
sudo chown -R deploy:deploy /opt/myapps/blog/nginx

或者使用组方式共享权限。


五、(可选)部署后重载 Nginx

如果你需要自动刷新 nginx,可在 Actions 中添加一步:

1
2
3
4
5
6
7
8
- name: Reload Nginx
uses: appleboy/[email protected]
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.SSH_KEY }}
script: |
sudo systemctl reload nginx

前提:deploy 用户具有 sudo 权限并允许无密码执行 systemctl reload nginx


通过以上配置,我们成功实现了基于 GitHub Actions 的自动部署工作流,配合 CentOS 云服务器、博客以及 Nginx,搭建了高效的博客自动化发布体系。

如果你还有进一步需求,比如同步多个站点、部署通知、HTTPS 自动配置等,可以继续在 workflow 中拓展更多步骤。


GitHub Actions 自动部署博客到 Nginx 云服务器
http://eevann.cn/2024/09/24/github-nginx/
作者
月下独白
发布于
2024年9月25日
许可协议