Push 自动部署搭好了

写完这篇文章,我会在终端跑 git push

然后什么都不用做。两分钟后 hywang.me 上就能看到这篇。

怎么实现的

GitHub Actions 接到 push origin main 事件后:

  1. 跑全部测试(go test -race)+ go vet
  2. 交叉编译 Linux x86_64 二进制(CGO_ENABLED=0,静态链接)
  3. 用专门的 deploy SSH key 把二进制 scp 到 VPS
  4. rsync 静态资源、模板、博客内容
  5. install + systemctl restart hywang
  6. 通过 /health endpoint 的 git SHA 验证新版本真的在跑
  7. 跑 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

然后整个"上线 + 自动化"阶段就算真的完工。