Architecture Review · 2026-10-28

每日阅读幻灯片 · 发布链路架构

https://reading.opensourceway.blog / 源在本地,构建在本地,只把成品推上去
Source

① 数据源(本地 · 腾讯云)

日读 markdown
markdown-to-slides/daily-reading/YYYY-MM/YYYY-MM-DD.md
每天一篇,含 Slide 0–N、视觉隐喻、要点、书摘、追问
配图 PNG
ppt_decks/日读_日期_时间戳/images/
SenseNova u1.5-lite 生成,按 slide 序号命名
cron 01:00 生成配图 / 手动或定时发布
Build

② 构建(本地 · 只产出成品,不产出中间态)

render-deck.py
markdown → 单文件 HTML
解析 Slide N / 提取要点·书摘·追问 / 内联 CSS
无 CDN、无外部依赖,断网可看
publish-deck.py
编排:调 render-deck → 整理产物 → rsync → 重建索引
每期独立目录,图片就近放 images/
rsync over SSH · 只推变更
Ship

③ 传输(rsync over SSH — 不是挂载)

为什么不用 rclone / sshfs 挂载
发布是单向动作。挂载把远端伪装成本地磁盘,换来三个代价:断线 hang、删除会取消上传、跨网络逐文件 stat。实测 onedrive 写入 1.5MB/s;far 的 488MB/s 是写缓存假象(删文件时上传被 cancel)。
rsync 三条硬约束
① --chmod=D755,F644:SenseNova 产出的 PNG 是 600,nginx 以 www 用户读不到 → 403
② --delete 只作用于当期目录内部
③ 幂等:重发同一期直接覆盖
SSH · 8.211.12.147
Serve

④ 服务(8.211.12.147 · 阿里云 eu-central-1)

静态根目录
/www/wwwroot/slides/
YYYY-MM-DD/deck.html + images/ + index.html
nginx 1.26.2(宝塔)
独立配置 slides.conf
不碰宝塔默认站点(已停用其 wordpress 默认站,避免 default_server 冲突)
HTML 不缓存 / 图片 30d immutable
TLS · 已上线
Let's Encrypt 证书(有效期至 2027-01-26)
HTTP-01 走 /.well-known/acme-challenge/
TLSv1.2/1.3 / HSTS / certbot 自动续期
HTTPS / DNS: reading → 8.211.12.147(GoDaddy)
View

⑤ 访问

https://reading.opensourceway.blog/
索引页:按日期倒序列出所有已发布 deck
https://reading.opensourceway.blog/YYYY-MM-DD/
单期幻灯片:图文对照,长页滚动
IP 直连(保留作调试)
http://8.211.12.147/
不走证书,便于排障

边界与失败面

本地是唯一事实源。远端只放成品,任何一期都能从 markdown + PNG 重新生成。远端磁盘满或机器挂掉,不损失原始数据。

与主站的关系

完全独立。opensourceway.blog 主站在 GitHub Pages(185.199.x),这里是自有服务器,两者无耦合。主站挂了不影响这边,反之亦然。

上线状态

① 安全组 443 已放行
② DNS reading → 8.211.12.147 已生效
③ Let's Encrypt 证书已签发,有效期至 2027-01-26,自动续期

关键环节 数据/存储 构建 传输 服务