Push 自动部署搭好了
写完这篇文章,我会在终端跑 git push。
然后什么都不用做。两分钟后 hywang.me 上就能看到这篇。
怎么实现的
GitHub Actions 接到 push origin main 事件后:
- 跑全部测试(
go test -race)+go vet - 交叉编译 Linux x86_64 二进制(
CGO_ENABLED=0,静态链接) - 用专门的 deploy SSH key 把二进制 scp 到 VPS
- rsync 静态资源、模板、博客内容
- install +
systemctl restart hywang - 通过
/healthendpoint 的 git SHA 验证新版本真的在跑 - 跑 smoke test 验证公网 OK
整个流程 2-3 分钟。任何一步失败,整个 deploy 中止——hywang 仍是旧版,不会有半上线状态。
一个意外的小坑
第一次跑 smoke test 时,所有需要"穿过 Cloudflare"的请求都返回 HTTP 403。
原因是 Cloudflare 的反爬虫策略把 GitHub Actions runner 的 IP 段判定为可疑流量。改了 workflow——smoke test 不在 GHA runner 上跑,而是 SSH 进 VPS 让 VPS 自己 curl 公网 URL。VPS 的 user-agent 干净、IP 不在黑名单,畅通。
这也意外地让 smoke test 更"端到端"了:访问者 → Cloudflare → VPS 上的 caddy → hywang,整条链路都被覆盖。
为什么这事值得做
写博客是个低投入活动。如果每发一篇都要 make deploy 等几十秒、SSH 看日志,这点摩擦累积起来会让我不想写。Push 一下就完事 = 写作时唯一摩擦是"想写什么"。
而且 push-to-deploy 不是炫技。等以后给站加私人区(加密、auth、TOTP),改完测完 push 就上线的循环是必需的。先把这条路打通,等我做大特性时不用临时拼自动化。
接下来
剩下的运维项:
- 每天自动备份到 Backblaze B2(age 加密 + rclone)
- 灾备演练:在新机器上从 B2 恢复一次,实测 RTO
然后整个"上线 + 自动化"阶段就算真的完工。