active / System Design Archive

Runtime Architecture

MyBlog 的数据层不是单一数据库,也不是网盘目录展示,而是 GitHub、OpenList、MySQL 和浏览器缓存各司其职的混合运行时。

OpenList Content Control PlaneSyncthing Hot MirrorGitHub Content LayerMySQL Runtime LayerStatic Astro Frontend
Inspiration

借鉴对象

  • Obsidian vault
  • Syncthing
  • Readwise Reader
  • GitHub history
  • Plex media library
Rejected

拒绝的方案

  • 把 EPUB/PDF/图片塞进 MySQL BLOB,因为文件系统和对象存储更适合大文件。
  • 把高亮和阅读进度放在 OpenList,因为文件层不能表达动态关系和查询。
  • 继续让 localStorage 做真源,因为多设备、搜索、Graph 和统计都需要服务端状态层。
  • 让 MyBlog 自己手工同步 Obsidian data/image,因为 Vault 文件同步应由成熟的 Syncthing / Obsidian Sync 层负责。
Runtime

运行方式

  • Syncthing 当前负责完整 Vault 文件同步:E:\Vaults\Obsidian 是唯一可编辑 authoring truth,/home/vault/Obsidian 是 Linux runtime hot mirror,docs、image、.obsidian、canvas、PDF 和附件作为同一个 Vault 对待。
  • OpenList 不再作为 Obsidian 写作同步入口;/夸克网盘/obsidian 是 retired legacy。当前热路径是 E:\Vaults\Obsidian -> Syncthing -> /home/vault/Obsidian;公开内容入口是 /openlist/Obsidian/...。
  • 服务器 OpenList 本地挂载必须保持 /Obsidian -> /home/vault/Obsidian;admin-next OPENLIST_PUBLIC_ROOTS 必须保持 /Obsidian,/腾讯云COS,/夸克网盘。禁止重新引入 /Vault 作为 active mount 或兼容根。
  • OpenList 不能当服务器系统盘或热运行盘:数据库、node_modules、Astro dist、Pagefind、Syncthing hot mirror、/srv/myblog runtime、OpenList DB 和 systemd 服务都必须留在服务器本地文件系统。
  • OpenList/COS/Quark 只能承担 public access、blob backend、cold archive 和 content address space;/srv/myblog/public-data/openlist-files 是可再生 reader 原件缓存,可用 npm run server:openlist-storage 显式审计和清理。
  • GitHub 管 Markdown、项目 Wiki、静态 metadata 和可版本化内容。
  • OpenList 管 EPUB、PDF、MOBI、图片、视频等原始文件。
  • MySQL 管 reader_memory、reader_highlights,后续承接 annotations、stickers、seals、graph links。
  • 前台通过同域 /api/* 访问 runtime,不暴露数据库连接串、WebDAV 凭据或 OpenList 内部地址。
Tradeoff

取舍

  • 混合架构比单体 CMS 复杂,但长期更适合个人知识基础设施。
  • Syncthing 会让 Vault 同步独立于 MyBlog 发布节奏,但也要求把同步冲突、删除和附件路径交给成熟文件同步层处理。
  • 静态前台部署简单稳定,动态状态通过 admin-next API 补足。
  • 缓存必须基于 path + modified + size 失效,否则 OpenList 文件更新后会产生陈旧 reader asset。
Future Direction

后续方向

  • 统一 Knowledge Object 表,把书、文章、项目、视觉素材、高亮都纳入同一对象模型。
  • 把 Runtime API 合同写成可测试 schema,避免后续 UI 和数据层漂移。
  • 让导入任务成为显式 pipeline:scan -> index -> cover prewarm -> file prewarm -> normalize。
  • 把冷归档后端从夸克迁到 COS 时保持同一 OpenList content control plane identity,MyBlog 只改归档目标和索引配置,不改 authoring truth。