2
0

基于服务器与 Syncthing 的 Obsidian 同步架构实践

2026-06-24
基于服务器与 Syncthing 的 Obsidian 同步架构实践

Obsidian 是一款非常好用的知识管理库软件,我在被AI安利下载使用了一段时间之后就对此爱不释手了,给手机、平板、电脑三端都安装上了这款超级好用的软件。但这时就会有个三端 Vault 同步问题,这个开启 Obsidian 会员可以解决(也是会员的主要功能,其他绝大部分功能都不需要开会员就能使用,相当良心!)。当然,要是和我一样有服务器的话,也可以自己折腾一下,通过 P2P 同步神器 Syncthing 零成本构建一套极其稳健、且完全受自己掌控的端到端同步流水线。

📍 架构选型:为什么是 Syncthing?

在多端同步方案中,社区里有很多流派(比如基于 CouchDB 的毫秒级 LiveSync 插件,或者基于 Git 的定时推送)。经过严谨的调研,我最终将架构锁定在了 Syncthing 上。

原因如下:

  1. 物理隔离,稳如磐石:Syncthing 不关心笔记软件的内部逻辑,它只负责在系统底层比对并搬运 .md 纯文本文件。这种解耦设计意味着哪怕笔记软件崩溃,我们的数据依然安全地躺在各个设备的本地硬盘里。
  2. 离线优先,极其省电:它不需要我们在打字时保持毫秒级的长连接。在安卓平板上,完全可以设置成“仅在连接 WiFi 且充电时”在后台静默同步。出门在外,打开平板就是全量离线的笔记库,彻底告别网络焦虑。
  3. 资源极度友好:我的 2C2G 服务器上已经跑着很多其他组件,内存只剩下不到 200MB。而 Syncthing 服务端(Go语言编写)日常内存占用仅在 50MB 左右,完美的“资源缝合怪”。
  4. 泛用性好: Syncthing 不像 obsidian 内置插件,它还可以同步其他你想同步的文件!

🛠️ 第一阶段:搭建 24 小时云端中转站

虽然 Syncthing 支持局域网直连,但为了确保我们在哪里都能无缝同步,我们需要在云服务器上部署一个全天候在线的中转节点(Relay/Device)。

我们采用 Docker Compose 进行极简部署:

1. 创建挂载目录与权限交接

为了防止 Docker 容器出现权限报错,必须先在宿主机分配好目录并移交权限(Syncthing 默认使用 UID 1000):

mkdir -p ~/syncthing/config
mkdir -p ~/syncthing/data
# 赋予权限,防止权限不足报错
chown -R 1000:1000 ~/syncthing
cd ~/syncthing

2. 编写编排图纸

新建 docker-compose.yml 文件:

services:
  syncthing:
    image: syncthing/syncthing:latest
    container_name: syncthing
    hostname: aliyun-relay-node # 给中转节点起个帅气的名字
    environment:
      - PUID=1000
      - PGID=1000
    volumes:
      - ./config:/var/syncthing/config 
      - ./data:/var/syncthing/data     # 存放中转的数据
    ports:
      - "8384:8384"             # Web 控制台端口
      - "22000:22000/tcp"       # 核心同步端口 (TCP)
      - "22000:22000/udp"       # 核心同步端口 (QUIC)
      - "21027:21027/udp"       # 局域网发现端口
    restart: unless-stopped

3. 启动并配置反向代理

执行 docker compose up -d 拉起服务。随后,在 Nginx 中为 8384 端口配置反向代理(如 sync.你的域名.com)。

但配置 Nginx 之前,需要先到云端控制台配置子域名 DNS 解析,以阿里云的控制台举例:在服务器实例的 域名 选择下面,点击 添加域名解析,然后照着下面填:

  1. 主机记录:填入 sync (这样拼起来就是我们要的 sync.域名.com)。
  2. 记录类型:选择 A 记录 (A 记录 的意思就是把域名指向一个 IPv4 地址)。
  3. 记录值 / IP 地址:默认。

设置成功后我们就可以去配置 Nginx 代理了。

通常 Nginx 的子配置文件会放在 /etc/nginx/conf.d/ 目录下。我们只需要新建一个名为 syncthing.conf 的文件,把下面这段配置原封不动地复制进去(只需把中文部分替换成解析好的子域名):

server {
    listen 80;
    server_name sync.你的域名.com;  # 这里换成专门给同步留的子域名

    location / {
        proxy_pass http://127.0.0.1:8384; # 直接转发给本机内部的 Syncthing
        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;
    }
}

保存退出后,在终端敲一行 nginx -s reload 重载服务,这条通道就彻底打通了!

