全站的生死线:
python3 build_site.py一条命令从源文件重建整站(含 68 部展品重新加密),wrangler pages deploy一条命令上站,三路 SHA 验收。构建不过就拒绝产出——坏构建永远到不了线上。
构建流水线
manifest.json(单一事实源:展品/文集/双语对照)
↓ 结构校验(中英 shape 一致,不一致拒绝构建)
├─ md2html:文库 md 母本 → 确定性再生 HTML(悬空内链即失败)
│ └─ /library/ 大门(集合网格 + 统计 + 搜索框)也在此生成
├─ storefront:展品分流——free 原样拷贝(注入 OG 与片头)
│ paid 全部 HTML → AES-256-GCM 加密 → payload.js + 锁页
├─ 静态页:services / about / search 复制进 dist 根
├─ 搜索索引:全站标题+摘要 → search/index.json(构建时生成)
└─ robots.txt + sitemap.xml
确定性是设计出来的:同一份源永远产出同一份站——加密有随机 IV 但按内容指纹版本化(?v=),缓存指纹保证换钥全端即刻失效。
加密体系(68 部付费)
- 每部一个访问码:PBKDF2 200k 轮 → AES-256-GCM 加密整页明文 → 密文上站
- 管理员主密码:全部单码打包再加密成 master-key.js——一钥开全站
- 服务器上永远没有明文;解密发生在访客浏览器里
- 换码 SOP:改码表 → 重跑构建(指纹自动变)→ 部署——旧钥即刻作废
部署与验收
部署 7 秒完成,但验收才是重点:
- 三路 SHA——apex、www、pages.dev 三域名抽样对拍,逐字节一致才算过
- 缓存陷阱——图片有 4 小时边缘缓存,裸 URL 首查可能是旧值;
?cb=复查后才下结论 - 付费链路抽验——payload.js 存在且是密文、锁页正常、(换钥时)新钥能解开 68 码而旧钥被 GCM 拒绝
方法学沉淀
「构建即验证」——所有检查(结构校验、悬空链接、加密对拍)长在构建里而不是靠人想起来再跑:能自动化的验收就不是验收,是构建的一部分。
部署便宜、验收贵——wrangler 七秒,验收要做三路 SHA、抽样、链路测试;省验收的每一分钟都在给线上埋雷。