ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Syncthing实战:从网盘到点对点文件同步,解决多设备冲突与隐私问题

Syncthing实战:从网盘到点对点文件同步,解决多设备冲突与隐私问题

两台电脑之间同步文件,这事折磨了我很久。微信传文件会压缩画质,U盘拷来拷去经常搞不清楚哪个才是最新版,商业网盘上传下载都要经过第三方服务器,速度还时快时慢。后来我换到开源同步工具 Syncthing,所有设备点对点直传,文件只在几台自己的设备之间流动,同步延迟基本按秒算,隐私和速度都能兼顾。这篇文章把我在普通家庭网络里部署 Syncthing、跑通多设备同步、处理冲突文件、调整性能和排掉暗坑的经验完整写下来,适合正在纠结同步方案、或者已经在用但总被冲突文件折磨的人参考。

我尽量不会只甩几条命令,会把"为什么要这样设置""原理是什么"也讲清楚,因为只抄配置不理解机制,后面遇到问题还是不会排查。

1. 为什么我放弃网盘和U盘,开始折腾自建同步

1.1 先从日常痛点说起

我手头长期有两台电脑,一台放在办公室,一台放在家里,中间还有一部手机和平板。最初的需求特别朴素:写文档、改代码、收集资料,希望打开任何一件设备都能拿到最新内容。试过不少办法,没有一个让人省心。

U盘是最早的方案,缺点是它天然是"单点"。在办公室电脑改完文件,拷进U盘,回家忘了插,或者插上之后发现家里电脑里还有一个修改版本,两个文件内容不一样,只能靠肉眼比对。如果同时涉及三个项目目录,脑子直接过载。U盘本身还会坏,重要文件丢一次就够呛。

后来转向商业网盘。上传下载确实方便,但问题很快暴露出来。家人一起用同一个网盘空间,文件多了之后经常出现"我这个文件覆盖了你那个文件"的争吵;免费空间不够,订阅套餐又不便宜;最难受的是隐私感不足,虽然加密说的是"保证安全",但文件毕竟经过人家服务器,心里总有点不踏实。还有热门资源限速、同步客户端自动更新后某些目录失联等问题,一多就烦。

微信和邮箱传文件就更不用说了,小文件还行,大文件要压缩、要上传、要再下载,改个几十次版本之后,聊天记录里全是同名文件,根本分不清哪个新。这些场景本质上都需要一套"目录自动保持一致"的机制,而我一开始没意识到。

1.2 Syncthing到底解决了什么

接触 Syncthing 之后,我才明白它和网盘的核心区别:网盘是"你把文件传到云端,云端再传给另一台设备",Syncthing 是"设备之间直接同步"。每台设备都安装客户端,客户端之间通过加密链路通信,任何一台修改了文件,其他设备会自动拉取变更。

它的核心工作模式可以概括成三句话:

  • 每台设备是对等的,没有强制中心服务器,任何一台关机,其他设备依然能互相同步。
  • 同步的最小单位是文件块,不是整文件,文件每次修改只传输变化的部分,省带宽也省时间。
  • 设备之间点对点传输,数据不经过第三方存储,隐私边界非常清晰。

实际用下来,最让我满意的不是某个花哨功能,而是"常驻后台"这件事。Syncthing 运行后不需要手动点"同步",改动保存的一两秒内,其他设备就收到了。这种感觉很像设备之间有一条隐形的线,文件只要发生变化,线的那头立刻有反应。对于频繁改动文档、代码的人来说,这种"无感同步"带来的效率提升非常明显。

当然,它不是万能的。Syncthing 做的是"多台设备保持同一份目录内容一致",不是"分布式对象存储",也不是"多人实时协同编辑"。它的设计目标是文件级别的一致性,不解决"两个人同时打开同一个文档在线编辑"这种场景。搞清楚这个边界之后,再看下面的方案取舍就顺了。

2. 开始之前算笔账:几种同步方案的取舍

2.1 商业网盘的隐性成本

商业网盘不是不行,而是要仔细算账。很多网盘表面上免费,实际通过限速、空间限制和会员机制把用户往付费方案赶。按年订阅算下来,一年支出也不算小数目。可如果你对数据隐私没有太高要求、带宽条件不错、又想要手机相册自动备份这些成熟的生态功能,商业网盘其实更省心。

但对我来说,不能接受的是"文件经手第三方"这件事。写文章时的草稿、家里的各类账单扫描件、朋友发来的待处理合同,这些内容放在别人服务器里总归不踏实。就算网盘服务商承诺加密,你也无法验证"加密后他们是否保留了密钥"。为了换取便利把敏感内容交给一个陌生服务器,这种交换我觉得不划算。

