Bedic 全文索引

搜索公开内容

项目PROJECT

与Obsidian同步的博客搭建(三)——不可变 Release 与交互服务

把编译产物构建成不可变静态 Release,并让搜索、评论、点赞和浏览量保持彼此隔离。

更新
阅读
2 分钟

与Obsidian同步的博客搭建(三)——不可变 Release 与交互服务

通过公开边界的内容不会直接写入正在服务的目录。每次变化先进入独立候选目录,完成 Astro、Pagefind、链接、隐私和冒烟测试后,才会成为一个不可变 Release。

Release 目录

/srv/bedic/
├── mirror/             # 同步镜像,只作为输入
├── publisher-state/    # 已发布修订与清单
├── build/              # 可随时丢弃的候选构建
├── releases/           # 成功构建,按 release-id 保存
└── current -> releases/<release-id>/

Caddy 只读取 current。激活新版本只是原子切换符号链接;候选构建失败时不会碰它。回滚同样只是把 current 指回上一份已验证 Release,不需要重新编译旧内容。

Astro 和 Pagefind 的边界

Astro 只接收编译器生成的站点数据,不读取 Vault,也不参与“能不能公开”的判断。它输出纯静态 HTML、RSS、Atom、sitemap、404/410 页面和前端资源。

Pagefind 在 HTML 完成后生成静态搜索索引。只有 Blog、Wiki、Project 和 Daily 进入索引;临时分享没有搜索、站点地图、订阅、关联内容或互动请求。

互动数据为什么独立

评论、点赞和浏览量会变化,不能放进不可变 Release。当前使用自托管 Waline 与 SQLite:

  • 只通过 Caddy 的同源 /interactions/ 路径访问;
  • 服务绑定回环地址,不能读取镜像或 Release;
  • 评论默认审核,并限制连续提交;
  • 数据库单独备份、校验和恢复;
  • Waline 停止时,静态文章和搜索仍然可用。

文章路由是互动线程的稳定键,因此 slug 不应随标题变化。取消发布只让页面从下一份 Release 消失,不会偷偷删除互动数据库;以后以同一路由重新发布时,旧线程仍可恢复。

健康检查与无变化构建

同步事件不等于一定产生新版本。若公开修订没有变化,Publisher 返回 noop,不会制造空 Release。真正激活后,健康文件会记录 release-id、创建时间、内容数量和编译器版本,方便 Caddy、systemd 和运维脚本判断当前状态。

这套结构把内容、呈现和互动拆开:内容发布失败不影响旧页面,互动失败不影响阅读,前端改版也不需要改变 Vault 的隐私语义。

上一篇:与Obsidian同步的博客搭建(二)——内容编译与发布边界
下一篇:与Obsidian同步的博客搭建(四)——Astro前端与阅读体验

RESPONSE DESK / 读者来信

继续这场讨论

浏览 评论

指出疏漏、补充案例,或留下你在实践中遇到的新问题。

评论区将在接近此处时加载。