Syncthing 多设备同步:不要中心服务器,文件点对点直连

admin 开源软件 2026-09-30 4 0

两台电脑之间倒文件,很多人还在用 U 盘。拷过去改一版,拷回来又改一版,最后哪个是新的只能靠文件名里的「副本」「最终版」「最终版2」。网盘倒是能同步,但免费额度就那么点,会员按月收费,而且文件夹里的东西到底在哪台服务器上待过、会不会被扫,你也说不清。

Syncthing 走的是另一条路:两端的设备直接连起来,文件在它们之间传,中间没有一台服务器存着你的东西。

它和网盘不是一回事

先把这个差别说清楚,因为它决定了你能拿它干什么、不能拿它干什么。

项目内容
文件存在哪网盘在服务商机房;它只在你自己的设备上
容量网盘受套餐限制;它受你自己硬盘限制
传输路径网盘先上传到云再下载;它是设备之间直连
局域网速度网盘绕出去一圈;它在内网能跑满千兆
版本历史网盘由服务商决定策略;它自己配,按天数或份数
成本订阅费;它只花电费
可用性网盘随时能打开;它要求至少一端在线且能被够到

代价也很明确:没有「一份永远躺在云上」的兜底,你的设备全都关机的时候,文件只停在最后同步成功的那个硬盘上。所以它不是备份工具,它取代的是「搬文件」这件事。真要备份,就得靠另一端那台只接收的机器,或者额外的快照方案。

Docker 部署

它用到三个端口,别只映射第一个,这是新手最常见的一处失误:

  • 8384:管理网页,TCP
  • 22000:设备间传输,TCP 和 UDP 都要
  • 21027:局域网内自动发现,UDP
mkdir -p /opt/syncthing/config /srv/share

docker run -d \
  --name syncthing \
  --restart unless-stopped \
  --network host \
  -e TZ=Asia/Shanghai \
  -e PUID=1000 \
  -e PGID=1000 \
  -v /opt/syncthing/config:/config \
  -v /srv/share:/data \
  syncthing/syncthing

这里用了 host 网络,因为自动发现和 UDP 打洞在桥接网络下会打折扣。如果你偏好端口映射,就把 8384、22000、22000/udp、21027/udp 四条都显式写出来,并且在设备的高级设置里手动指定地址,别让它自己猜。

PUID 和 PGID 很重要:让容器里的进程以和你宿主上同一个用户身份读写文件,否则同步过来的文件属主是 root,你普通账号改不了;下一轮扫描发现权限对不上,还可能触发一次全量重传。

compose 写法

services:
  syncthing:
    image: syncthing/syncthing
    container_name: syncthing
    restart: unless-stopped
    network_mode: host
    environment:
      TZ: Asia/Shanghai
      PUID: 1000
      PGID: 1000
    volumes:
      - ./config:/config
      - /srv/share:/data

起来之后访问宿主机的 8384 端口,第一次会要求你给界面设账号密码,顺手设上,别让局域网里谁都能进来看你的文件列表。

两台设备怎么连起来

先找到自己的设备 ID

界面右上角「操作 - 显示 ID」,一串很长的大写字符,中间用短横分组。这就是这台设备的身份,由密钥派生出来,重装系统或删掉配置目录就变了。你要做的事就是把这串 ID 复制下来,拿到另一台上添加。

在对方那边添加

  1. 在 B 上点「添加远程设备」
  2. 粘贴 A 的设备 ID,名字随便起,好认就行
  3. 地址栏留空让它们自己发现;跨网段就手动填一个传输地址,协议写 TCP,后面接对方 IP 和 22000 端口
  4. 保存,等 A 那边弹出「有新设备想连接」,点接受
  5. 回到 A 上把 B 也加上,两边互相确认才算真正握上手

共享文件夹和三种权限

在 A 上选中要共享的文件夹,点编辑,勾上 B,然后选一个权限模式。这一步选错比连不上更麻烦:

  • 双向:两边都能改,改动互相同步,最常用
  • 只发送:我这边的改动会发给你,你那边的删除和修改不会回流过来
  • 只接收:我不改,只接你的版本,标准的备份端用法

