Obsidian WebDAV Sync
WebDAV Sync 是一款为 Obsidian 设计的插件,用于将您的仓库与 WebDAV 服务器同步。它在文件处理的稳健性、性能表现以及无厂商锁定方面优于现有解决方案。
WebDAV Sync 是一款为 Obsidian 设计的插件,用于将您的仓库与 WebDAV 服务器同步。它在文件处理的稳健性、性能表现以及无厂商锁定方面优于现有解决方案。
Obsidian WebDAV Sync 是一款面向 Obsidian 的通用型双向 WebDAV 同步插件。鉴于目前尚无单一插件能可靠且便捷地将仓库与 WebDAV 服务器进行同步,故开发了此插件。其核心功能包括:
作为一名需要在多设备间工作的 Obsidian 用户,我亲身经历了同步困境:寻找一款既可靠灵活,又不牺牲数据完整性的方案。在尝试了社区中几乎所有同步插件后,我发现它们都存在各种权衡,严重影响了我的日常工作效率:
随后,我发现了 Nutstore Sync —— 一款优秀的插件,但仅专为 Nutstore 设计。我想:为什么不将其打造为通用型工具呢?于是我将其 Fork,并进行了大规模重构,以消除厂商锁定、提升性能并增强稳定性。最终诞生的成果就是 Obsidian WebDAV Sync。
将 Obsidian 仓库同步至 WebDAV 服务器是一个典型的去中心化协调问题:每个客户端拥有自己的仓库副本,且中间没有中央协调器。目标是在各客户端之间实现仓库同步,以最大化数据完整性。
为此,本插件记录了本地和远程文件的最后一次已知同步状态。在同步过程中,它会评估每个文件路径的四种状态(当前本地、当前远程、记录中的本地、记录中的远程),并据此决定同步操作:
✅ = 存在,❌ = 不存在,✏️ = 相比记录已变更
| 情况 | 本地文件 | 远程文件 | 同步记录 | 操作 |
|---|---|---|---|---|
| 1 | ✅ | ✅ | ✅ | ⏭️ 跳过 (已同步) |
| 2 | ✏️ | ✏️ | ✅ | ⚠️ 解决冲突 (应用策略) |
| 3 | ✅ | ✏️ | ✅ | ⬇️ 拉取 (下载远程) |
| 4 | ✏️ | ✅ | ✅ | ⬆️ 推送 (上传本地) |
| 5 | ✅ | ❌ | ✅ | 🗑️ 删除本地 (清理) |
| 6 | ❌ | ✅ | ✅ | 🗑️ 删除远程 (清理) |
| 7 | ❌ | ✏️ | ✅ | ⬇️ 拉取 (从远程恢复) |
| 8 | ✏️ | ❌ | ✅ | ⬆️ 推送 (恢复到远程) |
| 9 | ✅ | ✅ (对比本地) | ❌ | 📝 记录 (捕获未记录的文件) |
| 10 | ✅ | ✏️ (对比本地) | ❌ | ⚠️ 解决冲突 (首次同步) |
| 11 | ❌ | ✅ | ❌ | ⬇️ 拉取 (新远程文件) |
| 12 | ✅ | ❌ | ❌ | ⬆️ 推送 (新本地文件) |
| 13 | ❌ | ❌ | ✅ | 🧹 清理记录 (数据库清理) |
现在的同步逻辑已足够可靠,但也引发了一些新问题。
例如,同步前比较四种状态意味着每次同步开始时都需要对 整个 WebDAV、本地仓库和记录进行遍历,这对于大型仓库来说是不切实际的。为此,引入了快速模式 (Fast Mode),它复用记录中的远程状态作为当前状态。这避免了遍历整个 WebDAV,但会忽略远程端的变更。因此,建议在快速同步前先进行一次普通同步。
此外,存储所有文件的记录和内容为比对文件是否变更,需要大量且活跃的存储空间来确保保真度。本插件利用 IndexedDB 存储记录,并按需查询。
随之而来的还有更多问题:如果在遍历和执行期间文件发生了变化怎么办?如果远程端文件变成了文件夹怎么办?如果后续对存储结构进行修改,如何迁移用户数据?这些问题都值得深入探讨。
由于该插件目前处于 Beta 阶段,安装需要使用 BRAT (Beta Reviewer Auto-update Tool) 插件:
https://github.com/hesprs/obsidian-webdav-sync在首次同步前,请务必备份重要笔记。虽然该插件能稳健地处理文件存在性判定,但在首次设置时拥有备份能让您更加安心。
Obsidian WebDAV Sync 采用 AGPL-3.0 许可证 发布。