之前在 《学习 Karpathy 的 LLM-Wiki 方法论之后的自我实践》 这篇文章里,我自建了一套 LLM-Wiki 知识库。这套知识库跑在一台 Mac 和一台 Linux 服务器上,需要通过一套自动同步的方案来实现多端同步和数据备份。
我选了 ZeroTier + Syncthing 的组合:ZeroTier 组虚拟局域网,让不同网络下的设备永远能互通,Syncthing 做文件 P2P 同步,数据只存在我自己的机器上。两个工具搭一起,等于造了一个免费的、跨设备的、加密的个人网盘。
这篇文章把 Syncthing 的搭建过程讲完整。ZeroTier 组网的部分会单独写一篇,不在本文展开(假设你已经把 ZeroTier 跑起来了,设备之间能用固定虚拟 IP 互通)。
01 我的环境
三台设备:
- MacBook Pro:主力开发设备,随身携带、日常开发、写 Obsidian
- 家里的 x86 小主机:24 小时开机,跑着 Docker,存着知识库的另一份副本——这是 Syncthing 备份的目标设备
- 建议使用【阿里云轻量应用服务器】:来搭 ZeroTier 的 Moon 中继节点。这台是我用阿里云新用户免费试用薅来的

这些设备用 ZeroTier 拉了一个虚拟局域网,分配了固定虚拟 IP。Mac在公司或者户外,都能通过虚拟 IP 和家里的小主机互通。Moon 节点负责让两台设备在网络不稳定的时候也能稳定中继。
02 为什么是 Syncthing + ZeroTier,不是别的
简单对比下方案:
| 方案 | 问题 |
|---|---|
| 商业网盘(坚果云、阿里云盘、百度网盘、Dropbox) | 订阅制,数据在别人的云上,可能触发风控,导致数据被删除 |
| Syncthing | P2P 直传、开源免费、无容量限制 |
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:
- 在 Mac 端的 Web GUI,点「添加远程设备」,常规 -> Device ID 从服务器端复制过来
- 高级 -> 地址,手动填:
tcp://zerotier_ip:22000(服务器的 ZeroTier IP) - 正常情况下,服务器的Web GUI那边,会弹出窗口,询问你是否同意某台设备的远程连接,确认并命名即可。
两边都加了,连接才算建起来。Web GUI 状态栏显示 已连接 就通了。

05 共享文件夹
我的 my-wiki 目录在 Mac 上,所以由 Mac 发起共享:
打开 Mac 端 Web GUI → 「文件夹」→ 「+添加文件夹」:
- 文件夹路径:填 Obsidian Vault 路径,比如
/Users/xxx/my-wiki - 文件夹标签:随便起,比如
my-wiki - 共享:勾选 Linux 服务器这台设备,并输入密码,这样Linux上的数据即使泄漏,也能够保证数据无法解密。


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 身份验证密码」,输入点击保存。

08 常见故障排查
| 现象 | 检查思路 | 解法 |
|---|---|---|
| 设备连不上 | ZeroTier 互通吗?防火墙开端口了吗? | 先 ping 虚拟 IP,再看防火墙 22000 |
| 同步卡住不动 | GUI 里看「最近更改」,可能有大文件在传 | 等几分钟,别急着重启 |
一堆 .sync-conflict 文件 | 两台设备同时改了同一个文件 | 手动看一眼合并,Syncthing 不会自动解冲突 |
| 重启服务器后连不上 | ZeroTier 虚拟 IP 变了吗? | 用 ZeroTier 静态 IP,或写个启动检查脚本 |
| Web GUI 打不开 | Syncthing 进程挂了吗? | brew services restart syncthing 或 docker restart syncthing |
最后
搭完之后最大的变化就是,不再想「这个文件在哪台机器上了」。
Mac 上改了东西,服务器自动拿到。Mac 关了几天没关系,开机回来数据全在里面。ZeroTier 管网络打通,Syncthing 管传文件,没人知道你存了什么。
成本方面:
- ZeroTier:免费
- Syncthing:免费
- 家里 x86 小主机:(家里现有的机器,你也可以使用其他旧电脑来搭建)
- Moon中继服务器(续费:最低40-50/月)
暂无评论