另外,商业网盘的同步客户端普遍有"本地同步文件夹"的概念,但不同平台之间同步规则差异很大。有的产品在手机上只能下载、不能自动回传,有的产品一旦检测到某个文件被占用就静默跳过,等用户发现时,两台设备已经好几个版本不一致了。排查这类问题非常浪费时间。

2.2 自建NAS的性价比与复杂度

很多人说"你自己搭一个NAS不就完了"。这话对,但不全对。自建NAS确实能把数据完全抓在自己手里,还能跑更多服务,但它的成本远不止买一台机器那么简单:

  • 硬件成本:主机、硬盘、电源,想稳妥往往还要上阵列卡或专用系统。
  • 维护成本:系统更新、硬盘健康监测、数据备份策略、网络故障排查。
  • 电力成本:7×24小时开机,一年下来电费轻松超过一个网盘订阅。
  • 学习成本:RAID 类型、文件系统、权限、快照、远程访问配置,内容量非常大。

如果你的需求只是"两台电脑保持目录一致",为这个搭一个完整NAS,性价比相当低。NAS更适合"集中存储+多设备挂载+全家备份"这种重场景。而我只是希望文件在多台设备间流转,中间不需要一个"存储大管家"。

Syncthing 正好落在中间:不需要新增硬件,现有电脑开着就能互传;不需要维护服务器,就算没有公网IP它也有办法把数据送到对方设备;也不需要学习RAID那套知识,核心概念两小时能搞明白。

2.3 Syncthing的适用边界

我自己用下来,觉得 Syncthing 最适合这几类用法:

  • 个人文档库、Markdown笔记、代码仓库的工作副本、杂志PDF等资料的跨设备同步。
  • 家庭内几台电脑和一个常开的小主机之间的目录实时同步,小主机兼职当"弱化版NAS"。
  • 团队内部小范围共享资料,人不多、不需要在线协同,只要保证大家拿到最新版本。

不适合的场景也很明确。如果某个文件夹几TB,且大部分文件几乎不会变动,用移动硬盘冷存储更划算;如果你需要的是多人实时协同编辑同一份文档,应该用在线协作文档;如果你想把手机相册完整备份并长期保留,Syncthing 能做,但不如成熟网盘服务的相册分类和管理方便。

总之,先想清楚自己到底要解决什么问题,再来判断 Syncthing 是不是你的菜。别被"自建同步工具"这个名头冲昏头脑,适合自己的才是好的。

3. 部署的核心流程:从一台机器到多设备

3.1 安装与初始化:第一台设备怎么起步

Syncthing 的安装非常简单。Windows 和 macOS 有图形安装包,Linux 可以用系统包管理器直接安装,Android 也有客户端。我个人的建议是:先在两台最重要的电脑上装上,别一上来就同时连手机和平板,减少排查变量。

打开程序之后,默认会在本地起一个 Web 管理界面,通过浏览器访问。第一次启动时看到的设备 ID 非常关键,那是一串类似随机字符的字符串,同时也有二维码形式。设备 ID 本质上代表这台设备的身份,后面所有设备互相配对都靠它。

小提示:安装后建议立刻设置一个中文或好记的设备名,否则几台设备都叫默认名,后面在同步列表里根本分不清谁是谁。设备名只是标记,不影响传输,但能省掉大量困惑。

初始化阶段还有两个容易忽略的设置:一个是"数据存放目录",一个是"扫描间隔"。数据存放目录很重要,Syncthing 会为每个同步文件夹建一个数据库索引,中文路径完全没问题,但路径里尽量不要有奇怪的特殊字符,以免某些平台解析出问题。

3.2 添加设备与共享文件夹:让两台电脑认识

在设备列表里选择"添加远程设备",把另一台电脑的设备 ID 粘贴进去,或者直接扫二维码。对方设备上会弹出一个确认框,确认后两台设备就建立了信任关系。这个过程我见很多人搞反:以为需要两边同时输入,其实只需一边发起,另一边确认即可。

接下来是共享文件夹。选定一个本地目录,比如"工作文档",然后在共享选项卡里勾选刚才添加的那台设备。对方设备会收到一个文件夹邀请,她要选择一个本地路径来接收。这里要特别提醒:接收路径最好选一个空目录,不要选到已有重要文件的目录。因为一旦开同步,Syncthing 会把目录内容调整为与共享方一致,万一两边内容不一样,就会产生大量的"整理"动作,甚至把本地原文件移动到备份或冲突里。

共享之后,界面会显示同步进度。首次同步大目录会比较慢,因为要扫描文件、计算块哈希。但之后速度就快很多。很多人第一次用,看到进度条半天不走就以为卡住了,其实是在做初始索引,耐心等等就好。

3.3 无公网IP也能连的中转逻辑

家庭宽带大多没有公网IP,两台设备分处两地时,按直觉好像没法直接建立连接。Syncthing 的处理方式是:能直连就连,不能直连就用全局发现服务和中间转发节点协助传输。

