Obsidian同步 -- Self-hosted LiveSync

起因

最近obsidian的remotely save同步玩腻了,每次都要手动太麻烦了,而且它是根据文件的新旧来处理差异的,要是同步插件的话,bug更多了。

后来刷论坛的时候发现了Self-hosted LiveSync,看了一下非常优美,可以实现实时同步,同步的速度也很快,就是需要一个服务器,这是官方的例图
obsidian_live_sync_demo

这个项目部署还是有点麻烦的,但是网上和坛里的教程都不是那么完整,要么就是比较旧的,所以我部署后打算简单做个教程并说明一些踩坑点。

前提条件

  • 一台服务器
  • 一个域名

原理

通过 CouchDB 作为后端数据库,在多个设备之间实现实时同步、冲突解决 和 历史版本保存。

  • CouchDB 是一个 同步笔记的中转站。

  • 插件相当于一个「上传/下载客户端」,不断地 检测本地文件变化 → 更新数据库 → 从数据库拉取最新内容

  • 最终效果:实现了官方一样的实时同步,但数据完全掌握在自己手里。

部署过程

官方教程

第一步docker部署CouchDB数据库

  • docker-compose配置
services:
  couchdb:
    image: couchdb:latest
    container_name: couchdb-for-ols
    user: 5984:5984
    environment:
      - COUCHDB_USER=user_name  #输入账号
      - COUCHDB_PASSWORD=passport #输入密码
    volumes:
      - ./couchdb-data:/opt/couchdb/data
      - ./couchdb-etc:/opt/couchdb/etc/local.d
    ports:
      - 5984:5984
    restart: unless-stopped

:light_bulb:注意:创建挂载目录并修改权限,否则couchDB无法读写,docker会启动失败

mkdir -p ./couchdb-data ./couchdb-etc
sudo chown -R 5984:5984 ./couchdb-data ./couchdb-etc
  • 拉取运行容器
    docker-compose up -d
  • 现在可以通过http://ip:5984/_utils来访问数据库了

接下来初始化数据库

  • 官方给了一键脚本,也可以手动操作但是很麻烦
# 添加环境变量
export hostname=localhost:5984
# 之前docker-compose.yml配置里设置的账号密码
export username=user_name
export password=passport
# 执行脚本
curl -s https://raw.githubusercontent.com/vrtmrz/obsidian-livesync/main/utils/couchdb/couchdb-init.sh | bash
  • 结果如下时,初始化完成。
-- Configuring CouchDB by REST APIs... -->
{"ok":true}
""
""
""
""
""
""
""
""
""
<-- Configuring CouchDB by REST APIs Done!
  • 在CouchDB中创建一个数据库
    • 进入http://ip:5894/_utils并输入账号密码登入
    • 进入Databases,点击Create Database创建一个数据库,名称自起如obsidian-notes
    • Partitioning分区选择第一个Non-partitioned

配置nginx反向代理

如果仅在局域网内使用且仅使用电脑端设备,可以跳过此步骤。
要实现移动端同步的话则需要配置反向代理配置ssl证书。

server {
    listen 80;
    server_name 反代域名;
    return 301 https://$host$request_uri;
}
server {
    listen 443 ssl http2;
    server_name 反代域名;
    ssl_certificate 证书路径;
    ssl_certificate_key 密钥路径;
    location / {
        proxy_pass http://127.0.0.1:5984;
        proxy_redirect off;
        proxy_buffering off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
    client_max_body_size 0;
}
  • 再者懒得弄配置也可以通过宝塔、1panel、nginx proxy manager等一键反代,我就不细讲了

Obsidian客户端 Self-hosted Livesync 插件设置

  1. 前往社区下载 Self-hosted Livesync 插件并启用,先去设置切换一下中文
  2. 点击卫星按钮 :satellite: 进入远程配置
  3. 再切换到同步设置中选择同步模式LiveSync就是实时同步
  4. 如果要同步插件、设置、主题的话
    • 进入self-hosted livesync中启用高级功能,上方会出现一个插头
    • 点击它进入后先设置设备名称,所有同步设备都要统一名称,之后就能开启自定义同步了
    • 点击下方的Open,可以查看已经上传的设置配置
    • 如何将已上传的插件同步到其他设备我研究了好一会
      • 首先点击Maintenance mode
      • 然后将你要选择同步的插件的-符号切换成设备名称
      • 这时右边出现了一个勾,点击它或者点上面的Apply All Selected就能实现同步该插件了

:high_voltage: Obsidian 客户端使用注意

  • 第一次同步:建议选 “以本地文档为准”,它会自动重构数据库,不然容易混乱。

  • 多设备:新设备尽量用空仓库开始,不要直接在已有 vault 上开同步,否则容易出现差异。

  • 插件同步:确实有 bug,插件/主题/设置我也建议用 Git 来维护,而不是完全依赖 Livesync。

58 个赞

好文,特别是这步我之前卡了挺久 :melting_face:

打个记号 我obsidian多设备用 很需要

我倒是感觉remotely save挺方便的,我有ctrl+s保存的习惯,就把这个组合键改成了同步

奇怪 设置好了 链接url 报错 look wrong/…

原来位置没对

mark 住,现在在用remotely save

这两天刚好也在部署这个。非常好用。

1 个赞

定时同步就好,实时的万一扫盘呢

感谢大佬

我部署好了 手机电脑同时打开 光上传不下载呢.. :rofl: 啥都没同步

1 个赞

所以直接使用syncthing就行了,反正就是一文件夹

2 个赞

我手机的新建 和输入 电脑能同步看到 电脑的手机看不到…设置都是一致的 :rofl:是咋回事啊

看起来像是电脑端push出问题了,可以电脑端创建一个文件,看看日志有什么报错没

我开了详细日志没找到看的地儿

也能设置手动同步,反正是开源项目,怕可以先问问ai呗


这玩意 我只要开启livesync就报..

1 个赞

self-hosted livesync插件的日志,左边工具栏有个盒子样的东西
image

我好像没遇到过这个问题,点恢复没有用吗

点恢复就一直循环…

看看日志为什么触发紧急停止