上一篇写 《Karpathy 的 LLM-Wiki 方法论:我的 Obsidian 实践》 的时候,提了一句数据同步的事。LLM-Wiki 的数据层靠多端同步撑着,Syncthing 就是那个底座。当时只说了用 ZeroTier 组网 + Syncthing 同步,一笔带过了。今天单独写一篇展开讲讲。
为什么是 Syncthing
我之前试过好几种方案,没一个顺心的:
网盘吧,隐私这块总觉得隔着一层,大文件传上去下载回来也挺慢的。iCloud 空间要钱,而且同步 Markdown 文件偶尔会出 .icloud 残留文件,看着烦。Git 呢,对代码友好,但 Obsidian 的附件、图片塞进去每次 commit 都巨大。
后来知道了 Syncthing。
它做的事很简单:两台机器之间同步文件夹。P2P 直传,不经过中间服务器。开源、免费、没有任何容量限制。数据只在你自己的设备上存。
对我来说就两点够用了:不用花钱,别人看不见。
我的环境
三台设备:
- 一台 Macbook Pro(主力机),日常开发、写 Obsidian、跑 LLM-Wiki,人走到哪跟到哪
- 一台 MacBook Pro(备用机),家里用,同样一套目录结构
- 一台 Linux 服务器(Debian 发行版),24 小时开着,Docker 里跑着 Syncthing
三台机器之间用 ZeroTier 组虚拟局域网。我租了台 VPS 搭了一个 Moon 节点来做中继,对我自己的虚拟局域网的稳定性提升很明显。不管哪台 Mac 在公司网络还是家里 Wi-Fi,都能稳定连通。
同步关系不是我想象中的"三台设备三台互相连",而是采用了一种串联的方式:
先让主力 Mac 和 Linux 服务器建立好双向共享关系,再从 Linux 服务器上把同一个知识库共享给备用 Mac。这样一来,主力 Mac 上的所有知识变更会先同步到服务器,再通过服务器推给备用 Mac。反向也一样——备用 Mac 改的东西先汇总到服务器,再拉回主力 Mac。
Linux 服务器在中间充当知识库的中转枢纽。两台 Mac 各自写的 Obsidian 笔记、跑的 LLM-Wiki 数据,最终都会汇总到服务器上同一个知识库。
一个重要的使用习惯
在讲搭建步骤之前,先说一个我在 LLM-Wiki 场景下踩过的坑:
不要让多个 LLM 同时修改知识库里的文件。
LLM 跑工作流的时候,可能会批量更新、新增、删除知识页面。如果两台 Mac 上同时触发 /my-wiki-src 或 /my-wiki-talk,两边都在写同一个文件夹里的文件,Syncthing 就会检测到冲突,生成一堆 .sync-conflict 文件。
我的做法是:同一时间只在一台机器上跑 LLM 工作流。另一台只负责浏览和手动编辑。如果你也想在两台机器上都跑 AI 工作流,记得排队——等一台跑完、同步完成了,再触发另一台。
搭建步骤
1. ZeroTier 组网
三台设备通过 ZeroTier 拉到一个虚拟网络里。组好之后就不受地域和网络限制了,不管 Mac 是在公司还是在家,都能和服务器直连。
|
|
加入同一个网络后,ZeroTier 会给每台机器分一个虚拟 IP,类似 10.147.20.x。两边互相 ping 一下,能通就对了。
Moon 节点我租了一台 VPS 来搭。ZeroTier 官方的 relay 有时候慢,加了 Moon 之后跨网络流量走自己的中继节点,对这个虚拟局域网的稳定性提升很明显。具体怎么建网上教程很多,不展开。
2. 装 Syncthing
网络通了之后再来装 Syncthing。
Mac 端一行命令:
|
|
GUI 党可以用 brew install --cask syncthing 装带界面的版本。我是直接用命令行启动,本地 http://127.0.0.1:8384 打开就能进 Web 控制台。
Linux 服务器端我用的 Docker,不污染宿主机环境:
|
|
路径换成你自己的。config 卷挂着,以后升级镜像重建容器,配置不会丢。--restart unless-stopped 保证服务器重启后自己起来。
启动完访问 http://ZeroTier虚拟IP:8384,能看到和 Mac 端一样的 Web 控制台。
3. 互相添加设备
Syncthing 在同一个局域网里能自动发现设备。打开 Web GUI 底部经常会弹提示「发现新设备」,问你要不要添加。点一下就能加,省得手动输设备 ID。
但要注意一点:自动发现后确认一下地址。
默认发现出来的地址可能是本地 IP,比如 192.168.x.x。如果是通过 ZeroTier 走的虚拟网络,一定要手动改成 ZeroTier 的虚拟 IP,格式 tcp://10.147.20.x:22000。不然 Mac 换了个网络环境(比如从公司回家),地址一变就连不上了。
两边都要加:Mac 上点发现弹出的添加,服务器上也要反过来点 Mac 的发现提示。两边互相加了,连接才算建起来。