注:如果是通过 docker 跑起来的 Nginx 的话,那就不存在 /etc/nginx/conf.d/ 目录,因为 docker 跑的实际上是 Nginx Proxy Manager (NPM)。这时可以打开浏览器,访问 http://你的服务器IP:81,输入管理员账号密码登录进去。

Add Proxy Host 下填:

  • Domain Names:填入解析好的 sync.域名.com,然后敲一下回车键固定住。
  • Scheme:保持 http 不变(因为 Nginx 和容器之间是走内网明文)。
  • Forward Hostname / IP:绝对不能填 127.0.0.1!填服务器的内网 IP 或者公网 IP(或者 Docker 默认网关 172.17.0.1 也可以)。
  • Forward Port:填入 Syncthing 的控制台端口 8384
  • Websockets Support 打勾,但Cache AssetsBlock Common Exploits 千万别勾,否则可能会出现设置了 syncthing 控制台账号和密码后无限重连刷新问题!

既然是密码管理后台,裸奔 HTTP 是极度危险的,可以披上HTTPS 的安全铠甲:

  1. 切换到顶部的 SSL 标签页。
  2. 在 SSL Certificate 下拉框里选择 Request a new SSL Certificate
  3. Force SSL(强制 HTTPS 跳转)打上勾。
  4. 点击 Save,稍微耐心等待一会儿,NPM 正在全自动向各大机构申请免费证书。

现在,在浏览器里输入 https://sync.域名.com,就能直接看到 Syncthing 管理后台了。

⚠️ 安全警告 :首次通过域名访问 Web 控制台时,务必第一时间前往 操作 -> 设置 -> 图形用户界面 中设置强壮的管理员账号和密码,否则控制台将暴露在公网。

📱 第二阶段:打通 PC 与移动端的任督二脉

有了云端节点作为桥梁,接下来的操作就如同搭积木一样顺畅。

  1. 安装客户端:在 PC 和移动端上分别安装 Syncthing 的官方客户端。
  2. 互相添加设备(Full Mesh 全网状拓扑): 在任何一个 Syncthing 界面中,都有一个全球唯一的“设备 ID”(一长串字符或二维码)。 需要进行两两互加:让 PC 加上云服务器,让移动端加上云服务器,最后让 PC 和移动端也互相加上。这样就能形成一个无论谁在线,数据都能找到回家路的最优网络。

📁 第三阶段:Vault (库) 的物理映射与多套库管理

这是整个架构中最令人兴奋的部分。在 Obsidian 的底层逻辑中,一个 Vault 就是一个普普通通的文件夹。这意味着只要我们同步了这个文件夹,我们就同步了一切。

同步策略: 在 PC 端的 Syncthing 中,点击“添加文件夹”,选择我们现有的 Obsidian Vault 根目录,并勾选共享给“云服务器”和“移动端”。 稍等片刻,移动端上就会弹出“收到新文件夹共享”的提示,将其保存在移动端的本地存储中。

💡 极客红利:环境 100% 一致性 Obsidian 的所有非官方插件、主题皮肤、快捷键配置,并没有安装在全局系统里,而是全部静静地躺在 Vault 根目录下的隐藏文件夹 .obsidian 中。

这意味着,当 Syncthing 完成底层目录的搬运后,我们在移动端上打开这个 Vault,它会自动继承我们在 PC 上配置好的全套几十个神级插件和绚丽主题! 完全不需要在平板上重新搜索下载、重复配置。这就是将配置与库深度绑定的架构魅力。

如果有多个知识库(比如工作库、生活库),只需要在 Syncthing 中添加多个相互独立的文件夹映射即可,它们会在底层进行完全物理隔离的同步,互不干扰。

在同步时,如遇到同步传输速度奇慢的状况(连接类型 为“中继广域网”),请检查一下是否放行了服务器 22000 端口的 TCP UDP 协议(两个都要放行,22000 端口是 Syncthing 真正在底层用来疯狂搬运文件块的核心端口)。放行之后点击传输端syncthing页面的 操作 -> 重启,这时 连接类型 会从“中继广域网”变成了 “TCP 广域网 (TCP WAN)” 或者是 “QUIC 广域网”,并且地址变成了你真实的 IP 加上 :22000,那就说明直连通道彻底贯通了!

🏁 结语

对我个人而言,是不需要“Web 端毫秒级实时在线协作”的特性的,所以 syncthing 的延迟是完全可以接受的,如果需要实时多地编辑的话,syncthing 可能就不太适合了,所以明确自己的需求,找到合适的解决方案才是最应该做的事情。

评论