本篇文章记录了我在obsidian多端同步失败后的修复过程。虽然网上有很多教程,但是尝试了它们的方法都无法解决问题。于是有了这篇博客,来记录我的修复过程。
我使用的同步使用插件是Remotely Save,库中存有十几篇文章,以及一些图片。同步设备包括Windows电脑,ipad和安卓手机,并在服务器上使用openlist的webdav功能同步到阿里云盘。
Remotely Save的配置基本如下:

电脑端和ipad端的同步始终没有任何问题,但手机端的却情况不是很好。
当我没有储存很多图片时,虽然手机端插件的检查可否连接功能一直显示无法连接到服务器,但同步文件是没有问题的,所以我也没多想,以为是插件的同步检测有问题,实际上是可以运作的。
但当我存了大约5张左右图片后,插件就会报错:
1/2 Remotely Save 开始同步(webdav)
xxx.md: error copying encrypt(webdav,no password)→local: sizenot matched
too many errors, stop the remaining tasks
2/2 Remotely Save 已完成同步!我在网络上搜索了相关解决办法,包括但不限于重新鉴权、改变文件的最后修改时间等,但我尝试了这两个方法都没有解决。
先说结论
解决方法其实很简单。既然是大文件(图像、视频等)无法同步,那不同步它们就好了。换言之,我们可以利用markdown语法中显示在线图片的方法,采用图床(可以理解为网盘)来储存我们的文件。这种方法也成功让我在写博客时偷懒,在本地编写后上传到服务器时不需要上传图片。
使用图床有诸多优点:
- 方便管理资料库。图片一多,就让资料库看起来非常混乱
- 便于迁移至其他软件/平台
- 节省本地空间
你可以使用Image auto upload+Picgo的解决办法,它支持多种图床。但这样需要在后台多打开一个软件。由于我太懒,于是我寻找到了另一种方法——采用插件Image Uploader For Note搭配S3储存实现,S3储存这边选择Cloudflare。可以看我之前的文章。配置方法如下:
| 设置名称 | 值(以Cloudflare为例) |
|---|---|
| Endpoint | S3兼容API终结点。位于API-将R2与API配合使用中 |
| Access key lD | 令牌ID。位于API-管理API令牌-创建 Account API 令牌中的访问密钥ID栏 |
| Secret access ey(应该是key?) | 令牌秘钥。位置同上,位于机密访问密钥栏 |
| Bucket name | 桶名 |
| Key template | 保存文件的位置及命名规则 |
| Region | 地区,auto即可 |
| Public URL | 公网访问域名。只需域名即可,无需具体路径。 |
接下来就可以美美使用啦!在写完文章后点击Upload images for active file即可一键上传所有文件,将文中的文件替换为链接,并且提示删除文件。

这样我们就不需要同步大文件,只需要同步.md的笔记文件了。Remotely Save可以轻松胜任这项工作。目前使用了一周没用遇到的问题,也算是解决了。
途中遇到并解决的其他问题
Remotely Save的WebDav服务显示连接不上
我一开始是在服务器上使用openlist的webdav进行同步会遇到这个问题,虽然服务可以使用,但看着就是难受。我遇到无法同步的问题时第一个就怀疑时WebDav的问题,于是将同步功能换成了S3储存。
这时又会出现一个问题。当你以为已经配置好了自信满满的点击同步按钮,就会报错
.md:Invalid RFC-7231 date-time value
Deserialization error: to see the raw response,inspect the hidden field {error).Sresponse on this object.我一开始以为这是手机的问题,结果电脑上换成S3储存也会出现这个问题。解决方法是将所有出现这个的文件都编辑一下并保存,将编辑时间修改过来就可以正常同步了。
其他可能的方法
捣鼓的过程中尝试过的一些其他方法,这里也提一下。感觉可以实现,只是没有研究下去,因此只说个大概思路。
Image auto upload插件+本地Picgo
这种方法的教程网上一搜一大把,,就不详细展开了,详情可以自行搜索。
如果你有闲置服务器但比较懒不想捣鼓配置文件
网上的obsidian+图床教程都是Image auto upload+Picgo的解决办法。
这种方法的优点是:
- 图床选择多样
- 插件配置方便
- 网上教程丰富
- ......
而缺点只有一个: - 要在电脑上多开一个软件
但是由于我太懒,于是我下定决心要找到一个不需要本地Picgo的方法。最后终于发现可以在服务器上部署Picgo的二开版本PicList来代替本地的Picgo服务。
直接使用docker部署
docker pull kuingsmile/piclist:latest
docker run -d \
--name piclist \
--restart always \
-p 36677:36677 \
-v "./piclist:/root/.piclist" \
kuingsmile/piclist:latest \
node /usr/local/bin/picgo-server -k piclist123456将./piclist修改为您的配置文件config.json所在路径,将piclist123456修改为您自己的密钥。
成功部署后可以访问对应端口36677,能访问则表示服务端部署成功。
在本地obsidian插件中默认上传器选择Picgo(app),并打开远程服务模式。将刚刚获取的api接口地址填入Picgo server上传接口中,后跟?key=你的秘钥。
自此大功告成,但我不知为什么就是连接不上 (ㄒoㄒ) 。
如果你有闲置服务器又有一点编程基础
可以尝试Custom Image Auto Uploader插件并在服务器部署Obsidian Image API Gateway
使用docker一键部署会比较方便。
# Pull the latest container image
docker pull haierkeys/obsidian-image-api-gateway:latest
# Create and start the container
docker run -tid --name image-api \
-p 9000:9000 -p 9001:9001 \
-v /data/image-api/storage/:/api/storage/ \
-v /data/image-api/config/:/api/config/ \
haierkeys/obsidian-image-api-gateway:latest部署完成后访问9000端口,进入登录页面。
这时候就需要改一下配置文件config.json,允许用户注册并进行注册。返回web界面进行注册,注册完后立马关闭用户注册即可。配置文件应该位于/data/image-api/config/:/api/config/。
它有两种服务模式——单用户模式和多用户模式。如果你只是一个人使用,那你可以切换到单用户模式,但我认为多用户模式也可以支持单用户模式,所以没改。
登录进入后添加对应储存方式。随后点击右下角的复制api信息获取api网关地址及令牌,并填入插件中的配置项中。
到这里,设置基本完成,不出以外的话就要出意外了。我是到这一步卡住的。容器日志如下:
INFO /api/user/upload {"status": 200, "method": "POST", "fileurl": "/api/user/upload", "query": "", "ip": "*", "start-time": "*", "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko)", "errors": "", "time-cost": "183.723805ms", "status_code": 200, "request": "height=0&key=&type=none&width=0", "response": "{\"code\":500,\"status\":false,\"message\":\"服务器内部错误\",\"data\":null,\"details\":\"interface conversion: interface {} is nil, not string\"}"} [GIN] * | 200 | 183.848883ms | * | POST "/api/user/upload"感觉主要原因是interface conversion: interface {} is nil, not string,也就是字符串类型转换失败。
但我找了半天,怎么也想不通哪里来的空字符串,于是放弃了这种方法。
评论已关闭