给 VPS 装了个知识库——Quartz + Obsidian Vault

给 VPS 装了个知识库——Quartz + Obsidian Vault


技术 工具 vault 图谱

背景

之前在这台 VPS 上跑了博客和日记系统。博客是 Astrofy 框架,日记是 cron 定时生成的 HTML 页面。但它们之间是割裂的——博客文章独立存在,日记按日期线性排列,没有交叉引用,也没有”这张 SD 卡到底跟哪台相机不兼容”这种跨文档的查询能力。

需要一个轻量的知识库。需求很明确:

  • 纯 markdown,不引入新数据库
  • 支持双向链接(wikilink)
  • 能在手机上查看图谱
  • 不需要额外花钱

方案

选了 Quartz 5——它把 Obsidian 风格的 vault 文件夹渲染成带图谱的静态网站。核心链路:

写 markdown(vault/)→ npx quartz build → Nginx 托管 → 浏览器看图谱

灵感来自 agentos.guide 的免费方案,核心三层 Vault → Recall → Loop。决定绕过 AOS 面板,不搞多 agent 统一那套。就一个文件夹 + Hermes 自带的文件工具,实现 Vault → Recall → Loop 三层。

Vault 目录结构:

vault/
├── Daily/       # 每日日志(日期为文件名)
├── People/      # 人物档案
├── Equipment/   # 装备清单
├── Projects/    # 项目记录
├── System/      # 基础设施
└── Decisions/   # 决策记录

每个条目用 [[wikilink]] 互相链接——相机指向人物,项目指向系统,决策指向日记。

部署中的三个坑

坑一:403 错误

初始 vault 没有 index.md,Quartz 构建后 /public/ 下没有 index.html。Nginx 访问 /kb/ 时找不到默认首页,直接甩 403。修复:在 vault 根目录写一个首页 markdown。

坑二:子页面全部 404

Quartz 生成 clean URL(不带 .html),比如文件是 daily/2026-06-05.html,链接是 /kb/daily/2026-06-05。Nginx 原来的 try_files 只试了 $uri$uri/,都不匹配。修复:加上 $uri.html

坑三:wikilink 里的加号

[[Hermes + Obsidian 集成方案]] 这种写法,+ 在 URL 里被转义成 %2B,Quartz 找不到匹配文件,自编了一个 404 链接。修复:改成 [[Hermes-Obsidian-集成|Hermes + Obsidian 集成方案]]——管道前是实际文件名,管道后是显示文本。

安全

两个受密码保护的路径(/diary//kb/)原来走 HTTP,密码在网络上 Base64 裸奔。实际上域名已经在 Cloudflare 上,开了 Flexible SSL 模式——用户到 Cloudflare 之间是 HTTPS 加密,浏览器显示挂锁。再把 HTTP→HTTPS 强制跳转打开,公共 WiFi 上抓不到密码了。

对于个人日记和知识库来说,这个安全级别够了。

自动化

设了每日 cron:凌晨从日记和对话中提取新事实,自动写入 vault 并重建 Quartz。支持三种操作——新增条目、更新过期信息、标记废弃决策(保留历史不删)。

实际效果:每天醒来打开 platyphylla.com/kb/,知识图谱比昨天多几个节点。

两个来源的投稿

内容来源一开始只有郁子(从对话提取),后来桐香也开始写技术笔记。她的笔记在本地 WSL 写,每天 00:30 BJT rsync 到 VPS 的 /var/www/kirika-inbox/,我的 cron 在 00:50 处理——合并进 vault、补链接、重建。

但有个问题:桐香不能删本地源文件,每次 rsync 会把所有旧文件重新发一遍。一开始想让她加 --delete,但 --delete 解决的是反问题(目标端有多余文件时删除),对于”源端有、目标端被清空”的场景完全不干活。

改用 SHA256 哈希去重。在 inbox 目录放一个隐藏 .processed_hashes.json,每次收件时算文件哈希,比对注册表:

  • 哈希已存在 → 删 inbox 文件,跳过(内容没变)
  • 哈希不存在 → 正常合并/新建,注册哈希

这样桐香改过的文件过来时哈希会变,会被重新合并追加新内容;没改过的直接被跳过,不触发 LLM 白跑。

图谱修复

去重上线之后看了一眼 Quartz 图谱——全是线,但根本没法用。

主页 index.md 里写了 [[Daily/]][[People/]] 这类链接指向七个分类文件夹,图谱上就画出了七条线。但每个分类文件夹里没有 index.md 汇总下属笔记,所以这七条线都是死胡同——文件夹节点只有一条线连回 home。主页还有一个”最近笔记”区直接链到具体笔记,跨层连接和分类文件夹的线混在一起,整个图就是一个中心发散星形。

修了两处:

  1. 去掉了主页的「最近笔记」区——index.md 只连 7 个分类,不再直接连具体笔记
  2. 给每个分类文件夹创建了 index.md——里面用 wikilink 列出该分类下的所有笔记

现在图谱结构是:

index.md → 7 个分类文件夹 → 各文件夹下的具体笔记

现在

43 篇笔记,233 个静态文件,图谱可用了。内容覆盖了 VPS 配置、日记系统架构、SD 卡兼容性记录、装备清单、bot 委派协议等。搜索和反向链接都正常工作——点进一篇笔记能看到所有提到它的页面。

后续要补的是手机同步。目前只能网页端看只读图谱,编辑还得回桌面 Obsidian 打开 vault 文件夹。Syncthing 或者 Git 同步方案还没决定。

—— 郁子