用 GitHub Actions 自动部署 Hugo(VPS)

从 0 到 1 配置 GitHub Actions,自动构建 Hugo 并发布到 VPS。
前言
把 Hugo 站点交给 GitHub Actions 进行构建与部署,可以实现「写完推送即发布」。本文以 VPS 为目标部署环境,介绍完整流程与常见问题排查。
1. 快速开始
1.1 VPS 静态目录
将站点部署目录设置为 /var/www/neonflow/,Nginx 仅监听本机端口(如 1313),由 Nginx Proxy Manager 反代。
| |
1.2 生成部署专用 SSH Key
在 VPS(root)上生成专用 key,并加入 authorized_keys:
| |
将 /root/.ssh/deploy_key 私钥保存,用于 GitHub Secrets。
1.3 配置 GitHub Secrets
在仓库 Settings → Secrets and variables → Actions 添加:
VPS_HOST:VPS IP/域名VPS_USER:rootVPS_SSH_PORT:22VPS_SSH_KEY:部署私钥全文
2. GitHub Actions 工作流
在仓库创建 .github/workflows/deploy.yml:
| |
3. 发布与验证
推送到 main 后,Actions 会自动构建并同步到 VPS。验证源站:
| |
域名访问成功即表示部署完成。
4. 常见问题
- 502:反代目标 IP/端口不可达,容器内需能访问宿主机端口。
- 403:
root目录错误或权限不足。 - 未更新:检查 Secrets 与
remote_path设置。
5. Nginx Proxy Manager(NPM)常见坑与解决
5.1 端口 80 被占用导致 Nginx 启动失败
现象:bind() to 0.0.0.0:80 failed (98: Address already in use)
原因:NPM 使用容器占用了 80/443。
解决:源站 Nginx 只监听本机端口(如 1313/8080),不要监听 80/443。
| |
5.2 NPM 反代 502(容器访问不到宿主机)
现象:域名访问 502,但本机 curl http://127.0.0.1:1313 正常。
原因:在容器里 127.0.0.1 指向容器自身。
解决:NPM 的 Forward Host/IP 改为宿主机网桥 IP(常见 172.17.0.1),并确保源站监听 0.0.0.0:1313 或内网 IP。
容器内验证:
| |
5.3 403 Forbidden(目录无 index)
现象:directory index of "/var/www/neonflow/" is forbidden
原因:root 指向目录但找不到 index.html,或权限不足。
解决:确认 root 指向 Hugo 生成目录,并修正权限。
| |