多设备同步(WebDAV)
把笔记库同步到 WebDAV(如 坚果云、NextCloud、自建 rclone webdav 服务),实现多台电脑共享同一个知识库。
Knowledge Base 的同步方案遵循"本地优先 + 云端同步"原则:
- 数据始终保存在本地 SQLite + 文件目录
- 云端仅存放加密快照 ZIP + 少量元信息
- 密码用 AES-256-GCM 加密后存入本地 SQLite,不经过任何第三方服务
- 你随时可以断开同步,本地数据完全自主
工作流概览
本地 A(主) WebDAV 云(坚果云/...) 本地 B
┌─────────────┐ push ZIP ┌────────────────────┐ pull ZIP ┌─────────────┐
│ SQLite DB │ ───────────▶ │ kb-sync-A.zip │ │ SQLite DB │
│ images/ │ │ kb-sync-B.zip │ ◀─────────── │ images/ │
│ sources/ │ │ (每台设备一份) │ │ sources/ │
└─────────────┘ └────────────────────┘ └─────────────┘关键设计:
- 每台设备用 主机名命名一份 ZIP(
kb-sync-<hostname>.zip),互不覆盖 - 同步是"全量快照"而非逐条 diff,简单可靠,不会因冲突丢数据
- 推送是压缩 + 增量上传(内容未变的文件不重复上传)
快速配置
1. 坚果云生成第三方应用密码
登录 坚果云 Web → 账户信息 → 安全选项 → 添加应用 → 复制生成的密码(不是登录密码)。
WebDAV 地址是 https://dav.jianguoyun.com/dav/。
2. 应用内配置
设置 → 多设备同步:
| 字段 | 值示例 |
|---|---|
| WebDAV URL | https://dav.jianguoyun.com/dav/knowledge-base/ |
| 用户名 | your-email@example.com |
| 密码 | 粘贴上一步的应用密码 |
| 自动同步间隔 | 15 分钟 / 1 小时 / 关闭 |
点 测试连接 → 成功后会询问是否保存密码 → 选"保存"。
3. 手动推送 / 拉取
- 立即推送:当前笔记库打成 ZIP 推上去
- 查看云端状态:列出远端所有设备的 ZIP,显示大小、时间
- 从其他设备拉取:选中另一台设备的 ZIP → 覆盖当前本地数据
从其他设备拉取会覆盖本地
拉取前应用会提示"会覆盖当前本地数据"并要求二次确认。建议先执行一次"立即推送"作为备份。
自动同步调度
启用"自动同步"后,应用会启动一个后台调度器:
- 按设定间隔(默认 1 小时)自动执行推送
- 关闭应用时停止,下次打开时按上次推送时间继续计时
- 失败时会记入同步历史,不阻塞应用其他功能
- 可在"设置 → 多设备同步 → 同步历史"查看每次的方向 / 条数 / 大小
密码安全
这是 v0.2.0 的核心安全改进。之前版本使用系统 keyring(Windows Credential Manager / macOS Keychain)存密码,存在两个问题:
- 不便携:keyring 和设备绑定,换机器后无法恢复
- 多账号不友好:一个用户一个 keyring 条目,难以管理多个 WebDAV
v0.2.0 改为:
密码明文 → AES-256-GCM 加密 → Base64 → app_config 表
↑
key = SHA256(hostname || "knowledge-base:v1:webdav-enc")- 密钥由设备主机名派生,不写入数据库本身 → 即使 SQLite 被拷走也无法解密
- nonce 12 字节,每次加密随机生成 → 相同明文也产生不同密文
- 认证标签 GCM tag → 篡改即时可检测
同步拉取到其他设备后,该设备会自动清理来源设备的加密密码条目(因为主机名不同,也解密不了),避免残留。
常见场景
场景 1:家里电脑 + 公司电脑
- 家里电脑首次配置,点"立即推送" → 云端生成
kb-sync-HOME-PC.zip - 公司电脑配置同一 WebDAV → 打开"查看云端状态" → 看到
kb-sync-HOME-PC.zip→ 点"从此设备拉取" → 本地数据变为家里电脑的快照 - 公司开着自动同步(1 小时一次) → 云端会多一个
kb-sync-OFFICE-PC.zip - 回家后点一次"从其他设备拉取" → 选
kb-sync-OFFICE-PC.zip→ 拉回最新内容
场景 2:只想用云端做备份(单机)
不需要多设备?就把"自动同步"开成每天 1 次,随便设个 24 小时。云端 ZIP 相当于一份异地备份,应用卸载/重装后能一键恢复。
场景 3:自建 WebDAV
用 rclone serve webdav 或 NextCloud 搭一个自己的 WebDAV 服务,完全自主。配置字段一样。
技术细节
- 同步方向:
push(本地 → 云)、pull(云 → 本地)、auto-push(定时调度) - ZIP 内容:SQLite DB 文件 +
images/目录(笔记里的图片)+sources/目录(原始 PDF / Word) - 冲突处理:全量覆盖策略,没有三路合并;依赖用户在同一时刻只在一台设备编辑
- 快照表:本地
sync_history表记录每次同步的方向、时间、条数、大小、是否成功 - 心跳触发:自动调度器用 tokio
Notify,配置变更立即重排,不需要重启应用