Obsidian多端同步插件LiveSync

网友 LeoPaco反馈,群晖升级到 DSM7.2 ,注册表可以搜索镜像,根据 Leo 贴的 /var/packages/Docker/etc/dockerd.json 的内容,DSM7.2 应该是使用了 https://docker.nju.edu.cn 作为注册表镜像,但老苏测试过下面几种情况都不行,有需要的可以自己实际测试

  • 上海:DSM6.2.3DSM6.1.7
  • 深圳:DSM7.1.1

本文应网友Mr.Chow 的要求折腾;

这个需求有一段时间了,一方面老苏自用的方案是 Obsidian + syncthing,另一方面通过 cloudflare Tunnel 反代的域名连接时,一直有问题,就这么一直搁置了。最近老苏折腾了通过 https 访问 Tailscale 网络后, 正好可以用来试验一下

文章传送门:用自定义域名访问tailscale节点

什么是 Obsidian LiveSync ?

Obsidian LiveSync 是一个社区实现的 Obsidian 笔记同步插件。使用 CouchDB 数据库作为同步的中间服务器,能够在所有兼容 Obsidian 的平台上使用。需要注意的是,Obsidian LiveSync与官方的 Obsidian Sync 不兼容。

什么是 CouchDB ?

Apache CouchDB 是一个开源数据库,专注于易用性和成为 “完全拥抱 web的数据库”。它是一个使用 JSON 作为存储格式,JavaScript 作为查询语言,MapReduceHTTP 作为 API 的面向文档的 NoSQL数据库。

前期准备

将下面的内容保存到 local.ini 文件

源文件来自:https://github.com/vrtmrz/self-hosted-livesync-server/blob/main/conf/local.ini,老苏测试验证时有微调,但其实可能并没有起作用,应该可以用官方的原始的版本;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[couchdb]
single_node=true
max_document_size = 50000000

[chttpd]
require_valid_user = true
max_http_request_size = 4294967296

[chttpd_auth]
require_valid_user = true
authentication_redirect = /_utils/session.html

[httpd]
WWW-Authenticate = Basic realm="couchdb"
enable_cors = true

[cors]
origins = app://obsidian.md,capacitor://localhost,http://localhost
credentials = true
headers = accept, authorization, content-type, origin, referer, cache-control, x-requested-with
methods = GET, PUT, POST, HEAD, DELETE, OPTIONS
max_age = 3600

这个文件要放入 couchdb 目录

安装 CouchDB

在群晖上以 Docker 方式安装。

Web GUI 安装

在注册表中搜索 couchdb ,选择第一个 couchdb,版本选择 latest

本文写作时, latest 版本对应为 3.3.2

docker 文件夹中,创建一个新文件夹 couchdb,并在其中建一个子文件夹 data,将前面准备的 local.ini 放入 couchdb 目录

文件夹 装载路径 说明
docker/couchdb/data /opt/couchdb/db 存放数据库
docker/couchdb/local.ini /opt/couchdb/etc/local.ini 配置文件

端口

本地端口不冲突就行,不确定的话可以用命令查一下

1
2
# 查看端口占用
netstat -tunlp | grep 端口号
本地端口 容器端口
5984 5984

默认开了 3 个端口

但实际上 43699100 用于集群部署,只有 5984CouchDB 的主要端口,用于提供 HTTP APIWeb 界面。无论是单机模式还是集群模式,都使用这个端口,所以老苏把不用的端口删掉了

环境

可变
COUCHDB_USER 用户
COUCHDB_PASSWORD 密码

docker cli 安装

如果你熟悉命令行,可能用 docker cli 更快捷

1
2
3
4
5
6
7
8
# 新建文件夹 couchdb
mkdir -p /volume1/docker/couchdb

# 进入 couchdb 目录
cd /volume1/docker/couchdb

# 创建 local.ini 文件
touchu local.ini

FileStation 中打开 local.ini,将上面的内容粘贴进去

接下来就可以用 docker-cli启动了

