为Obsidian搭建免费的实时同步服务
前言
我用过很多笔记软件来码字,但是不知道自己习惯于哪种记录文字的工具,所以总是各种软件装一堆,这个软件里记一点,那个软件里也记一点,笔记都非常零散地落在各处。当我想要整理时,要么是搞不清楚记在哪个软件里面,要么就是难以笔记迁移,只能来来回回复制粘贴,导致好多笔记都弄丢了。直到我接触到 Obisdian 后,我就决定使用它作为我的主力笔记软件,至于原因嘛,我之前的文章里有详细的原因,这里就不多缀述了。
因为 Obisdian 官方同步功能是收费的,而且有点小贵,所以我之前一直使用 Webdav 进行同步。Webdav 也很好用,但却有着同步速度略慢,不能实时同步的缺点,所以 Webdav 更适合作备份而不是文件同步。直到最近,我发现了一种除官方同步服务之外最好用的 Obsidian 同步方式,那就是使用 Self-hosted LiveSync 插件进行同步。
Self-hosted LiveSync,官方仓库在 Github 上。我在使用就后发现它的实时同步速度非常快,绝对可以和官方的同步服务相媲美,唯一有区别的地方就是需要一个 CouchDB 数据库进行读取写入数据。
好了,废话不多说,下面我就正式开始教大家怎么使用 fly. Io 的免费计划来搭建自己的同步服务。
注意⚠️:此插件与官方同步服务和 iCloud 不兼容,如果使用了官方同步服务就… 还有就是一些其他的同步插件如 Remote save 尽可能停止定时同步,防止出现两个插件同步冲突等奇奇怪怪的同步问题。此服务最大的特点是实时同步,并不能完全代替 Webdav 的备份功能。
使用 fly. Io
这次部署使用的是 fly.io 的免费计划,fly. Io 是一个 SAAS(是(Platform as a Service)的缩写,是指平台即服务)平台,可以搭建如静态博客、Nextjs、Nuxtjs、Deno、Go、Python 等底层的各种各样的服务。但首先需要自己注册一个账号,这里可以直接使用 Github 登录。

注意:fly. Io 的使用需要绑卡,如果没有绑卡会在创建应用章节出现 Error 提示。绑卡过程请在 fly.io 面板 中 Billing 进行。正常使用国内的双币卡就可以,注意请如实填写信息。没有卡的朋友可以去各银行办一张或试试虚拟卡?
安装 flyctl
Fly.io 的大多数操作需要使用命令行,所以先要安装命令行工具 flyctl。安装方式可以参考官方文档:安装文档
1 | Brew安装 |
1 | curl -L https://fly.io/install.sh | sh |
1 | # Run the Powershell install script |
注意: CMD 中不支持上面的命令,Windows 用户请使用 PowerShell 或 Windows 终端。
本地登录
1 | flyctl auth signup |
会自动打开浏览器进行验证账户操作。
创建应用
在本地任意位置创建一个 fly. Io 的工作目录。
1 | mkdir fly.io |
进入 couchdb 目录后输入命令:
1 | flyctl launch --image couchdb |
这一步将会启动一个向导,按自己的需求进行选择。

Select region 的意思是选择一个位置,尽量选择靠近自己的位置。
配置卷大小

我输入的配置卷大小命令为:
1 | flyctl volumes create --region nrt couchdata --size 1 |
nrt 的意思是东京地区,你需要改变为和上面选择的位置区域一样的位置代码。这一整行命令的意思是:在东京地区创建一个 1 G 大小的卷。
调整配置信息
打开你创建的 couchdb 目录,编辑 fly.toml 文件,添加或修改如下信息:
下面是我修改的所有内容。为保证严谨,把自己的配置全部贴一份做个对照:
1 | [build] |
1 | # fly.toml file generated for joxingdb on 2023-03-07T11:42:03+08:00 |
请对比上面提供的配置文件修改自己的 fly. Toml 文件。
设置密码
在终端中输入命令:
1 | flyctl secrets set COUCHDB_PASSWORD=你的密码 |
注意:密码使用大小写字母与数字,不要使用特殊字符。使用特殊字符时会无法识别密码,导致无法登录数据库。
如果想要修改密码,可以再次运行上面的命令。
部署
注意,如果提示 Services defined at indexes: 0 require a dedicated IP address. You currently have no dedicated IPs allocated. Please allocate at least one dedicated IP before deploying,那么需要运行 fly ips allocate-v4。
在终端中输入命令:
1 | flyctl deploy |

稍作等待后提示部署成功。使用下面命令可以打开网页登录:
1 | flyctl open |
网页打开后不是登录界面,这时在网址后加 /_utils/#/setup,跳转后即可输入用户名与密码,成功登录网页。
网页数据库配置
这一大章节都在网页中进行。如果不知道自己的地址,可以打开 fly.io 面板,点击自己的应用,Hostname 处为自己应用的网址。

创建数据库

点击右上角的 Create Database,创建一个数据库,Database name 为数据库名字,注意不要勾选 Partitioned ,然后点 Create 创建。
配置其他信息
打开 Setup 选项卡,填写相关信息。

第一行的 Specify your Admin credentials 为你在上面步骤中配置的用户信息。第二行的 Bind address the node will listen on 意思是监听的访问地址,设置为 0.0.0.0 为允许所有 ip 访问。第三行的 Port that the node will use 为你在调整配置信息这一步中的 fly.toml 文件中配置的端口,如果和我设置的一样,那这里应该是 5984。设置完成后会显示 Apache CouchDB is configured for production usage as a clustered node! Do you want to replicate data?,代表配置成功。
启用 CORS

