今天在 VPS 上做了一系列操作,踩了几个坑。记录下来,下次不要再犯。Claude 有个好习惯——它会总结每次对话中学到的教训。我想我也可以。
坑1:部署路径想当然
场景:Hugo 构建完,rsync 到 /usr/share/nginx/html/,然后 curl https://aipulse.lol/ 一看,日期还是不带秒的旧版本。
原因:我默认以为 nginx root 是 /usr/share/nginx/html/(AlmaLinux 默认),但实际上 aipulse.lol 的 nginx config 在 /etc/nginx/conf.d/aitracker.conf 里写着:
root /var/www/aitracker;
教训:部署前先 grep -r "root\|server_name" /etc/nginx/conf.d/ 确认目标路径,别靠肌肉记忆。
坑2:Git push 之前不 pull
场景:两个仓库都有未提交改动。aipulse 顺利 push 了,miniagent 却被 reject:
! [rejected] main -> main (fetch first)
然后 rebase 过程中 agent.py 起了冲突,两个地方各有两个冲突块。
教训:push 之前先 git fetch && git status。如果远程有新提交,先 git pull --rebase。
另外:rebase 时别用默认 editor(vi 没装),用 GIT_EDITOR=true git rebase --continue。
坑3:日期 frontmatter 格式不统一
场景:要求「时间精确到秒,按时间倒序排列」。大部分文章的 date 字段已经有秒和时区:
date: '2026-06-23T04:21:41+08:00'
但有两篇文章只有日期:
date: 2026-06-22
Hugo 对这种格式默认解析为 00:00:00 UTC,时间戳就不对了。
教训:所有 frontmatter 的 date 统一用 ISO 8601 带时区:YYYY-MM-DDTHH:MM:SS+08:00。单引号括起来防止 YAML 解析问题。
坑4:验证部署结果不充分
场景:本地 hugo --minify 构建完,cat public/index.html 看到秒数了,就觉得没问题了。但线上 curl 出来的结果不对。
原因:rsync 到了错误路径。我应该先 curl 测试,再宣告完成。
教训:改完后必须用 curl -sk https://域名/ | grep 关键内容 验证线上生效,而不是只看本地文件。
总结:AI Agent 自己的 Checklist
如果我要做一个 Agent 来自动化这些操作,它应该内置这些检查:
| 步骤 | 检查 |
|---|---|
| 部署前 | grep root /etc/nginx/conf.d/*.conf 确认目标路径 |
| 推送前 | git fetch && git diff --stat origin/main...HEAD |
| 文章日期 | 所有 .md 的 date 字段格式需一致 |
| 部署后 | curl -sk https://$DOMAIN/ | grep 预期内容 |
这些不是多高的技术问题,但每次都要花时间排查。写成 checklist,省心。
2026-06-23,于 AlmaLinux VPS