这个机制经常被误读成"它偷偷把文件存到别人服务器",不是的。中间转发节点只负责"把数据从A传到B",数据本身依然是加密的,转发节点看到的是密文,不能读取内容。只有当两台设备确实无法建立点对点连接时,转发节点才介入;一旦两台设备通过某种方式直连成功,流量就切回直连通道。

所以,你在家里和办公室两台电脑上装上 Syncthing,哪怕两台都没有公网IP,它依然能通过这种方式让文件到达对方。这些配置默认开着,不需要用户手动改。要说经验,唯一需要注意的是:别为了让同步"更快"去手动关掉全局发现,那反而会让设备在陌生网络里找不到彼此。

4. 同步机制解构:这些设置到底在做什么

4.1 文件扫描、块校验与增量传输

用过 Syncthing 之后我才意识到,它同步的原理和我想的不一样。最初我以为它是"检测到文件变化,就把整个文件复制过去"。实际上,Syncthing 把每个文件按固定大小切成若干块,为每块计算校验值,然后记录在一个本地数据库里。设备之间对比的是这些块的校验值,而不是整个文件的时间戳和大小。

一台设备修改了文件中某个小块内容,Syncthing 只需要把变化的那几块传输过去,接收端把本地对应的块替换掉,然后重组文件。这个机制在处理大文件时优势巨大:一个几百MB的压缩包,只是尾部追加了一小段内容,同步时几乎只传追加部分,瞬间完成。

"扫描间隔"控制的是设备多久检查一次目录变化。默认大概几十秒,实时性够用。如果某个目录文件变化极频繁,可以缩短扫描间隔,但会更占CPU;反之,如果目录很大又很少动,可以适当调长。此外还可以开启"读取监控"功能,借助操作系统的文件事件来感知变化,减少轮询消耗。这个对Linux系统格外有用,能明显降低同步的延迟。

4.2 版本控制与冲突文件生成规则

同步工具最怕的永远是"误删"和"反复修改"。Syncthing 默认不保留文件历史,但有选项可以开启"版本控制"。开启后,被删除或覆盖的文件不会直接消失,而是被移动到设定好的版本目录里,按时间保留。这个功能和电脑上的回收站类似,但你要主动打开并设置保留时间,否则永远用不上。

真正让新手头疼的是冲突文件。假设两台设备同时修改同一个文件,两边都产生了基于各自版本的新内容,Syncthing 无法自动判断哪边最新,于是会在其中一台生成一个额外副本,文件名通常带着"sync-conflict"标记以及时间戳。很多人看到这种文件就慌了,以为数据出问题了,其实这正是 Syncthing 的保护机制:它不会让你白白丢掉任何一份修改。

处理冲突文件的正确思路是:看完两个版本的差异,决定保留哪个,然后删除多余文件。为避免频繁冲突,最好尽量保证同一时间只在一台设备上编辑同一个文件。家庭场景里这完全做得到,只要规定"工作文档在电脑上改,不要同时在平板上改同一个文件"就很省心。

4.3 设备ID、加密通信与访问控制

安全模型值得多说几句。Syncthing 的设备ID不是简单编号,它本质上是一串基于密钥指纹的可读标识。你能通过设备ID验证对方身份,就像核对一张防伪身份证。两台设备配对时,互相识别密钥指纹,之后所有通信都通过TLS加密。

这意味着它不需要传统意义上的账号密码登录。你只要把设备ID分享给信任的人,对方就能和你的设备建立连接。这个设计有利有弊:好处是没有密码可泄露,坏处是设备ID一旦泄露,陌生人理论上能请求和你配对(但还需要你在界面上确认)。所以设备ID不要随意公开发到社交媒体或讨论区,这属于基本安全习惯。

另外,每个共享文件夹都可以精确设置"只读"或"读写"权限。如果设备仅仅是偶尔看看资料,建议设成"只读",这样就算对方机器中病毒了,也无法删改你本地的文件。文件夹还能设置"忽略模式",把不需要同步的临时文件、缓存目录排除在外,既省带宽又避免不必要的冲突。

5. 用了一年多,踩过的坑和调优实践

5.1 冲突文件不是bug,是你的工作流需要调整

我最初使用的第一个月,项目目录里冒出一堆"sync-conflict"文件,一度怀疑工具坏了。后来逐个分析才发现,原因是办公室和家里的电脑上,同一个文件都在被某款编辑器自动定时保存。两台设备几乎同时写同一个文件,冲突自然频繁。

解决办法不是关闭版本控制,而是给编辑器设置统一的默认保存位置,或者干脆只在"当前正在编辑"的那台设备上开启对应目录的写权限。还有一次,我把手机相册同步到了一个共享文件夹,结果手机自动生成的缩略图文件也在同步范围内,一堆无意义的小文件平白增加扫描压力。这时候用忽略规则把缩略图目录排除掉,问题立刻解决。

