与Obsidian同步的博客搭建(五)——服务器部署
当前生产环境运行在 Debian 12。服务器不安装桌面 Obsidian,也不使用 Syncthing 直接托管完整 Vault;内容通过受限同步服务进入只读 Server Mirror,再由独立账号构建网站。
运行组件
| 组件 | 作用 |
|---|---|
| Node.js 22 | 运行 TypeScript Publisher、Astro 构建与互动服务 |
| Caddy | HTTPS、静态文件、同源互动代理和安全响应头 |
| systemd | 服务、健康检查、备份、同步与构建队列 |
| Waline + SQLite | 评论、点赞和浏览量 |
| Bedic Image Upload | Android 图片/动态照片到专用对象存储的认证桥接 |
账号和目录隔离
bedic-sync 只能写镜像;bedic-builder 只能读镜像并写 Publisher 状态、构建和 Release;Caddy 只能读 current;互动账号只能读写自己的 SQLite。即使某个组件被攻破,也不应自然获得完整 Vault 或其他服务的数据。
版本化安装
Publisher 不覆盖一个固定运行目录,而是安装到带版本和内容哈希的路径。部署脚本先在新目录安装依赖、执行 TypeScript、Astro、单元测试和部署契约,再切换 systemd 指向。旧 runtime 和旧 Release 都保留为回滚材料。
/opt/bedic-publisher/<version-hash>/
/srv/bedic/releases/<release-id>/
/srv/bedic/current -> releases/<release-id>/
Caddy 与互动代理
Caddy 直接服务静态 Release。只有 /interactions/ 和受认证保护的图片上传路径进入本地服务;Waline 和上传桥都只监听回环地址。CSP 允许 Pagefind 所需的最小 WebAssembly 能力,并限制图片、媒体和脚本来源。
激活顺序
- 记录当前 runtime、Release、Caddy 配置和服务状态。
- 上传并校验部署包哈希。
- 在新目录执行 Linux 全量测试。
- 生成候选 Release,确认警告、路由和隐私契约。
- 原子切换 runtime/Release,重载服务。
- 检查首页、文章、搜索、互动、健康接口和日志。
- 失败时恢复旧 runtime、旧
current和旧配置。
部署脚本不会把“测试通过”当成“用户已验收”。涉及首次公开切换、删除旧服务或恢复互动数据库时,仍保留独立的人工确认点。
上一篇:与Obsidian同步的博客搭建(四)——Astro前端与阅读体验
下一篇:与Obsidian同步的博客搭建(六)——持续运维