4. 共享文件夹
这里的顺序有讲究:先让主力 Mac 和服务器建立共享,再用服务器去共享给备用 Mac。
第一步:主力 Mac → 服务器
在主力 Mac 的 Web GUI 里:「文件夹」→「添加文件夹」,选好 my-wiki 的路径,起个标签名,然后在「共享」里勾选 Linux 服务器。
一定要勾选「加密」选项。 勾选后服务器端只能看到加密后的文件名和内容,只有发起共享的 Mac 端能解密。这样即使服务器被攻破,别人也看不到你存了什么。
服务器那边会收到共享请求,点接受,选本地保存路径就行。
第二步:服务器 → 备用 Mac
在服务器的 Web GUI 里,对同一个文件夹选择「添加设备」,勾选备用 Mac 的设备。备用 Mac 那边会收到共享请求,接受并选好本地保存路径。
这样下来,两台 Mac 的数据都会汇总到服务器上的同一个知识库。主力 Mac 改了,服务器拿到,然后推到备用 Mac;备用 Mac 改了,服务器拿到,再拉回主力 Mac。服务器就是中间那根线。

.stignore 文件
每个同步目录根目录可以建一个 .stignore,告诉 Syncthing 哪些文件别同步。
我第一次搭的时候没配,裸跑了一段时间,也没什么问题。后来用久了发现有些文件确实没必要同步,加了一下:
|
|
注释用 //,支持通配符。改完自动生效,不用重启。
我的建议是先跑起来再说。跑一阵子发现有些文件不该同步,再加进去也不迟。
安全项
Syncthing 的 Web GUI 默认是不设密码的。如果绑了 ZeroTier 虚拟 IP,网段内其他机器能直接访问。至少做一件事:
Web GUI → 操作 → 设置 → GUI → 勾选「启用 GUI 认证」→ 设密码。
花十秒钟的事,但很多人会忘。
常见问题
| 问题 | 怎么查 |
|---|---|
| 设备连不上 | ZeroTier 两边互相 ping 通没?22000 端口防火墙放没放? |
| 同步卡住不动 | GUI 里看「最近更改」,可能有个大文件在传,耐心等 |
| 一堆 .sync-conflict 文件 | 两台同时改了同一个文件。手动看一眼保留哪个就行。如果是在跑 LLM 工作流(比如 /my-wiki-src 或 /my-wiki-talk),注意不要两台机器同时触发,等一台跑完同步完了再跑另一台 |
| 重启后连不上 | ZeroTier 的虚拟 IP 变了吗?建议在网络里分配静态地址,固定 IP |
| Web GUI 打不开 | Mac 跑 brew services restart syncthing,Docker 跑 docker restart syncthing |
写完
搭完之后最大的变化就是:不再想「这个文件在哪台机器上了」。
主力 Mac 上改了东西,服务器自动拿到,再推给备用 Mac。备用 Mac 改了,也通过服务器汇总回来。不管在哪台机器上打开 Obsidian,读到的都是最新的知识库。ZeroTier 负责网络打通,Syncthing 负责传文件,谁也不知道我存了什么。
有一点要提醒:LLM 跑工作流的时候,同一时间只在一台机器上跑。两边并行改知识库的话,.sync-conflict 文件会教你做人。
之前试过好几个同步方案,Syncthing 是最省心的一个。不用花钱、不用管容量、不用关心隐私策略。搭一次,跑着跑着就忘了它的存在——这才是好工具应该有的样子。