典型组合是主力电脑双向,家里的 NAS 只接收当备份,手机只接收某几个目录。把一个本该只读的目录设成只接收,能挡掉对方误删回流的风险。

版本控制与忽略规则

版本控制

文件夹设置里的「文件版本控制」是救命的东西。选简单版本,它会按你设的份数保留旧版本;选回收站式,则把被删除的文件多留若干天。删错了、改坏了,去目录下的 .stversions 里翻一下通常能捞回来。重要目录建议全开,保留三十天不算多。

忽略规则

被同步目录的根上可以放一个 .stignore,写法和常用的忽略文件类似:

// 系统垃圾和临时文件
(?d)Thumbs.db
(?d).DS_Store
*.tmp
*.swp

// 依赖和构建产物
node_modules
vendor
target
dist

// 例外:这个文件要留着
!keep-this.tmp

(?d) 前缀表示这类文件在需要时允许被删除,一般给系统垃圾文件用。加规则的时机最好是共享之前,一旦依赖目录已经开始同步,几万个小文件能把两端都拖瘫,删起来也慢。

冲突文件是怎么来的

两台设备都改了同一个文件、彼此还没同步,就会生成一个带 .sync-conflict 后缀的副本,两个版本都留着,由你自己决定要哪个。这不是 bug,是它不敢替你猜。

减少冲突的办法:别让同一个目录在两端同时编辑;手机端尤其注意,很多编辑器保存时是整体重写,特别容易撞上。真出现冲突了,对比内容留一份、删掉另一份,不要留着不理——冲突文件在下一轮还会被当成新文件继续同步过去,越攒越多。

速度:直连、中继和局域网

两台设备之间先尝试直连。都在同一个局域网里,它会走内网地址,千兆环境下能跑到一百多兆每秒,比 U 盘舒服得多。跨网时要穿透两边的网络地址转换,穿不过去就退回到中继,速度被限制在一个不高的水平:传小文件没感觉,同步几十 G 的素材就是受罪。

看当前走的哪条路:设备列表里点开对方,地址那栏如果写着中继服务的名字,就是没直连上。常见原因是 22000 没放行,或者两边都在运营商级网络地址转换后面。能做的事:路由器上给一台机器做端口转发,只给一端做就够;或者自己搭一个中继和发现服务,放在内网或有公网地址的机器上。

几个真会踩到的坑

  1. 把配置目录也共享出去了。数据库就在配置目录里,同步它会让两端的索引互相打架,轻则扫描混乱,重则数据损坏。共享数据目录,永远别共享配置目录。
  2. 两端文件权限不一致。一边属主是普通用户、一边是 root,扫描时会认为文件变了,触发全量重传。统一 PUID 和 PGID,或者一次性把属主理顺。
  3. 手机后台被杀导致不同步。安卓会回收后台应用。给它加电池优化白名单,需要实时性的文件夹反而建议开「仅充电时同步」,更稳也更省电。
  4. 22000 没放行。用了一年都在走中继,还以为是网络问题,其实只是防火墙没开、安全组没放。
  5. 一次共享了整块盘。里面有几十万个小文件、有虚拟机镜像、有项目依赖,索引要扫很久,界面一直显示「正在扫描」,看着像卡死。
  6. 以为它等于备份。同步会把删除也同步过去,一端手滑删了另一端跟着删。要备份就把 NAS 上那个目录设成只接收加版本控制,或者另外做快照。

适合你,不适合你

适合:家里有 NAS 或常开的机器,要同步照片、文档、代码、设计素材;在意文件到底存在哪台机器上;不想为同步这件事付月费。

不适合:需要「在任何地方打开浏览器就能看文件」的访问体验;完全不想碰端口和网络设置;几十人的团队要共享一个云盘。它是同步工具,不是网盘,用网盘的期待去要求它只会失望。