为了避免在服务器上维护常驻服务,把扫描、构建、搜索索引、打包和上线检查都收回本地。
blog-platform/static-publish-workflow
这次改造博客平台,我先定下一个不太宽松的范围:服务器只负责托管静态文件,不长期跑 Node,不加数据库,不做一个看起来很完整但以后没人维护的后台。
这个取舍看起来保守,但对个人博客反而合适。博客不是业务后台,发布频率也不高。麻烦主要在内容整理:项目回看、实验报告和课程笔记里的材料,哪些能公开,哪些要删掉,都得先处理好。
所以这次没有把平台继续做重,而是把复杂度留在本地,线上只放构建好的静态目录。
目标
我希望博客至少满足五件事:
- 文章别只堆在归档页,要有“项目 / 实验 / 课程”三个入口。
- 长文封面要有统一规范,首页卡片不能忽高忽低。
- 评论和统计要能打开,但默认不绑定某个服务。
- 发布前必须跑安全扫描和构建检查。
- 一条命令完成构建、Pagefind 索引、打包、可选上传和线上校验。
这五件事听起来不像“美化”,更像工程卫生。我后来先处理入口、卡片高度、草稿隔离和发布闸门,再去碰动效。
最后方案仍然是 Astro/Fuwari 静态站,只在它上面补我用得上的发布流程。
专栏入口
原来的结构太像一个文件夹:所有东西最后都进归档。归档适合查全量,但不适合让第一次来的人理解这个博客到底在写什么。
我加了三个轻量专栏:
- 项目:代码、部署、工具链和工程回看。
- 实验:电路、仿真、测量和报告生产过程。
- 课程:课程复习、考试整理和知识卡片。
文章可以显式写:
column: "projects"如果旧文章没有 column 字段,就按分类和标签做回退匹配。这样不用一次性迁移所有旧内容,后面写新文章也不会再犹豫“这篇到底放哪”。
这个设计还有一个好处:我的博客内容本来就不是一种东西。代码发布、实验回看、课程整理混在一起没问题,但入口必须分开。
封面规范
首页卡片要整齐,最重要的是固定比例。长文没有封面,或者封面比例乱飞,首页很快就会像临时拼出来的资料夹。
于是我把文章卡片和正文封面都固定到 16:9。
封面检查脚本只对长文强制:
- 必须有本地封面图。
- 图片要和文章放在一起,不用远程图。
- 单张封面不超过 5 MB。
- 最小尺寸 900x500。
漫画页这种竖图不强行拦截,只给 warning。原因很简单:漫画本来就是竖版内容,短期为了卡片比例把整批图重做,收益不高。最后要不要重制封面,留到内容打磨阶段再决定。
评论和统计
评论用 Giscus,但不把仓库 ID 写死在代码里。配置放在环境变量里:
PUBLIC_GISCUS_ENABLE=truePUBLIC_GISCUS_REPO=owner/repoPUBLIC_GISCUS_REPO_ID=PUBLIC_GISCUS_CATEGORY=AnnouncementsPUBLIC_GISCUS_CATEGORY_ID=统计保留 Busuanzi 做轻量展示,同时预留 Plausible 和 Umami。两者都是静态脚本,不需要我在博客服务器上再跑一个统计服务。
这样我就不用在没配评论和统计的时候改代码。站点照常构建,哪天把环境变量补齐,页面再自动加载对应脚本。
也就是说,这些东西可以慢慢接,不该卡住每次发文章。
一键发布
发布脚本做了这条链:
safety scan -> cover check -> astro check -> type-check -> build -> pagefind -> package -> optional upload -> online verify本地没有上传目标时,脚本只生成压缩包;有部署目标时再上传,并校验线上首页。
这样写主要是避免发布前漏掉检查,少敲几条命令只是顺带的。
博客内容会从项目回看、课程材料和实验报告里来。这里面有些东西可以公开,有些东西绝对不该进网页。靠发布前临时想起“我是不是该扫一下”,迟早会出问题。所以安全扫描、封面检查、生产草稿泄漏检查,都必须固定进流程。
当前取舍
这次没有做后台编辑器,也没有做服务端搜索,更没有把自动写作接成无人值守发布。
原因很现实:
- 小服务器适合静态文件,不适合堆常驻服务。
- 内容来自项目、实验和课程材料,公开前需要人审。
- Pagefind 已经够用,中文分词不是完美,但能覆盖标题和正文检索。
博客平台现在最缺的是稳定的写作入口和发布前检查。后台、服务端搜索这些先放后面。
重系统当然也能做,但对我现在的目标来说,它解决的是另一个问题。我现在更关心的是:材料很多,怎么先筛干净,再稳定地发出去,并且以后还能搜得到。
下一步
接下来我会把“候选素材扫描 -> 草稿生成 -> 本地预览 -> 人工决定保留/删除”的流程继续往前挪。以后项目收尾时,博客也能顺手接住一部分复盘材料。
但最后的发布按钮仍然应该留给人。
脚本可以多做一点脏活,但哪些内容能公开、哪些内容应该删掉,还是得我自己最后看一遍。
继续读