1
2
3
4
5
6
7
8
9
10
# 运行容器
docker run -d \
--restart unless-stopped \
--name couchdb \
-p 5984:5984 \
-v $(pwd)/local.ini:/opt/couchdb/etc/local.ini \
-v $(pwd)/data:/opt/couchdb/db \
-e COUCHDB_USER=admin \
-e COUCHDB_PASSWORD=password \
couchdb

docker-compose 安装

也可以用 docker-compose 安装,将下面的内容保存为 docker-compose.yml 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
version: '3'

services:
couchdb:
image: couchdb
container_name: couchdb
restart: unless-stopped
ports:
- 5984:5984
volumes:
- ./local.ini:/opt/couchdb/etc/local.ini
- ./data:/opt/couchdb/db
environment:
- COUCHDB_USER=admin
- COUCHDB_PASSWORD=password

docker-compose.ymllocal.ini 放入当前目录,然后一键启动

1
2
# 一键启动
docker-compose up -d

修改 local.ini

每次容器启动之后,local.ini 的文件所有者都会变成 5984:5984。这是 docker 镜像的限制,请修改文件所有者或者赋予写权限后再编辑 local.ini

编辑权限,勾选 写入 权限

之后就有 w 权限了

每次重启之后,如果想要修改 local.ini 文件,都要重复上面的操作

运行

在浏览器中输入 http://群晖IP:5984 就能看到登录界面

输入前面设置的 COUCHDB_USERCOUCHDB_PASSWORD 的值,会看到一行 JSON

1
{"couchdb":"Welcome","version":"3.3.2","git_sha":"11a234070","uuid":"f151341b0599adeb5deacd59baa02074","features":["access-ready","partitioned","pluggable-storage-engines","reshard","scheduler"],"vendor":{"name":"The Apache Software Foundation"}}

在浏览器中输入 http://群晖IP:5984/_utils/

可以修改 CORS等参数设置

反向代理

如果只有PC端需要同步,使用 http 协议即可,但是如果移动端也要同步,则需要使用 https 协议,所以反代是必须的

假设我们要使用的域名是 https://ol.laosu.ml

开始尝试过 cloudflared + npm 方案,但在同步测试时,会报错

在调试界面能看到下面的日志,但没找到解决办法

1
acess to fetch at 'https://ol.laosu.ml/test/' from origin 'app://obsidian.md' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

下面采用的是 tailscale + npm方案

没问题的话可以都勾上

客户端插件

【注意】:在进行下面的操作前,记得先备份好笔记,备份好笔记,备份好笔记~~~

老苏只测试了 windows 版的 Obsidian 客户端,其他平台的未验证,尤其是手机端未验证,因为老苏习惯把图片和附件也放在 obsidian 库中,所以整个资料库有 30G 以上;

在插件市场搜索 livesync

安装完成后,还需要启用插件

局域网使用,URI 使用 http://群晖IP:5984

  • Usename:对应 COUCHDB_USER 的值;
  • Password:对应 COUCHDB_PASSWORD 的值;
  • Database Name:随便填;

互联网使用,URI 使用前面反代的域名https://ol.laosu.ml即可

Device name 是用来区分不同的终端的,启用同步

同步状态将显示在状态栏

可以在数据库中查看 test

进入库能查看记录

小结

虽然网上很少权威的评测,但是从网上能找到的资料看,在插入大量数据时, CouchDBRDBMS(例如 MySQL)慢很多,主要原因是 CouchDB 使用 HTTP 协议来操作数据库,可能会造成网络性能略差。

参考文档

vrtmrz/obsidian-livesync
地址:https://github.com/vrtmrz/obsidian-livesync

vrtmrz/self-hosted-livesync-server
地址:https://github.com/vrtmrz/self-hosted-livesync-server

obsidian-livesync/docs/setup_own_server_cn.md at main · vrtmrz/obsidian-livesync · GitHub
地址:https://github.com/vrtmrz/obsidian-livesync/blob/main/docs/setup_own_server_cn.md

不使用第三方软件实现Obsidian多平台实时同步 - 经验分享 - Obsidian 中文论坛
地址:https://forum-zh.obsidian.md/t/topic/2811

Obsidian 与 CouchDB 的同步配置 - StarryVoid - Blog
地址:https://blog.starryvoid.com/archives/1164.html