【已解决】搞了一个月,还是没搞懂 WebDAV 同步

本贴最后更新于 208 天前,其中的信息可能已经事过境迁

结论:

思源是为 S3 服务优化的,对 WebDAV 服务的条件要求很高,普通的 WebDAV 服务不能满足思源的需求,容易出现同步错误。根据思源的需求去挑选合适的 WebDAV 需要花很多精力和时间和金钱,可能只有自建 WebDAV 然后把参数拉满才能足够思源使用吧。

我觉得思源应该直接把“它在设计上就是为 S3 优化的,它目前的状态不适合使用公有云的 WebDAV 同步”之类的话写出来放在主页上。同步页面那几句话并没有提示思源在 WebDAV 上的表现是这样的,我现在感到有些受骗的感觉,因为我就是为了使用 WebDAV 服务才买的功能特性,思源也说了它支持 WebDAV,却没说它真实的支持情况。

--更新--

先说问题:

无论我怎么调整和配置,为什么总是会出现“unexpected end of JSON input (Provider: WebDAV)”的错误?

再说细节:

当我打开一个完全空白的桌面思源实例时,我能够让一个客户端成功连接上 WebDAV 云服务。但是我如果我想让安卓或 iOS 客户端与之同步,那么当我完成了包括导入密钥在内的所有必要操作后点击开始同步,就会出现上述错误,并且导致桌面端也不再能同步。我起初认为是我安卓/iOS 客户端里面有内容导致的,但是我开了新的工作空间也会出现同样的问题。此时我再在桌面端做任何操作,包括清理仓库、清理云端存储、重置仓库,甚至我新开一个云端同步目录并(在双端)采用新的同步密钥都无济于事。我从未成功将有数据的思源笔记和其他的客户端同步。

根据我自己的观察,我认为可能是第二个加入同步的客户端在同步时破坏了同步目录内的数据导致的。我看了日志,里面提示造成出错的成因是“unmarshal cloud latest index”(第九行),如下

I 2024/05/28 11:18:02 repository.go:1279: syncing data repo [device=f6957f06f6344ed5b95152c14e256c8d, kernel=i4ygjae, provider=3, mode=a/false]
I 2024/05/28 11:18:02 ref.go:50: got local latest [device=f6957f06f6344ed5b95152c14e256c8d/linux, id=7cb4ab7bacf8478c7f45115e75802967b69a0390, files=34, size=65.73 kB, created=2024-05-28 11:08:10]
I 2024/05/28 11:18:02 repo.go:595: walk data [files=34] cost [1.521121ms]
I 2024/05/28 11:18:02 ref.go:50: got local latest [device=f6957f06f6344ed5b95152c14e256c8d/linux, id=7cb4ab7bacf8478c7f45115e75802967b69a0390, files=34, size=65.73 kB, created=2024-05-28 11:08:10]
I 2024/05/28 11:18:07 webdav.go:92: uploaded object [main/siyuan/repo/lock-sync]
I 2024/05/28 11:18:07 ref.go:50: got local latest [device=f6957f06f6344ed5b95152c14e256c8d/linux, id=7cb4ab7bacf8478c7f45115e75802967b69a0390, files=34, size=65.73 kB, created=2024-05-28 11:08:10]
I 2024/05/28 11:18:08 webdav.go:104: downloaded object [main/siyuan/repo/refs/latest]
I 2024/05/28 11:18:09 webdav.go:104: downloaded object [main/siyuan/repo/indexes/7cb4ab7bacf8478c7f45115e75802967b69a0390]
E 2024/05/28 11:18:09 sync.go:1576: unmarshal cloud latest index [7cb4ab7bacf8478c7f45115e75802967b69a0390] failed: unexpected end of JSON input
E 2024/05/28 11:18:09 sync.go:131: download cloud latest failed: unexpected end of JSON input
I 2024/05/28 11:18:10 webdav.go:116: removed object [main/siyuan/repo/lock-sync]
E 2024/05/28 11:18:10 repository.go:1307: sync data repo failed: unexpected end of JSON input

虽然意识到了这一点,但是我想了一个月也没想出来我到底哪里做错了。期间我经常在网上搜索这个问题,旧的 github issue 和论坛内容都有提到,这个问题其实早就出现了,但是回复里面给出的方法并没有解决我的问题。我也想到可能是网络不稳定,因此设置了 tz 然后挂出去,速度变快了但是还是无济于事。

此外,我在错误报告中发现思源大量尝试访问随机端口被拒绝,这可能是由于我的系统的防火墙设置问题导致的。(我的系统是 OpenSUSE,防火墙设置似乎比较严格)这导致我的思源进程有时会闪退并提示“内核连接失败”之类的问题。我在系统的防火墙里面放行了思源的 6806 端口的传入和传出,但是这种现象仍然发生。

我的猜想:

  1. 思源笔记只能在纯空白的情况下开始同步,一旦有数据就不行。(这点我不想来回迁移数据,就一直没试。)
  2. 思源笔记移动端目前仍然存在同步缺陷,或者说思源笔记的同步传入功能存在缺陷
  3. 思源笔记设计出来就是照顾 S3 存储的,WebDAV 只能算勉强兼容。因此同步的时候也更容易破坏数据
  4. 我的防火墙设置导致出现问题。但是这样的话为什么还能完成最初的同步呢?为什么会拖到第二个同步设备加入才出现问题呢?
  5. 思源闪退导致数据损坏,并且这个损坏伤害了云端同步目录的底层数据的完整性

我的原因:

我不喜欢在个人笔记这种信息重地和专有服务沾上关系,因此我选择了 WebDAV,因为很多不记名的免费开源云服务都是用 WebDAV 做同步方式的,而 S3 的不记名免费服务我几乎没听说过,更别提希望服务提供商支持自由开源了。我以前用 WebDAV 同步其他的东西,比如 Joplin、日历、tasks.org 等等都没什么大问题,但是思源笔记的 WebDAV 同步我几乎就没有成功过,甚至它的同步界面就直接写着 WebDAV 的种种不好,令我感觉有些恼火和挫败,难道思源设计上就是对 WebDAV 不友好的吗?如果是这样的话,我希望思源考虑支持一下诸如 Syncthing 之类的同步工具,只需要把导出内容压缩包的流程便捷化一点,然后直接同步内容压缩包就行了,如果将这个内容压缩包用账户 credentials 加解密,那么安全问题也得到保障。

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    23013 引用 • 92566 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    8447 引用 • 38477 回帖 • 154 关注
2 操作
JasonBreak 在 2024-05-28 15:54:36 更新了该帖
JasonBreak 在 2024-05-28 15:53:59 更新了该帖
被采纳的回答
  • zuoez02 1 1 赞同

    错误原因:JSON 解析失败,具体原因就是内容不完整无法解析。

    错误根源:WebDAV 配置的最大文件大小和长度过小,或服务商主动根据请求频率拒绝了服务。

    猜想正确:思源的确就是 S3 适配的最好,webdav 很受限于服务端配置。

    觉得不好:信息重地不应该放到免费服务上,危险性更高,免费的才是最贵的。

    建议方案:1 块钱可以用很久的七牛云,或者其他 S3 服务的云,可靠性和速度都更好。

    难以实现:思源的同步方案是根据思源的实际文件系统使用情况做的,可以边用边同步,但难以掉头用其他的同步工具。如果关闭软件自行加密同步下载解密,也可以实现同步但体验很差。这方面可以自行取舍

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...