运行面与内容底座
Ivan’s Blog 由公开站、管理后台和 Bun gateway 组成。Astro 负责公开站,Vite/React Admin SPA 负责 /admin/*,Bun gateway 提供运行时入口与 API。SQLite 和 Drizzle 保存内容、状态与管理操作。
公开站输出静态、可缓存的页面;作者在后台处理内容和系统状态;gateway 连接两侧的受控接口。
公开快照边界
同步完成后,数据库承担可查询缓存与操作状态,公开站按发布规则重新组成快照。草稿、私有条目、缺少本地正文或媒体的记录不进入公开页面;构建阶段还会检查 slug、标题、标签和日期。
作者在本地 Markdown 中调整 frontmatter,后台显示同步结果,公开站只接收通过校验且满足可见性条件的版本。
管理后台演示
管理后台 Demo 使用真实的 Vite/React 路由、编辑器、导航和组件,只在 API 层注入确定性的 mock 数据。它展示文章编辑、同步状态和操作反馈,不写入真实数据库,也不要求访客登录。
项目索引、公开文章和管理 Demo 分别呈现工程边界、发布内容和操作流程。Demo 使用同一套路由与组件,数据不写入线上内容。
本地内容同步
当前内容源以本地文件系统为准。同步流程会扫描配置的 Markdown 根目录,解析 frontmatter 和正文,验证内容项后写入数据库;后台可以触发同步、查看进度、读取来源状态和检查同步日志。
构建公开快照时,系统筛选已发布且公开的文章和 Memos,检查正文与本地媒体,再将结果交给 Astro 页面和订阅源。
搜索与订阅
搜索同时支持字面检索和语义检索。SQLite 维护 posts_search_fts 内容索引;embedding、向量或 reranker 不可用时,系统使用文本搜索。
RSS、Atom、JSON Feed、标签订阅和 Memos 订阅都读取公开快照。搜索、网页阅读和订阅使用同一份发布结果。
后台工作流
后台提供文章、评论、内容同步、标签、计划任务以及模型配置等管理入口,浏览器通过 /api/admin/* 与 gateway 通信。对外公开的 Admin 演示使用真实 SPA 路由和组件,只替换 API 为确定性的 mock 数据,不需要把演示状态误认为真实生产数据。
博客本身也作为公开项目维护:项目索引、文章、Memos、搜索和订阅都由同一套仓库持续演进。它展示的是内容从本地编辑、同步、筛选到公开交付的完整工程边界。