5.2 KiB
5.2 KiB
SOP — Obsidian Vault 同步 · 部署与运维手册
版本:v1.0 · 日期:2026-08-19 · 对应 PRD/SDD/BDD/TDD v1.0 面向:部署工程师 / 运维 / 值班支持。按章节顺序执行即可。
1. 部署前检查单
| # | 检查项 | 命令/位置 | 通过标准 |
|---|---|---|---|
| 1 | 后端配置 Rag:Obsidian:AllowedRoots 已配置 |
build-flow.api/src/BuildFlow.Host/appsettings.json 或环境变量 |
非空数组;为空则所有同步请求被拒(fail-closed) |
| 2 | 容量上限符合预期 | 同上 MaxFiles / MaxFileBytes / MaxTotalBytes |
默认 10000 / 10MB / 512MB |
| 3 | vault 根目录在 API 服务器上真实存在且可读 | ls -ld <root> |
存在、运行账号有读权限 |
| 4 | 操作用户具备 knowledge:write 权限 |
平台 → 角色权限 | 权限已授予且前端菜单可见 |
| 5 | 文档处理管线正常(同步后文档要切分/向量化) | 观察同步后文档状态从 Pending → Done | 不长时间滞留 Pending |
| 6 | S3 默认桶已创建(平台级,缺失时上传报 404「资源不存在」,极具迷惑性) | GET /api/buckets(需 bucket:read)或直接在 S3 控制台/CLI 确认 build-flow 存在 |
桶存在;不存在则先创建:POST /api/buckets {"name":"build-flow"}(需 bucket:write)或用 S3 密钥 SigV4 PUT /{bucket}。默认桶名来自 file_settings 表,空表自动播种 build-flow(见 BucketResolver) |
环境变量注入方式(推荐,不入库、不入 git)
export Rag__Obsidian__AllowedRoots__0=/data/vaults
export Rag__Obsidian__MaxFiles=10000
export Rag__Obsidian__MaxFileBytes=10485760
export Rag__Obsidian__MaxTotalBytes=536870912
2. 部署步骤
# 1. 后端
cd build-flow.api
dotnet restore && dotnet build BuildFlow.slnx --no-restore -warnaserror
dotnet test tests/BuildFlow.Rag.Tests --filter "FullyQualifiedName~Obsidian" # 期望 9/9
# 2. 前端
cd build-flow.admin
corepack pnpm install
npm run lint # biome + tsc
npm run build
npm run test:e2e # 期望 12/12(obsidian-sync 4 + create-forms 8)
# 3. 按 §1 注入 AllowedRoots 后启动/重启 API
3. 功能验证(上线后 5 分钟冒烟)
- 登录 React 管理端 → 左侧「AI → 知识库」;
- 任一知识库卡片点「Obsidian 同步」→ 输入白名单内 vault 路径 → 开始同步;
- 看到结果弹窗(新增/更新/跳过计数)= 功能通;
- 立刻再同步一次:Added=0、Updated=0、Skipped=文件数 = 增量对账通;
- 输入白名单外路径(如
/etc):提示「路径不在允许的根目录内」= 安全门禁通; - 进入知识库文档列表,确认同步进来的文档 SourceType 为 Obsidian 且陆续完成处理。
4. 常见故障处置
| 现象 | 可能原因 | 处置 |
|---|---|---|
| 「未配置允许的 Obsidian 根目录」 | AllowedRoots 为空 |
按 §1 注入配置并重启 API |
| 「Obsidian 路径不在允许的根目录内」 | 用户输入路径不在白名单下 | 确认路径拼写;确需开放则在 AllowedRoots 增加根目录 |
| 「Vault 目录不存在」 | 路径在 API 服务器上不存在 | 在 API 服务器上 ls 确认;注意路径是服务器路径不是用户本机 |
| 「超过配置上限」(too_large) | 文件数/单文件/总量超限 | 清理 vault 或调高对应上限后重试 |
| 同步成功但文档一直 Pending | 文档处理管线(切分/嵌入)异常 | 查 API 日志 ProcessDocument 相关错误;确认嵌入模型服务可达(默认 localhost:1234) |
| 401/403 | 未登录或无 knowledge:write |
重新登录;找管理员授权 |
| 上传/下载文件报 404「资源不存在」 | S3 默认桶不存在(NoSuchBucket 被包装为 404) | 按 §1 第 6 项创建 build-flow 桶后重试(2026-08-19 实测案例,见验收报告 §7.4) |
| 大 vault 同步请求耗时长 | 同步为阻塞调用,按文件数线性 | 正常现象;前端有 loading 防重。勿反复点击/重试 |
5. 安全红线(不可绕过)
- 永远不要把
AllowedRoots配成/或系统敏感目录;只开放业务 vault 根; - 不要为图方便关闭符号链接逃逸校验(Scanner 内置,无开关,勿改代码绕行);
- vault 路径来自用户输入但所有访问都在服务端发生 —— 任何"为了方便调试"把路径拼进 shell 命令的行为都可能引入注入,禁止;
- 服务器/中间件凭据只在
appsettings.Secrets.json(不入 git)或环境变量,泄漏即轮换。
6. 回滚
- 前端:功能为纯增量(Knowledge 页 + 一个组件),回滚
build-flow.admin对应提交即可,无数据迁移; - 后端:端点校验改动(
Enum.IsDefined)向后兼容(0-2 行为不变,3-5 从"静默丢弃"变为"生效"),无需回滚动作; - 同步写入的文档可通过删除知识库或按
SourceType = Obsidian清理,无特殊回滚步骤。
7. 例行维护
- 每周抽查一次同步结果计数是否合理(Skipped 长期为 0 可能意味着哈希逻辑失效);
- 关注 Rag.Tests 中 Obsidian 相关 9 个测试在 CI 保持全绿;
- 前端
npm run test:e2e在每次前端发版前必跑(12/12)。