然后打开 Configuration 选项卡中的 CORS 标签,启用 CORS。注意下方的 Origin Domains 需要设置为 All domains。
至此网页端的操作全部完成!
Obsidian 设置
这一章节的操作都在 Obsidian 本体软件中进行。首先需要关闭 Obsidian 中的安全模式,在插件市场中搜索 Self-hosted LiveSync 下载并启用。
打不开插件市场,是众所周知的网络原因,请自行解决。
配置连接信息
打开 Remote Database configuration 选项卡。输入自己的数据库网址、用户名、密码与数据库名。
- 数据库网址 URI 为
https://你的应用.fly.dev的形式,如果找不到可以使用flyctl open或在 fly.io 面板 中打开自己的应用查看 Hostname 项。 - 用户名与密码为在 调整配置信息 时填写的用户名与在 设置密码 中用命令设置的密码。
- 数据库名为在 创建数据库 时创建的数据库名。

修复连接
点击 Test Database Connection,在右上角出现 Connect to 数据库名,则为连接成功。然后点击 Check database configuration,会出现一堆日志,逐个点击后面的 fix 按钮修复即可。

修复完成后重新点击 Check database configuration,没有出现 fix 按钮即为修复成功。
同步设置
打开 Sync Settings 选项卡,其中有所有的同步方式设置。注意:实时同步 (LiveSync) 与定时同步 (Periodic Sync) 互斥,无法同时打开。在这里强烈推荐使用 LiveSync(实时同步)方式,毕竟这么折腾不就是为了实时同步嘛!

其他设置
在 Sync Settings 选项卡中还包含有 Use Trash for deleted files(删除文件到回收站)配置强烈建议打开,防止文件意外丢失。
在 Miscellaneous 选项卡(一个小扳手图标)中,有选项 Show staus inside editor(在编辑器右上角显示当前同步状态),推荐打开。
同步状态将显示在状态栏,状态都有:
- ⏹️ 准备就绪
- 💤 LiveSync 已启用,正在等待更改
- ⚡️ 同步中
- ⚠️ 出现错误
信息解释:
- ↑ 上传的 chunk 和元数据数量
- ↓ 下载的 chunk 和元数据数量
- ⏳ 等待的过程的数量
- 🧩 正在等待 chunk 的文件数量如果你删除或修改了文件名称,请等待 ⏳ 图标消失。
安装于其他设备
在插件 Setup wizard 选项卡中,点击 Copy Setup URI,弹出的对话框输入你的数据库密码,即可复制当前的配置信息。在其他如 Android、iOS 设备上安装此插件并点击 Open Setup URI 输入复制的链接,然后再输入密码即可。

在上图这里选第一个,意思为将此设备设置为辅助或后续设备。稍等一会儿后即可同步完成。而且同步非常快,只需要几秒钟就好。

这里放一张官网的同步动态图可以感受一下。
排错日志
如果遇到问题,可以点击 Obsidian 左侧的 Show log 查看当前的日志信息。

冲突解决
写文章时可能会出现一些各设备同时编辑相同文章位置的冲突问题,Obsidian 会在各设备中自动弹出有冲突的地方。

这是 PC 端弹出的对话框。

这是 iPhone 端。这时只需要选择保留哪些内容就好,合并内容插件会自动解决。
推荐方案
值得注意的是,不应该在 Obsidian 中存放太多媒体文件,如:Markdown 文件直接引用本地图片或音频。不然会显著拖慢任何 WebDAV 或 LiveSync 的同步速度。做一个对比,我的 Obsidian 中大概有 60 篇左右笔记与博文,本地源文件只有 500 KB,数据库占用只有 1.5 MB 左右。如果使用本地引用图片,那么一张图片就能抵得上我全部笔记的大小,同步时间将成倍的增长。所以,这些媒体文件更应该放入图床或对象存储中,使用 ![]() 的形式引用。
至于图床嘛,网上有各种免费的图床服务,比如 SM. MS 等,但是这类服务通常情况下国内访问会有问题,并伴随着各类暂停服务、跑路等情况,这时你又需要修改文章图片引用路径,所以还是推荐自建或各云服务商的对象存储服务。自建图床的话我以后会出一期教程,我目前使用 Picgo 中安装兰空图床插件的方案上传图片,如果你在手机上编辑文章也可以使用 PicHoro 这款图床管理软件,功能十分强大。图片可以使用 Squoosh 全部优化为 Webp 格式,显著降低图片占用,访问更快速更友好。
后记
Fly. Io 部署的服务体验太好了。Obsidian 各端同步起来非常快,虽然看面板只是一个 256 MB 的小机器,但是这个任务完全可以胜任。Fly. Io 每个账户的免费资源包括:总共 3 GB 的卷、最多 3 个共享 CPU-1 x 256 MB 虚拟机、每月 160 GB 出站数据传输(亚洲地区其他少数地区好像只有 30 G )。Self-hosted LiveSync 同步速度除了快就是快,刚在电脑上写完一句话,想起有事情准备走,拿起手机打开 Obsidian,完全可以接着继续编辑,无缝同步的体验真是太棒了!绝对是 Obsidian 非官方同步服务的最佳方式。