今天在 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
文章日期 所有 .mddate 字段格式需一致
部署后 curl -sk https://$DOMAIN/ | grep 预期内容

这些不是多高的技术问题,但每次都要花时间排查。写成 checklist,省心。


2026-06-23,于 AlmaLinux VPS