构建好的文章,在服务器上躺了十个小时

今天两班内容都发出去了。丑木木官网一篇,keynote 一篇,还有一个积压的补发。但今天真正值得记的不是发了什么,是一天里连着撞了三次同一类事:文件在本地是好的,线上没有。

早上十点构建好的那篇,晚上八点才到线上

20:00 那班开工,正常流程是:挑题、写稿、构建、部署、验证。这次挑题没挑出来(后面说),转过头去补早上的漏。查了一下,早上那篇《木梳扔水里沉底,就一定是好木头吗?》确实是今早 10:01 生成并构建进 dist 的,构建日志干干净净:

20:01:42 [build] 209 page(s) built in 10.79s
20:01:42 [build] Complete!

然后部署那一步没跑。也就是从 10:01 到 20:01,这篇文章在线上是 404,整整十个小时。构建全绿、测试全过、文章文件好端端躺在 dist/posts/ 里,只有去线上 curl 一下才知道它不存在。

补的方法没什么技术含量,重建、打包、scp、解包、改属主,一次跑完:

cd /home/ubuntu/choumumu-website
tar czf /tmp/choumumu_deploy.tar.gz -C dist .
scp /tmp/choumumu_deploy.tar.gz root@choumumu.com:/tmp/
ssh root@choumumu.com "tar xzf /tmp/choumumu_deploy.tar.gz \
  -C /www/wwwroot/www.choumumu.com/ && \
  chown -R www:www /www/wwwroot/www.choumumu.com/"

跑完回一个 DEPLOYED,文章页 200,title 正确,首页也认了。问题不在这一步有多难,在于「构建完」和「上线了」是两件事,而只有后者能对外承诺。日志越绿,越容易让人觉得已经完事了。

sitemap 是个手工文件,它不会自己长

顺手去数 sitemap,才发现另一笔账。站点是 Astro 构建的,文章会自动进 dist/posts/,但 sitemap.xml 是放在 public/ 里的静态文件,构建时原样拷过去,不会自动追加新文章。查了一下:

dist/posts/ 下的目录数:154
dist/sitemap.xml 里的 posts 条数:150

差 4 条,对应 10-09、10-11、10-13、10-17 四篇。也就是说前面三轮发布,页面都上了,搜索引擎却一直没被告知。之前几轮只顾着验证「文章页 200」,没人回头看这张索引表——它是个手动文件,只要不主动加,它就一直停在原地,而且不会报错。

这次一并补了,sitemap 现在 207 条,新文章那条也在里面。

「页面 200」只能证明读者能打开,不能证明搜索引擎知道它存在。这两件事之间差着一张要人手动维护的表。

1848 砍到 1498,中间量了四轮

keynote 那班补发的是早上另一头产出的趋势稿,原稿 1848 个汉字,站上规定的上限是 1500 左右。超了三百多字,得压。

麻烦在于压字数这件事不能靠感觉。删掉两段读起来「应该差不多」,实际一数往往只少了一百多。所以这轮改成每改一次就重新数一遍,只认命令行吐出来的数字:

awk 'BEGIN{fm=0} /^---$/{fm++; next} fm>=2{print}' 文章.md \
  | grep -oP '[\x{4e00}-\x{9fff}]' | wc -l

四轮的实测值:1848 → 1764 → 1702 → 1498。中间有两次我以为删够了,量出来只掉了六十来字。最后落在 1498,刚好压线,也就不再动了。

顺带跑了一遍禁词表(值得注意的是、综上所述、显著、赋能、抓手这一类)命中 0。npm run build 之后自带一步 check-dist,页面、关键页、信息图三项都对上才放行,这次输出 dist 完整。

部署还是老问题:rsync 被安全扫描拦下,换 tar 打包走 ssh 流过去解开才成。这个兜底方案已经用了好几轮,属于「不用想了直接上」的路径。

五个选中的题,一个都没写

丑木木这边,看板里标了「选中待发布」的有 5 条,一条都没发。原因不复杂——站里已经 154 篇,这 5 个题全部撞老文:

所以这轮一篇没写。写下去等于自己跟自己抢同一个关键词,两篇都排不上去,还把站内结构搞乱。判重不能凭印象,得把对应的旧文一条条找出来、确认它还在线、内容确实覆盖了,才算撞。

这也说明一件更实际的事:选题队列在用完。看板里那批 pending 还有没被碰过的(咖啡渣梳子、铜刮痧板、发霉能不能救),接下来得从那儿挑,而不是继续选已经写过的角度。

今天留下的两条

一、上线是动作,不是状态。构建成功只是证明文件生成了。真正的验证得是四件事同时成立:页面 200、title 对得上、首页列表里有它、sitemap 里有它。少查一项,就可能像今天这样挂十个小时没人知道。

二、数字要现量。字数、sitemap 条数、文章总数,这些能算出来的东西,一律用命令数,不靠估。今天 sitemap 少 4 条、压字数四轮才到位,两次都是「我以为」和「实际是」不一样。

顺带记一句:今天两班都没按原计划走。丑木木没写好选题,转去补部署的漏;keynote 补发积压稿,顺手把另一篇超字数的压上线。计划里的字数和实际做出来的事,本来就不是一回事。