Obsidian 官方 Sync 月付 $5 起,Plus 档 $10,而且是按库收费 —— 主力库加一个工作库,一年就是 $120 到 $240。容量还有上限,Standard 档连附件总共 1GB,图片和 PDF 一多就得升级。
自建一套 LiveSync + CouchDB,一台 $5/月的小鸡就能跑,库不限数量,版本历史也不额外收钱。
但先把话说在前面:自建不比官方便宜多少。一台 VPS 的钱跟官方 Sync 的月费差不多,你还得自己维护 CouchDB、处理证书、偶尔排查同步故障。真正值得自建的是这几种情况:
- 库多,或者单库体积大,官方档位不够用
- 笔记里有大量图片、PDF 附件
- 想自己掌控数据,不想把笔记放在别人服务器上
- 本来就有 VPS 闲着
如果只写纯文本、一个库、图省事,官方 Sync 确实更划算 —— 花钱买的就是不用管这些。
| 官方 Sync | Self-hosted LiveSync | Remotely Save | Syncthing | Git 插件 | |
|---|---|---|---|---|---|
| 费用 | $5-10/月·库 | 免费 + VPS | 免费 + 云盘 | 免费 | 免费 |
| 实时性 | 实时 | 实时 | 定时/手动 | 实时 | 手动 |
| 端到端加密 | ✅ | ✅(可选) | 看云盘 | ❌ | ❌ |
| 版本历史 | ✅ 1年/无限 | ✅ 无限 | ❌ | 有限 | ✅ 完整 |
| iOS 支持 | ✅ 原生 | ✅ | ✅ | ⚠️ 需第三方 | ⚠️ 体验差 |
| 冲突处理 | 自动 | 自动合并 + 手动审查 | 文件冲突 | 生成冲突文件 | 手动 merge |
| 维护成本 | 无 | 中 | 低 | 低 | 低 |
两个容易搞混的点:
Remotely Save 不是实时的。 它按定时器或者打开 App 时同步,两台电脑在两次同步之间改同一个文件就会冲突,而且没有同步记录。
Syncthing 在 iOS 上没有官方客户端。 站内那篇 VPS 搭建 Syncthing 讲过部署,桌面之间用它很舒服,但手机这块是硬伤。
LiveSync 的位置是:免费、实时、有版本历史、手机能用。代价是配置麻烦,以及你得自己养一个 CouchDB。
CouchDB 本身很轻,但它是 Erlang 写的,空载也要吃掉两三百 MB 内存。加上同步时要把变更集在内存里过一遍:
| 配置 | 能不能用 |
|---|---|
| 1 核 512MB | 能跑,并发同步时容易 OOM,不推荐 |
| 1 核 1GB | 能用,单人或两三台设备够 |
| 1 核 2GB | 舒服,推荐起步 |
| 2 核 2GB+ | 设备多、附件多、或者想同时跑别的东西 |
磁盘按笔记库的 3-5 倍预留。 纯文本笔记很小,但 CouchDB 保留每一次修订,改十遍就是十份。附件更占地方 —— 图片、PDF 走的是分块存储,历史版本一样留着。一个 200MB 的笔记库,跑一年可能长到 1GB。20GB 硬盘起步,附件多就往上加。
线路比配置重要。 同步是增量的,但每次同步要来回好几次请求,延迟高的话"打开笔记就能看到最新内容"这个体验会打折。国内用的话选个线路好点的机器,便宜 VPS 推荐里那些月付 $3 以下的,跑这个绰绰有余。
位置:笔记内容如果敏感,注意数据落在哪个司法管辖区。E2EE 开着的话,服务商拿到的是密文,这一点后面会讲。
准备目录:
mkdir -p ~/obsidian-sync/{data,local.d}
cd ~/obsidian-sync
docker-compose.yml:
services:
couchdb:
image: couchdb:3.4
container_name: obsidian-couchdb
restart: unless-stopped
user: "5984:5984"
environment:
- COUCHDB_USER=admin
- COUCHDB_PASSWORD=换成一个长随机密码
volumes:
- ./data:/opt/couchdb/data
- ./local.d:/opt/couchdb/etc/local.d
ports:
- "127.0.0.1:5984:5984"
两个地方要注意:
user: "5984:5984" 不能省。 CouchDB 容器里的进程 UID 是 5984,宿主机上映射出来的 data 目录得归它所有,否则启动就报权限错误:
sudo chown -R 5984:5984 data local.d
端口绑 127.0.0.1。 CouchDB 的 5984 端口一旦暴露在公网,就等于把整个笔记库(包括账号密码入口)挂出去。外面走反代进来,下面会讲。
local.d/livesync.ini —— CouchDB 会把 local.d/ 里的配置合并进来,比直接改 local.ini 干净:
[couchdb]
single_node = true
max_document_size = 50000000
[chttpd]
require_valid_user = true
max_http_request_size = 4294967296
enable_cors = true
[chttpd_auth]
require_valid_user = true
authentication_redirect = /_utils/session.html
[httpd]
WWW-Authenticate = Basic realm="couchdb"
bind_address = 0.0.0.0
enable_cors = true
[cors]
origins = app://obsidian.md, capacitor://localhost, http://localhost
credentials = true
headers = accept, authorization, content-type, origin, referer
methods = GET,PUT,POST,HEAD,DELETE
max_age = 3600
这份配置里,几行是必须的:
single_node = true—— 单节点模式,不然 CouchDB 3.x 会一直提示集群没配置好enable_cors = true+[cors]段 —— Obsidian 是通过 HTTP 从浏览器环境请求 CouchDB 的,没配 CORS 就是一片 Failed to fetchorigins里的app://obsidian.md是桌面版,capacitor://localhost是移动版max_http_request_size要调大到 4GB,不然大附件同步会失败require_valid_user = true关掉匿名访问
启动:
docker compose up -d
docker compose logs -f
浏览器打开 http://127.0.0.1:5984/_utils/(本地的话可以用 SSH 隧道),输入 admin 账号密码,能看到 Fauxton 界面就成了。
移动端强制要求 HTTPS。 官方 Sync 之外的自建方案,iOS 和 Android 上的 Obsidian 只认带合法证书的地址,自签证书会直接被拒。所以证书这一步不是可选项。
用 Caddy 最省事,自动申请续期,反代配置两行:
couchdb.example.com {
encode gzip
reverse_proxy 127.0.0.1:5984
}
Caddy 默认会转发 Host 和 X-Forwarded-* 头,CouchDB 认这些,不用额外配置。CORS 由 CouchDB 自己处理,别在 Caddy 里再加一层,两边都加会出重复头的问题。
如果你用 Nginx,除了常规的 proxy_pass,有个坑必须注意:把 proxy_buffering 关掉。CouchDB 的连续复制是流式的,Nginx 默认的缓冲会让同步卡在半路,表现为"连上了但一直不同步"。
Caddy 的完整配置和其它反代细节,站内这篇 Caddy 反向代理完全指南讲得更细。
在 Obsidian 的社区插件市场搜 Self-hosted LiveSync 装上启用。
插件 1.0 之后加了引导流程(Setup wizard),第一次打开会问你是"第一次搭建"还是"给已有同步加设备"。核心要填的就三样:
| 设置项 | 填什么 |
|---|---|
| URI | https://couchdb.example.com(反代后的地址,不要带 5984 端口) |
| 用户名 / 密码 | CouchDB 的账号密码 |
| 数据库名 | 自己起,比如 obsidian-vault,插件首次同步时自动创建 |
填完点 Test database connection,通了再点 Check and fix 让插件把服务器端需要的东西建好。
最容易出错的一步是首次同步的方向。 插件会问:用这台设备覆盖服务器,还是用服务器覆盖这台设备?
- 服务器是全新的空库 → 选用本机覆盖服务器
- 服务器上已经有数据(比如你已经从别的设备同步过)→ 选用服务器覆盖本机
选反了的后果很直接:本地还没同步上去的笔记被服务器上的空库覆盖掉。动手之前先手动复制一份 vault 出来,这一步花两分钟,能省掉后面所有的后悔。
建议开。开了之后笔记在离开设备之前就被加密,CouchDB 上存的是密文,服务商或者任何拿到服务器的人都读不出内容。
加密口令(passphrase)自己设,这个口令丢了就打不开服务器上的数据。同时建议把「路径混淆」(Path Obfuscation)也打开,不然文件名还是明文的,光看文件名就能猜出你记了什么。
有个细节容易混:保险库加密口令和 Setup URI 口令是两个不同的东西。前者保护数据,后者保护那份配置串。两个都别丢,也别存在同一个地方。
LiveSync 的跨设备配置靠 Setup URI —— 一串以 obsidian://setuplivesync?settings= 开头的加密配置串,包含了连接信息。
在第一台配好的设备上执行命令:
Self-hosted LiveSync: Copy settings as a new Setup URI
输入一个新口令(保护这个 URI 用的),拿到那串东西。然后在第二台设备的 Obsidian 里,从引导流程选「I am adding a device to an existing synchronisation setup」,粘贴 URI 和口令。
这个 URI 等同于钥匙,别发在群里,也别和它的口令走同一个渠道(比如 URI 发微信、口令也发微信,那加密就白做了)。
如果第二台设备是全新空库,引导会让它从服务器拉全量数据。如果本地已经有一份笔记(比如你之前用别的方式同步过),要先看清楚提示再点,别把本地的改动冲掉。
冲突怎么来的:两台设备在离线状态下改了同一个文件,同步到一起时就撞了。LiveSync 会自动合并能合的部分(比如两端改的是文件里不同的段落),合不了的会提示你手动审查。
插件提供了冲突查看界面,能把两个版本并排比对,选一个保留。1.0 之后这块做得细了很多,可以逐个修订看,也可以推迟处理。
版本历史是 CouchDB 的天然能力 —— 每次改动都是一次修订,随时能翻回旧版本。这是它比 Remotely Save 强的地方,也是官方 Sync 要额外收费才给的东西。
但有件事必须说清楚:同步不是备份。
删除操作会同步。你在电脑上误删了一个文件,几秒钟后所有设备上都没了,服务器上那份也跟着没。版本历史能救一部分,但它不是给你防灾难用的。
定期把 vault 用独立的方式备份一份,VPS 自动备份方案里的思路可以直接套用。CouchDB 本身也要备份:
cd ~/obsidian-sync
docker compose stop couchdb
sudo tar czf ~/couchdb-backup-$(date +%F).tar.gz data local.d
docker compose start couchdb
停服务再打包是最稳的(CouchDB 运行中直接复制文件有拿到不一致状态的风险)。嫌麻烦的话,也可以在 Fauxton 里用 Replication 功能把数据库复制到另一个 CouchDB 实例,那是不停机的方式。
Failed to fetch / CORS 报错:九成是 [cors] 段没配好,或者反代把 CORS 头吃掉了。检查 origins 里有没有 app://obsidian.md,以及 Caddy/Nginx 里有没有重复添加 CORS 头。
能连接但一直不同步:用 Nginx 的话检查 proxy_buffering off 有没有加。用 Cloudflare 的话,注意免费版对长连接有超时限制,同步大附件时可能被掐断。
手机端连不上,桌面端正常:证书问题。手机端要求合法 CA 签发的证书,自签或者过期都不行。用 curl -v https://couchdb.example.com 看证书链完不完整。
数据库越来越大:CouchDB 不会自动回收旧修订,需要手动或定期压缩:
curl -u admin:密码 -X POST https://couchdb.example.com/obsidian-vault/_compact \
-H "Content-Type: application/json"
插件的设置里也有自动压缩(Auto Compaction)的开关,开启后省心。另外记得定期清理不再需要的附件历史。
换了域名或者证书:插件里的 URI 要跟着改,改完重启 Obsidian 再同步。
忘了加密口令:数据在服务器上是密文,口令丢了就只能从还有完整副本的设备上重新导出。这也是为什么要留一台设备存着完整数据,别所有设备都只依赖服务器。
算一笔账:一台 1 核 2GB 的小鸡,年付大概 $30-50,能跑同步、跑博客、还能顺便干点别的。官方 Sync 一个库一年 $48-96,两个库翻倍,而且容量和版本历史的档位卡得比较死。
如果你本来就有一台 VPS,边际成本接近零,那没什么好犹豫的。如果为了这个专门去买一台,只是图省钱 —— 算上配置和排障花掉的时间,未必划算。
真正的收益是数据在自己手里,以及不用为每一个新库再付一份钱。
延伸阅读:
