一、为什么要搭这套系统
深湾.AI 是记录 AI/ 科技 / 金融 / 旅行的知识库。最核心的需求是:
- 编辑自由:支持 Markdown、本地编辑、版本控制
- 自动化:减少手工操作,防止发布错误
- AI 辅助而非代替:AI 可以检查、建议,但本人保留决策权
- 数据独立性:正文以本地 Markdown 保存,不把内容唯一托管在某个在线写作平台
我们选择了一条 DIY 路线:Obsidian 管理正文,editorial 管线负责检查和同步,人类掌控最终的 commit 和 deploy。
二、五个角色的分工
Obsidian
- 职责:存储正文源
- 特点:正文以本地 Markdown 文件为主,是否使用同步服务由本人决定,支持 Wiki 链接
Claudian(AI 写作助手)
- 权限:经用户确认后,可在
Publish/Blog/Drafts/创建和修改草稿 - 能做:大纲建议、拼写检查、元数据补充、重述建议
- 规则限制:
- 不修改
content/posts/(发布区) - 不执行
git commit / push / deploy - 禁止创建 symlink;覆盖、移动和删除文件必须再次取得本人确认
- 不修改
Editorial 工作流
- 职责:检查、同步、测试、构建
- 流程:
editorial:check:检查 frontmatter、日期、ID、slug、图片和同步冲突editorial:release:按顺序执行 check → sync → test → build
- 特点:fail-closed,出错就停止
Admin
- 认证:Cloudflare Access 邮箱 OTP
- 功能:查看构建时收录的文章快照,包括草稿 / 发布状态、缺失摘要或封面、配置和评论状态
- 特点:只读仪表板(本来也想着管理面板里面写作,但权衡后放弃)
网站(shenwan.ai)
- 框架:Next.js + Vinext(把 Next.js 应用适配到 Cloudflare Workers)
- 评论:Artalk 后端部署在独立 VPS,通过 comments 提供服务
- 部署命令:
pnpm deploy:vinext
三、搭建中遇到的真实问题
问题 1:在开源项目的基础上起步
这套博客不是从零搭起,而是基于罗老师的开源博客改造而来——站在成熟的工程实践上,省下大量从头摸索的时间。
致谢在前,内容归己。
问题 2:AI 幻觉导致误导读者
AI 曾自动生成不存在的文章标题和 URL,会误导读者。解决方案:在 AI 输出前增加标题和 URL 白名单校验与引用防护。
问题 3:登录系统从 PBKDF2 迁移到 Cloudflare Access
最初实现了自建 PBKDF2 密码登录在 Cloudflare Workers。但 Workers Free 的 CPU 限制导致加密计算返回 500 错误。
解决方案:迁移到 Cloudflare Access 的邮箱 OTP 认证,既解决了性能问题,也简化了权限管理。
问题 4:评论系统与主站的独立性
评论功能选择用 Artalk 后端部署在独立 VPS,通过 comments 提供服务。
收益:评论后端和数据可独立运维;主站部署异常不会删除 Artalk 数据。注意:文章页不可用时用户仍无法通过主站查看评论。
问题 5:把本地文件安全同步到仓库
本地文件同步到仓库时需要多层防护:
- draft 隔离:Drafts 和 Posts 分开管理,draft 文件不发布
- 固定 id:每篇文章的 id 一次性生成(UUID v4),永不修改,用于保持文章身份和识别重命名;重复 id 会被同步管线拒绝
- 覆盖保护:同一 sourceId 可更新自己的同步产物;目标无 sourceId 或属于不同 sourceId 时拒绝覆盖
- symlink 防护:防止符号链接导致的意外访问
四、为什么必须限制 AI 权限
AI 的角色是辅助而非代替。限制的目的是:
- 缩小误操作影响范围 — AI 无法直接部署,从而显著缩小风险;最终仍需本人审查
- 明确责任边界 — 清楚地知道谁负责最终决策
- 可审计的关键步骤 — 检查输出、同步报告和 Git diff 可在提交前审查
具体限制:
- ✓ 可在 Drafts 创建和修改(需确认)
- ✗ 不能直接改 Posts(发布区)
- ✗ 不能执行 commit/push/deploy
- ✗ destructive 操作需再次确认
五、当前工作流(完整步骤)
1. 在 Obsidian 中创建或编辑草稿(Publish/Blog/Drafts/)
↓
2. Claudian 提供大纲建议、检查、元数据补充
(用户确认后修改)
↓
3. 运行 editorial:check 验证 frontmatter、日期、ID、slug、图片和同步冲突
↓
4. 检查通过,用户手工将文件移到 Posts/,设 draft: false
↓
5. 运行 editorial:release
(按顺序:check → sync → test → build)
↓
6. 审查生成的 git diff
↓
7. 用户手工执行 git commit
↓
8. 用户手工执行 pnpm deploy:vinext
关键细节:
editorial:sync只同步文件,不创建 commit- commit 和 deploy 始终由本人确认
- 已发布文章若修改,使用
updated字段,不修改原date - 图片语法:Obsidian 嵌入写成
!+[[文件名]];标准 Markdown 写成!+[说明](路径)
六、当前系统的不足
本文所述的基础框架已上线,写作工作流完成首轮打通。但仍有改进空间:
- 本地预览:写作后台是很纯粹,没有加任何插件,展示效果可能没有很好
- 增量检查:目前是全量验证,可优化为只检查修改部分
- 多人协作:当前单人写作,哈哈,暂时还没考虑开放多人写作
- 访问分析:admin 仪表板目前不展示访问日志
作者:爱旅游的马老板
网站:shenwan.ai
本文仍在完善中