冲突文件并不需要害怕。你只要定期检查一次冲突目录,保留真正需要的那份,把另外的删除,数据就不会丢。我怕大家漏掉一点:删除冲突文件之前,先看看它的修改时间和内容,不要手滑把最新版删了。

5.2 性能、内存与大目录的调优细节

同步几千个小文件的目录时,Syncthing 的内存占用会明显上升,因为要为每个文件维护索引记录。文件数量超过十万的小文件场景,内存可能吃掉几百MB,对老电脑来说有点肉痛。我的调整思路是:

  • 把不需要实时同步的目录从共享列表里移除,改成手动同步或用压缩包导出。
  • 设置合适的忽略规则,排除 node_modules、.git 缓存、编译产物这类自动生成目录。
  • 对超大目录启用"文件系统监控"而不是缩短扫描间隔,减少无效扫描。

Linux 下还有个经典问题:系统默认的 inotify 监控上限不够高,开启实时文件监控后日志会报错。解决办法是调大操作系统的文件监控配额。这个只影响监控不影响传输,但如果一直报错,同步延迟会从秒级变成分钟级。修改方法很简单,网上相关教程很多,不赘述。

带宽方面,如果上行带宽被占满,别的设备看网页都会卡。Syncthing 提供了速率限制,可以分别限制整体同步速度和单独设备的速度。我把上传速度限制在 2MB/s 左右,既不影响日常使用,又不会让同步拖太晚。

5.3 移动端同步失效的典型原因

手机和平板是最容易"掉链子"的客户端。Android 端 Syncthing 看起来也同步了,但过一段时间就不更新,问题九成出在系统后台限制上。国产手机的系统普遍会杀掉后台进程,Syncthing 一旦被杀,就不会在后台扫描文件、不会保持连接,自然也就无法实时同步。

解决方式是在系统设置里把Syncthing加入"无限制"或"允许自启动",同时锁定后台任务。不同手机设置路径不一样,但思路一致:保证它常驻内存。电量消耗反而不用太担心,我实际用下来,Syncthing 平时闲置时的流量和耗电都很低,远没有导航或者视频通话那么夸张。

移动端另一个坑是电池优化:某些手机会在省电模式下强制停用网络,导致同步失败。我习惯把 Syncthing 加入电池优化的白名单。如果你发现手机端两天没同步,先别急着卸载重装,先看是不是被系统杀掉了。

6. 更进一步:把Syncthing当作家庭基础设置

6.1 定时自动备份,把"同步"变成"备份"的一环

严格来说,同步不等于备份。如果某个文件在工作电脑上被损坏或删除修改,同步会把"损坏/删除"也传到其他设备。所以 Syncthing 不能替代备份,但它可以成为备份流程的传输层。

我的做法是:把一台家里的小主机设置为"接收所有同步文件夹",并且在 Syncthing 的版本控制里把保留时间设成长一点,比如保留180天。这么一来,办公室电脑误删了文件,小主机上仍然保留着历史版本,我可以随时找回。这相当于给重要资料加了一层"软备份"。

当然,真正的安全备份还要依赖外部介质或异地冷备,但至少日常手滑误删、勒索病毒加密文件这类场景,Syncthing 的版本控制能拉回来一大半。前提是:被同步的目录里没有正在被数据库频繁写入的文件,比如虚拟机磁盘镜像或SQLite数据库文件,这些文件同步起来又慢又容易产生不一致,最好别纳入同步目录。

6.2 多设备协作的日常形态

用顺之后,我家的设备形态变成了这样:办公室电脑、家里电脑、一台常开小主机、手机,四台设备全部加入同一个 Syncthing 网络。工作文档、学习笔记、电子书、照片整理目录都分配了各自的共享文件夹。手机上随手拍的照片通过局域网无线同步到小主机,再由小主机同步回办公室电脑,整个过程不需要插数据线。

这套结构没有中心服务器,任何一台关机都不影响其他设备之间的同步。小主机只是"常开+容量大"的角色,负责当文件仓库和版本历史保留地。这里最实际的优化是:小主机放在家里,办公室电脑和小主机跨网络同步,手机和小主机在同一个Wi-Fi下就能用局域网直传,速度很快,照片视频秒传。

我认为 Syncthing 真正有意思的地方在于,它把"同步能力"从某一个软件厂商的服务器里解放出来,变成你自己拥有的基础设施。刚开始配置时可能觉得繁琐,但一旦跑顺,它会让你彻底告别"手动比对最新版本"的原始生活。如果你也受够了网盘限速和U盘拔来拔去,建议找两台闲置设备装上试试,你会发现同步体验可以如此安静、稳定和私密。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进