Featured image of post Syncthing:真正免费又隐私安全的 Dropbox 平替

Syncthing:真正免费又隐私安全的 Dropbox 平替

想要一个真正免费、不限容量的文件同步方案?来看看我如何用 Syncthing 替代 Dropbox——开源、P2P 直传,数据只存在自己的设备上,隐私完全自己掌控。附带 Docker + ZeroTier 完整搭建教程。

上一篇写 《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 是在公司还是在家,都能和服务器直连。

1
2
3
4
5
6
7
8
# Mac(两台都装)
brew install zerotier-one

# Linux 服务器(Debian 发行版)
sudo apt install zerotier-one

# 三边都执行
sudo zerotier-cli join <你的网络ID>

加入同一个网络后,ZeroTier 会给每台机器分一个虚拟 IP,类似 10.147.20.x。两边互相 ping 一下,能通就对了。

Moon 节点我租了一台 VPS 来搭。ZeroTier 官方的 relay 有时候慢,加了 Moon 之后跨网络流量走自己的中继节点,对这个虚拟局域网的稳定性提升很明显。具体怎么建网上教程很多,不展开。

2. 装 Syncthing

网络通了之后再来装 Syncthing。

Mac 端一行命令:

1
brew install syncthing

GUI 党可以用 brew install --cask syncthing 装带界面的版本。我是直接用命令行启动,本地 http://127.0.0.1:8384 打开就能进 Web 控制台。

Linux 服务器端我用的 Docker,不污染宿主机环境:

1
2
3
4
5
6
7
8
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 保证服务器重启后自己起来。

启动完访问 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 哪些文件别同步。

我第一次搭的时候没配,裸跑了一段时间,也没什么问题。后来用久了发现有些文件确实没必要同步,加了一下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
// 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

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

我的建议是先跑起来再说。跑一阵子发现有些文件不该同步,再加进去也不迟。

安全项

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 是最省心的一个。不用花钱、不用管容量、不用关心隐私策略。搭一次,跑着跑着就忘了它的存在——这才是好工具应该有的样子。