Skip to content

多设备同步(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 URLhttps://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)存密码,存在两个问题:

  1. 不便携:keyring 和设备绑定,换机器后无法恢复
  2. 多账号不友好:一个用户一个 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:家里电脑 + 公司电脑

  1. 家里电脑首次配置,点"立即推送" → 云端生成 kb-sync-HOME-PC.zip
  2. 公司电脑配置同一 WebDAV → 打开"查看云端状态" → 看到 kb-sync-HOME-PC.zip → 点"从此设备拉取" → 本地数据变为家里电脑的快照
  3. 公司开着自动同步(1 小时一次) → 云端会多一个 kb-sync-OFFICE-PC.zip
  4. 回家后点一次"从其他设备拉取" → 选 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,配置变更立即重排,不需要重启应用

你的知识,你的电脑,你说了算