自建 Syncthing 多设备同步:完整搭建指南

自建 Syncthing 多设备同步:完整搭建指南

胖张Dev ·

之前在 《学习 Karpathy 的 LLM-Wiki 方法论之后的自我实践》 这篇文章里,我自建了一套 LLM-Wiki 知识库。这套知识库跑在一台 Mac 和一台 Linux 服务器上,需要通过一套自动同步的方案来实现多端同步和数据备份。

我选了 ZeroTier + Syncthing 的组合:ZeroTier 组虚拟局域网,让不同网络下的设备永远能互通,Syncthing 做文件 P2P 同步,数据只存在我自己的机器上。两个工具搭一起,等于造了一个免费的、跨设备的、加密的个人网盘。

ZeroTier 官网

这篇文章把 Syncthing 的搭建过程讲完整。ZeroTier 组网的部分会单独写一篇,不在本文展开(假设你已经把 ZeroTier 跑起来了,设备之间能用固定虚拟 IP 互通)。

01 我的环境

三台设备:

  • MacBook Pro:主力开发设备,随身携带、日常开发、写 Obsidian
  • 家里的 x86 小主机:24 小时开机,跑着 Docker,存着知识库的另一份副本——这是 Syncthing 备份的目标设备
  • 建议使用【阿里云轻量应用服务器】:来搭 ZeroTier 的 Moon 中继节点。这台是我用阿里云新用户免费试用薅来的

以前买的x86小主机

这些设备用 ZeroTier 拉了一个虚拟局域网,分配了固定虚拟 IP。Mac在公司或者户外,都能通过虚拟 IP 和家里的小主机互通。Moon 节点负责让两台设备在网络不稳定的时候也能稳定中继。

02 为什么是 Syncthing + ZeroTier,不是别的

简单对比下方案:

方案问题
商业网盘(坚果云、阿里云盘、百度网盘、Dropbox)订阅制,数据在别人的云上,可能触发风控,导致数据被删除
SyncthingP2P 直传、开源免费、无容量限制

Syncthing 解决了文件同步,但它不管网络。Mac 的公网 IP 在办公网、家里 Wi-Fi、户外等地方之间切换,Syncthing 自己找不到对方,所以需要一个稳定的组网方案。

我的方案是 ZeroTier 做网络层——让两台设备以为自己永远在同一个局域网里,固定一个虚拟 IP,然后 Syncthing 走这个虚拟 IP 做文件同步。

国内想稳定可靠使用ZeroTier,最好要搭建Moon中继。

03 安装 Syncthing

Mac 端

brew install syncthing

启动并设置开机自启:

brew services start syncthing

打开浏览器访问 http://127.0.0.1:8384,看到 Syncthing 的 Web GUI 就成功了。

服务器端

Linux 端我用 Docker(官方镜像),不污染宿主机:

docker run -d \
  --name syncthing \
  --hostname syncthing \
  -p 8384:8384 -p 22000:22000/tcp -p 22000:22000/udp -p 21027:21027/udp \
  -v /srv/syncthing/config:/var/syncthing/config \
  -v /srv/syncthing/data:/var/syncthing \
  --restart unless-stopped \
  syncthing/syncthing:latest

注意几点:

  • config 目录挂到宿主机,容器重建配置文件不丢
  • --restart unless-stopped 保证服务器重启后自我恢复
  • 记得开防火墙 8384(Web GUI)、22000(同步)、21027(UDP 广播)端口

访问 http://zerotier_ip:8384 应该能看到服务器端的 Web GUI。

04 互相添加设备

Syncthing 在局域网内能自动发现设备,但自动发现出来的地址经常是真实局域网 IP(比如 192.168.1.x),不固定。

正确做法是手动指定 ZeroTier 虚拟 IP

  1. 在 Mac 端的 Web GUI,点「添加远程设备」,常规 -> Device ID 从服务器端复制过来
  2. 高级 -> 地址,手动填:tcp://zerotier_ip:22000(服务器的 ZeroTier IP)
  3. 正常情况下,服务器的Web GUI那边,会弹出窗口,询问你是否同意某台设备的远程连接,确认并命名即可。

两边都加了,连接才算建起来。Web GUI 状态栏显示 已连接 就通了。

ZeroTier + Syncthing 多设备同步连接成功界面

05 共享文件夹

我的 my-wiki 目录在 Mac 上,所以由 Mac 发起共享:

打开 Mac 端 Web GUI → 「文件夹」→ 「+添加文件夹」:

  • 文件夹路径:填 Obsidian Vault 路径,比如 /Users/xxx/my-wiki
  • 文件夹标签:随便起,比如 my-wiki
  • 共享:勾选 Linux 服务器这台设备,并输入密码,这样Linux上的数据即使泄漏,也能够保证数据无法解密。

Syncthing 在 Mac 端添加 Obsidian Vault 同步文件夹设置

勾选远程服务器,务必设置密码

06 配置 .stignore

每个同步目录根目录可以建一个 .stignore,告诉 Syncthing 哪些文件别同步。

我一开始没配,裸跑了几周,发现确实有几类文件不该同步

  • Obsidian 的 .obsidian/workspace 是工作区状态,每台设备独立,同步反而冲突
  • macOS 系统文件 .DS_Store
  • 临时文件、日志、node_modules/.git/

我的 .stignore

// Obsidian 本地状态,每台设备独立的不一样
.obsidian/workspace
.obsidian/workspace-mobile.json
.obsidian/app.json
.obsidian/appearance.json

// macOS 系统文件
.DS_Store
.AppleDouble
.LSOverride
._*

// 临时文件和代码依赖
*.tmp
*.log
node_modules/
.git/

// Syncthing 自己的
.stfolder

注释用 //,支持通配符,改完自动生效不用重启。

07 Web GUI 安全设置

Syncthing 的 Web GUI 默认没有密码。如果你走 ZeroTier,网段内其他机器打开浏览器访问虚拟 IP + 8384 端口就能看到控制台。

必做

Web GUI 右上角 → 操作 → 设置 → GUI → 「GUI 身份验证用户」和「GUI 身份验证密码」,输入点击保存。

设置 Web GUI 的登录账号密码


08 常见故障排查

现象检查思路解法
设备连不上ZeroTier 互通吗?防火墙开端口了吗?ping 虚拟 IP,再看防火墙 22000
同步卡住不动GUI 里看「最近更改」,可能有大文件在传等几分钟,别急着重启
一堆 .sync-conflict 文件两台设备同时改了同一个文件手动看一眼合并,Syncthing 不会自动解冲突
重启服务器后连不上ZeroTier 虚拟 IP 变了吗?用 ZeroTier 静态 IP,或写个启动检查脚本
Web GUI 打不开Syncthing 进程挂了吗?brew services restart syncthingdocker restart syncthing

最后

搭完之后最大的变化就是,不再想「这个文件在哪台机器上了」。

Mac 上改了东西,服务器自动拿到。Mac 关了几天没关系,开机回来数据全在里面。ZeroTier 管网络打通,Syncthing 管传文件,没人知道你存了什么。

成本方面:

  • ZeroTier:免费
  • Syncthing:免费
  • 家里 x86 小主机:(家里现有的机器,你也可以使用其他旧电脑来搭建)
  • Moon中继服务器(续费:最低40-50/月)
CC BY-NC-SA

知识共享协议

本文采用 CC BY-NC-SA 4.0 许可协议

转载请注明出处,不得用于商业用途,演绎作品需采用相同协议

微信搜一搜 胖张Dev

微信搜一搜「胖张Dev」

暂无评论

添加新评论