干这行最慌的瞬间,不是磁盘挂了,而是辛辛苦苦维护的服务数据,因为一次误删、一次覆盖,或者半夜同步脚本抽风,把生产目录清掉一半。等发现的时候,备份盘上躺着的还是三天前的老版本。Windows Server 之间做文件备份,方案其实不少:Robocopy 排任务、DFS-R、存储副本,但要么配置繁琐,要么不能实时,要么被域环境绑得死死的。我今天要分享的是用 Syncthing 在两台 Windows Server 之间做文件实时备份,并且开启历史版本功能。这东西的好处在于免费、开源、跨平台,不需要额外买授权,配置起来也不复杂,同步延迟基本是秒级,而且自带“后悔药”——你要是不小心删了文件、改了错内容,它能保留历史版本,随时捞回来。
这套方案特别适合手里管着几台 Windows 服务器的运维、兼职管服务器的开发,以及那些不想把生产数据扔到第三方云盘、又想省钱的团队。只要两台机器能通过网络互相访问,哪怕是隔着公网,也能搭起来。整个方案不需要域控、不需要 SQL 数据库、不需要额外的 Web 服务,一个 exe 跑起来就完事。下面我把整个搭建过程和踩坑经验完整地写出来,照着做基本不会翻车。
1. 备选方案对比:为什么最后选了 Syncthing
先说清楚项目为什么不是上来就拿 Syncthing 开干,而是对比了一圈之后才定的。很多老运维的第一反应是 Robocopy + 计划任务,这招我用了好多年,确实稳,但有个致命伤:它是单向全量或增量拷贝,不能做到双向同步,出现“两边都改过同一份文件”的情况时没有合并策略,更谈不上历史版本。如果你误删了源文件,下一次计划任务执行的时候,备份机上的文件也会被删掉,后悔药完全不存在。
DFS-R 是微软官方的多主复制方案,能实时同步,也带冲突处理,适合域环境。但部署门槛高,需要 AD 域控支持,纯工作组模式配置很别扭,而且历史版本能力很弱,基本靠卷影副本配合,整链路下来维护成本相当可观。存储副本(Storage Replica)更不用提,那是企业级灾难恢复方案,需要 Windows Server Datacenter 授权,而且要专用磁盘,不适合普通业务场景。
Syncthing 相比这些方案有几个硬优势。第一是跨平台,Windows、Linux、NAS 都能用,以后想把备份目标换成 Linux 服务器或者国产化环境,一点改动都不用。第二是点对点同步,不经过中心服务器,所有传输走 TLS 加密,不会出现明文文件在网络上裸奔的问题。第三是双向同步和对等架构天然支持多节点,加一台备份机只是加一个设备 ID 的事。第四就是版本控制,这是它的杀手锏,也是今天这篇文章的核心。
还有一个容易忽略的点:Syncthing 有 Windows 服务模式。注册成系统服务之后,不依赖用户登录,服务器重启后可以自动拉起同步进程。这一点对无人值守的机房环境太重要了,Robocopy 方案里计划任务如果没配“不管用户是否登录都要运行”,经常会出现人不在、任务没跑的尴尬情况。
2. 搭建前的准备工作与版本选型
2.1 明确同步拓扑:双向同步还是单向备份
部署之前先想清楚一个问题:你要的是“双向同步”还是“单向备份”。很多教程上来就让你双向,但实际生产环境里,双向同步意味着两台服务器上的文件会被视为对等地位,任何一台的误删、恶意篡改、中毒加密,都会瞬间传染到另一台。我见过太多把主备做成双向、结果勒索病毒把备机也一起加密的真实案例。
所以我在实际的 Windows Server 文件实时备份项目里,强烈建议采用单向拓扑:生产服务器作为发送端(只上传),备份服务器作为接收端(只收不改)。Syncthing 在共享文件夹的“类型”选项里可以直接选“仅发送”和“仅接收”,不用额外写脚本限制。这样既保证了实时性,又保住了备份机的安全性。如果你手头有第三台机器做异地容灾,可以再让备份机往第三台转发,形成链式复制。
2.2 Windows Server 版本与安装包选择
我测试过 Windows Server 2016、2019、2022 三个版本,Syncthing 运行都没有问题。它本质是一个独立进程,依赖的系统组件很少,不需要 .NET 框架,也不需要额外装 VC++ 运行库。官网提供 Windows 的 zip 压缩包,解压之后直接能看到 syncthing.exe,架构选择 amd64 就可以,现在基本见不到 32 位服务器了。
这里插一句:Syncthing 有好几个衍生工具,比如 Syncthing-GTK、Synctrayzor,一般 Windows 用户推荐用 Synctrayzor,因为它能把 Syncthing 封装成托盘程序,支持开机自启、日志查看。但我个人建议你生产环境尽量用原版 syncthing.exe,加 Windows 服务方式运行,不要依赖托盘程序,因为托盘程序跟桌面会话绑定,服务器重启后如果没有人登录桌面,托盘应用可能不会正常启动。教程后面会专门讲怎么注册成服务。
下载完成后,把压缩包解压到类似 D:\Syncthing 的目录,目录路径最好全英文,避免中文路径在一些依赖库解析时出问题。然后先在前台运行一次,让它生成配置文件和密钥文件,确认没有报错后再注册服务。
2.3 首次启动与 GUI 安全加固
Syncthing 首次启动会在 %LOCALAPPDATA%\Syncthing 下生成配置文件,比如 config.xml、cert.pem、key.pem。它默认的 Web 管理界面只监听 127.0.0.1:8384,也就是说只能在服务器本机打开。你要是从办公室远程访问管理界面,需要改监听地址为 0.0.0.0,这里必须强调:改监听地址的同时一定要设置用户名和密码,否则你的管理界面完全裸奔在网络上,别人扫到 8384 端口就能看到你的全部同步状态,甚至能修改配置,这是极其危险的。
设置入口在“操作 - 设置 - 图形用户界面”面板,用户名密码一填,再勾选“仅使用 HTTPS 访问图形用户界面”,等于给管理界面加了一层安全壳。证书用默认的自签名即可,浏览器会提示不信任,点继续就行。
防火墙方面,需要放行的端口有三个:TCP 22000 用于设备间文件传输,UDP 22000 用于 QUIC 协议传输,UDP 21027 用于本地网络设备发现。如果只用“添加远程设备 + 设备 ID”方式连服务器,并且 IP 固定,其实 21027 可以不放行,省得端口暴露面太大。但 22000 必须放行,否则两台机器只能靠中继服务器中转,速度慢得让人抓狂。命令行添加防火墙规则可以用下面一段:
New-NetFirewallRule -DisplayName "Syncthing Web UI" -Direction Inbound -Protocol TCP -LocalPort 8384 -Action Allow New-NetFirewallRule -DisplayName "Syncthing Transfer" -Direction Inbound -Protocol TCP -LocalPort 22000 -Action Allow New-NetFirewallRule -DisplayName "Syncthing QUIC" -Direction Inbound -Protocol UDP -LocalPort 22000 -Action Allow New-NetFirewallRule -DisplayName "Syncthing Local Discover" -Direction Inbound -Protocol UDP -LocalPort 21027 -Action Allow注意:如果服务器本身在局域网里还有一层硬件防火墙策略(比如安全组),记得把对应端口在安全组里也放行,不要只在 Windows 防火墙里开了就以为万事大吉。
3. 两台 Windows Server 之间的实时同步配置
3.1 设备配对:理解设备 ID 与握手流程
Syncthing 使用设备 ID 来标识每一台机器,类似指纹一样的一长串字符,格式是“AAAAAAAA-BBBBBBBB-CCCCCCCC-DDDDDDDD-……”分成 4 组,每组 8 个字符。这个 ID 是从本机密钥证书派生出来的,在任何一台设备的 Web 界面上通常显示为二维码和文本,在“操作 - 显示 ID”里可以看全。
配对的流程是这样的:甲服务器上点“添加远程设备”,输入乙服务器的设备 ID,随便起个名字,保存。然后切到乙服务器的 Web 界面,会看到“发现新设备”的提示,点“添加设备”并勾选确认。两边都确认之后,设备列表里的连接状态才会变成“已连接”。这个互相确认的过程是为了防止有人伪造设备 ID 接入你的同步网络,尤其是跨公网部署时,建议通过企业微信、钉钉或者加密邮件把设备 ID 发给对方,不要直接截图发到公网群聊里。
我遇到不少新手在这步卡住,以为只要添加了设备 ID 就能通,结果忘了另一台机器也要添加回来。记住,Syncthing 的所有设备关系都是对等的,必须双向添加,不存在“主控端拉一下从机就自动入网”这种操作。
3.2 共享文件夹配置:文件夹 ID、路径与同步类型
设备配对完成后,开始配置共享目录。在甲服务器上点“添加文件夹”,填写“文件夹 ID”,这是它的唯一标识,可以是任意字母数字组合,比如 syncdata,注意它跟路径不是一回事。然后“文件夹路径”填实际要同步的目录比如 D:\Data;在“共享”标签页里勾选要把这个目录同步给哪台设备,也就是乙服务器。
接着是关键的“文件夹类型”。作为生产服务器,我建议选“仅发送”;如果这台机器就是备份接收方,选“仅接收”。这里一定要解释清楚:很多人不理解“仅发送”是不是意味着本地文件不会因为远端变化而改变。答案是:选“仅发送”后,本机向远端推送文件变化,远端对目录做的任何改动都不会同步回本机,因此本机相当于一个不可被回写的数据源。反过来“仅接收”就是只管拉取,绝不外推。只有当你做多节点互相编辑时才选“发送和接收”,但这也是风险最高的模式。
文件夹路径可以是指定盘符的任意目录,服务器上建议用 NTFS。FAT32 不支持单个文件超过 4GB,现在同步大数据库备份时完全不够用。如果哪天你发现大文件同步老是失败,先看一眼两边磁盘文件系统,别急着怀疑 Syncthing 出了 bug。
3.3 扫描间隔与实时观察:理解 watcher 机制
Syncthing 的“实时”到底有多实时?它的底层依赖两套机制:定时扫描和文件系统观察。默认的重新扫描间隔是 3600 秒,也就是 1 小时,如果你只靠这个,那就谈不上实时了,跟每小时跑一次 Robocopy 没什么区别。真正让它实时的是“观察变化”选项,也就是启用 fsnotify 类似的文件系统监听机制,Windows 上通过 ReadDirectoryChangesW API 实现。开启后,任何一个文件被创建、修改、重命名,Syncthing 都会在几秒内感知到变化,立即触发同步。
所以配置的时候,在“文件监视”里勾选“监视文件系统的更改”,并在“监视延迟”里设置一个合理的值。默认 10 秒,这个值太保守,我一般改成 1 秒。要注意的是:如果业务文件本身写入极其频繁,比如一个日志文件每几百毫秒就写一次,监视器会以为文件一直在变动,反复触发同步,反而拖累 IO。这时候可以把“监视延迟”调大一些,或者干脆对高频变动目录设置忽略模式。
扫描间隔我个人会保留 300 秒,作为兜底。万一文件系统 watcher 因为某种原因失效(比如端口占用、磁盘满导致句柄异常),定时扫描还能把遗漏的文件捞回来。两者是互补关系,不是二选一。
3.4 忽略模式与临时文件处理
实际业务目录里通常会有一些不需要同步的内容,比如缓存目录、临时文件、无用的 .tmp、日志压缩包、数据库临时锁文件等。Syncthing 支持正则表达式的忽略规则,在“忽略模式”里配置。格式类似 gitignore,每行一个正则表达式。
我的常用忽略配置:
(?i)\.tmp$ (?i)\.cache (?i)Thumbs\.db (?i)desktop\.ini (?i)^~$ (?i)~lock.*这里(?i)表示不区分大小写。Windows 文件名大小写不敏感的坑我记得特别深,最开始没加 (?i),结果字母大小写不同的文件名被当成不同文件反复同步。生产环境上还有一类文件要特别注意:正在被数据库占用的文件,比如 SQL Server 的 .mdf、.ldf,如果在线同步到另一台机器,备份端拿到的是不一致的损坏文件。这类业务数据最好不要直接用 Syncthing 做实时同步,要么先通过数据库自身的备份机制生成备份文件再同步,要么配合文件排除规则加上 VSS 快照这类方案。这个我在后面问题排查章节再展开说。
4. 带历史版本的“后悔药”机制
4.1 版本控制的原理:stversions 目录
Syncthing 的版本控制不是 CIFS 那种卷影复制,而是基于文件副本策略。你在某个文件夹上启用了版本控制后,每当这个文件夹里的文件发生修改或者删除,被替换掉的旧文件不会消失,而是会被移动到同一个文件夹下名为 .stversions 的隐藏目录里。这个目录默认隐藏,在 Windows 资源管理器里需要开启“显示隐藏项目”才能看到。
举个例子:D:\Data 下有个文件 report.docx,某天你误改并保存了,Syncthing 会把修改前的 report.docx 移到 D:\Data.stversions\report.docx 并且加上日期时间后缀,比如 report~20250401153026.docx。如果你直接删除了这个文件,它同样会被移动到 .stversions,而不是从磁盘上彻底消失。之后你随时可以从 .stversions 里找回历史版本,这就是所谓“后悔药”的完整机制。
需要注意一个关键点:版本控制是“每个文件夹”级别的配置,不是全局统一设置。你必须对每个共享目录单独打开版本控制,而且版本策略也是针对每个目录单独配置的。我见过有人只在生产服务器上配了版本控制,备份服务器漏配,结果备份端虽然也能接收实时文件,但历史老版本根本不会在备份端保留。严格来说,版本控制功能跟同步方向是独立的,只要在本机这个目录下发生文件被替换或删除的事件,本机自己的 .stversions 就会记录。但如果你想让备份端也留存历史副本,一定要在备份端也开启版本控制,否则将来恢复时只能从生产端的历史副本上找。
4.2 选对版本策略:简单版还是阶梯式
Syncthing 提供三种版本控制模式,我按实用性逐个说。
第一种是“简单文件版本控制”,参数只有一个:保留副本数量。比如你设成 5,那么同一个文件最多保留 5 个历史副本,超过 5 个后最老的会被自动清理。这种模式适合文件修改不频繁、空间充裕的场景,逻辑最简单,老版本不会堆积成灾。缺点是如果文件一天改十几次,它只保留最后 5 次,那些更早的想后悔也找不回来了。
第二种是“阶梯式文件版本控制”,也叫按时间分层保留。它可以设定一系列保留策略,比如最近 1 小时内每分钟、1 天内每小时、1 周内每天、1 个月内每周、1 年内每月,超出最大时间范围的版本全部删除。这种模式对“频率不同、历史重要程度不同”的场景非常契合。比如你的配置文件几天才改一次,但持续版本保留一年还是有用的,用简单模式你没法保证它一定留下一年前的版本,用阶梯模式就很清楚。
第三种是“过期时间版本控制”,只设定一个最大保留期限,比如 90 天,90 天内的所有历史版本都留着,超过 90 天后自动清理。这个适合项目临时归档、定时备份产物持续保存的文件,时间段内允许无限数量的版本,因此磁盘空间可能增长得非常快,务必定期观察。
我实际生产环境推荐组合:重要数据库备份文件目录用“过期时间版本控制”,保留 7 天;一般业务文档和配置文件用“阶梯式”,保留到一年。阶梯式参数我给一套现成的可以参考:保存时间 365 天,1 小时内版本保留数量 60,1 天内版本保留数量 24,1 周内版本保留数量 7,1 月内版本保留数量 4。这套参数的意思是,最近 1 小时内每分钟一个版本,最近 1 天内每小时一个版本,最近 1 周内每天一个版本,最近 1 月内每周一个版本,再往前的更老版本清理掉。换算下来一个文件最多几十份历史副本,不会无限膨胀。
4.3 如何从历史版本恢复文件
恢复文件的操作本身很简单,但步骤安排上有个反直觉的坑。假设生产服务器 D:\Data\important.xlsx 被误改了,你想恢复昨天下午的版本。你先到备份服务器或者生产服务器的 D:\Data.stversions 目录里,找到这个名字带时间戳的文件,然后直接复制回原位置。这里要注意:复制回去的时候,新的文件会被 Syncthing 当作“变更”,又会触发同步。如果你只是想临时看一下历史版本内容,最好先复制到一个临时目录,确认无误后中断 Syncthing 的同步或者暂停这个文件夹,再从临时目录覆盖回原路径。
恢复动作本身是不是安全?如果在“仅发送”目录里恢复旧版本,本机产生新变更,会同步给备份端,备份端自己的版本控制也会记录这次被覆盖前的版本,等于又多留了一份拷贝。如果是在“仅接收”目录里安装恢复,同样道理。所以只要你按普通文件复制操作处理,恢复动作造成的链式反应是可控的,不会被历史版本覆盖产生死循环。
要特别提醒的是:Syncthing 不会因为你在 .stversions 目录里翻文件而同步这个目录。.stversions 是内部管理目录,它不会被当成普通同步内容推给对端。所以不要指望在备份机上直接看到生产端 .stversions 的全部内容;生产端的历史版本是生产端独有的,备份端的历史版本是备份端独有的,除非两边都配置了相同的版本策略并且各自发生了相同文件的替换,否则两边历史可能不一致。
4.4 容量开销估算与清理策略
版本控制的本质是拿磁盘空间换安全感,但这个空间成本必须心里有数。简单估算公式:历史版本占用 ≈ 单份文件平均大小 × 文件变更频率 × 保留时间范围内副本数。
举一个实际例子,某个业务目录有 10GB 活跃文件,每天大概有 5% 的文件被修改,每个修改文件平均产生 2MB 的旧版本拷贝。采用“过期时间 7 天”策略,理论占用的历史空间就是 10GB×5%×2MB 等效值,实际上远小于 1GB,可以忽略。但如果是数据库备份目录,每天生成一个 5GB 的备份文件,启用了 7 天过期保留,那么 .stversions 可能累积 7 个 5GB 大文件,也就是 35GB。这在企业环境是非常常见的情况,所以我在选型时建议:大于 1GB 的文件不要直接同步到大版本历史目录,或者对备份文件设定更短的保留期。
Syncthing 的历史版本清理是异步完成的,不是文件一变旧就立刻删。它会按策略定期执行清理任务,所以你会看到 .stversions 目录的占用有时候超过估算值,这是正常现象。如果你的磁盘空间告急,最快的紧急处理办法是直接停掉 Syncthing 服务,手工删除 .stversions 里不需要的旧文件,然后再启动服务。停服务的意义在于避免 Syncthing 正读到一半的文件被自己删掉,导致数据库索引和实际文件不一致。
5. 实际操作中的问题排查看这一篇就够
5.1 设备之间始终无法连接
最常见的现象:两台设备在 Web 界面里都显示“未连接”,或者状态一直在“正在连接”和“断开”之间摇摆。排查思路按下面顺序来:
先确认网络层能不能通。在 A 机上执行Test-NetConnection -ComputerName B的IP -Port 22000,如果能返回 TcpTestSucceeded,说明 TCP 22000 通。如果超时,先检查 Windows 防火墙入站规则,再检查安全组/物理防火墙。这里有个容易忽略的点:如果 22000 端口在两台服务器上都不通,Syncthing 会自动尝试通过中继服务器通信,虽然也能打通,但文件传输要走对方的中继带宽,速度会非常慢。所以局域网环境里,务必优先检查直连通道。
然后检查设备 ID 是否输错。设备 ID 中间是短横线分隔,很容易在多行复制时混入换行符导致校验失败。正确做法是在“操作 - 显示 ID”里点复制按钮,然后粘贴到对方设备添加窗口。
再检查时钟偏差。Syncthing 的 TLS 会话对时间敏感,如果两台服务器时间差超过几分钟,握手会失败。Windows Server 如果没配置 NTP 时间同步,长期运行后时钟漂移非常常见。在命令行执行w32tm /resync强制校准一次,并建议配置好时间同步源。
5.2 Windows 文件占用导致同步失败
Windows 下有一个非常经典的坑:文件被某个进程锁定。Syncthing 在读取或覆盖文件时会尝试打开文件,如果文件正被 Word、Excel、数据库进程独占,它会报访问被拒绝的错误,重试几次后该文件被标记为同步失败。
日志里常看到类似 “folder: failed to sync file: access is denied” 的提示。解决办法有三个方向。第一,对业务正在热写且不能停服的文件,不要直接纳入同步目录,宁可让应用先导出临时文件,再移动进同步目录。第二,打开 Syncthing 的“重试”机制,设置较多重试次数。但这只能解决瞬时锁,解决不了长期锁。第三,直接在忽略模式里排除这类正在使用的扩展名,例如数据库临时锁文件。
一个迂回技巧我用的比较多:让生产机的同步目录指向只读副本目录,由业务系统通过 Robocopy 或者文件分类器把需要的文件复制到同步目录。虽然多了一次 IO,但切断了应用和同步工具的直接冲突。
5.3 “同步冲突”文件是怎么来的
如果你在同步目录里看到类似report~sync-conflict-20250401-153026.docx的文件,说明同一个文件在两边都有修改,Syncthing 无法判断哪个版本优先,于是把冲突方保留为额外文件。出现此情况后,你需要人工决定保留哪个,删除“sync-conflict”前缀的文件。如果不处理,这只是多占点空间;如果两边持续互相覆盖,同步往往会停摆。
为了避免冲突,我强烈建议单向同步场景下接收方不要编辑同步目录的文件,也不要在备份机上直接打开生产数据做读写操作。哪怕只是双击打开看一眼然后保存,也会瞬间产生签名变化,因为写入时间和内容hash都会变。生产环境要读取旧文件,应该先复制到非同步目录再看。
5.4 内存和 CPU 持续偏高
Syncthing 本身非常轻量,空闲时占用内存大约几十 MB。如果你发现它的进程占用 CPU 长期超过 30%,优先怀疑两个问题:一是目录里的文件规模太大,变更事件风暴导致扫描和同步循环;二是数据库索引膨胀。Config 里的数据库默认存在 %LOCALAPPDATA%\Syncthing\index-v0.14.0.db,如果同步了上百万个文件,索引查询会明显拖慢响应。
解决办法:尽量避免把整个盘符 C:\ 或者 D:\ 直接拖进同步,人为把同步范围拆成多个文件夹,这样发生变更时扫描范围小。如果索引已经膨胀,可以备份好配置后删掉 index 数据库目录,重启 Syncthing,让它全量重建索引。这个过程同步会重新计算所有文件 hash,耗时视文件量而定,但一般都比忍受持续高 CPU 强。注意:删除索引数据库不会删除你的同步文件,只是重新扫描一次,安全。
5.5 版本历史目录占用越来越大
除非你在配置里设了策略,否则 Syncthing 不会主动清理 .stversions。网上很多人说虽然选了简单模式但 .stversions 从来没小过,多半是因为这个文件夹的清理发生在“文件被再次替换”的时机上,不是在后台定时清理。假设一个文件历史版本本以为会按数量裁剪,结果文件被移走了但同步本身没有太多新替换事件,旧版本就一直躺在磁盘里。
经验做法是:每个季度人工审计一次 .stversions 目录,记录磁盘占用,观察增长曲线。如果某个目录被替换频率超出预期,赶紧调整版本策略,别再让它继续疯长下去。真要手工清理时,先停 Syncthing 服务再删文件,这是为了避开文件占用冲突。
6. 长期运维必须注意的细节
6.1 把 Syncthing 注册成 Windows 服务
我一开始说了,生产服务器不要用托盘程序。把 syncthing.exe 注册成 Windows 服务,可以保证开机自启、不依赖用户登录、系统异常退出后由服务控制管理器拉起。注册方式很多,官方文档推荐用 NSSM,也可以直接用 sc.exe。
用 sc.exe 注册时有个坑:syncthing.exe 如果不带参数直接跑,它会使用当前用户目录作为配置目录。作为服务运行时,为了隔离账号权限,最好指定一个独立的配置和日志目录。示例命令如下:
sc create Syncthing binPath= "D:\Syncthing\syncthing.exe serve --home=D:\Syncthing\config --logfile=D:\Syncthing\syncthing.log" start= auto displayname= "Syncthing Service"serve子命令是告诉 Syncthing 以服务方式运行,不打开浏览器,不启动托盘图标。--home参数把配置目录指定到 D:\Syncthing\config,而不是默认的 %LOCALAPPDATA%。--logfile把日志落到固定文件,后面排查问题直接看日志文件就行。配置目录里会重新生成证书和 config.xml,所以在注册服务前先手动运行一次syncthing.exe serve --home=D:\Syncthing\config,生成初始配置后再注册。
服务账户建议使用本地系统账户,足够满足读取同步目录的权限。如果同步目录在别的机器映射的网络驱动器上,就会踩到另一个坑:Windows 服务默认无法访问网络共享盘符映射。Syncthing 官方明确不建议在网络驱动器上使用,因为它需要本地文件系统级别的通知能力,局域网的 NAS 映射盘老是出各种权限问题。所以生产环境请把同步目录放在本地盘上。
6.2 把 Syncthing 自身也纳入备份范围
很多人的“后悔药”只覆盖了同步数据,却忽略了 Syncthing 本身的配置。如果你的 config.xml 丢了,意味着设备配对关系、文件夹 ID、版本策略全部丢失,重装之后所有设备都要重新添加。我自己的做法是每周把 D:\Syncthing\config 整个目录压缩后丢入另一个同步目录,等于给“备份工具”再做一份备份。
另外提醒一个细节:如果你修改了版本控制策略、忽略规则这类配置,Syncthing 不会自动把历史配置也留存。所以重大策略调整前,先手动备份 config.xml,操作失误了还能回滚配置。
6.3 防止病毒和勒索软件把版本库一锅端
备份机最大的噩梦是勒索病毒不仅加密了原文件,还把 .stversions 这些历史版本目录也加密了。即使 Syncthing 是实时同步,病毒也会把加密这个过程实时同步给备份端。关于这一点,Syncthing 无法替你防守,它只是一个同步工具,不是安全软件。
我建议在备份机上给 Syncthing 服务账户配置最小权限:只给同步目录的写入权限,不给管理权限;备份机上的 .stversions 目录可以设置 ACL,禁止普通业务账号写入或删除,只允许 Syncthing 服务账户和系统管理员操作。另外,如果条件允许,在另一台物理隔离的机器上定期把备份机的 .stversions 打包拉走,离线保存。这样即使在线备份也中了招,你还有一份离线快照可以救命。
6.4 监控与告警:别等出事了才去翻日志
Syncthing 的 Web 界面可以看同步状态,但人不可能 24 小时盯着页面。Windows 上可以利用计划任务每 5 分钟探测一次 8384 端口是否响应,不通就发一封邮件告警。也可以直接在 Syncthing 上开启“事件日志”功能,配合 NXLog、Winlogbeat 把日志收集到中心平台。
更简单的办法:用 PowerShell 调用 Syncthing 的 REST API。默认 8384 端口上/rest/db/status?folder=folderID能拿到文件夹同步状态,通过返回值判断是否有文件同步失败,然后触发企业微信或钉钉机器人推送。流程不复杂,但很多团队都懒到没配,等到业务方来反馈文件不对才开始查,非常被动。
这套方案运行了这么久,最大的感受是:Syncthing 的实时性做得很出色,配合版本控制后,它已经不只是“备份工具”,更像是给你买了一整箱后悔药。但技术只是工具,真正保证数据安全的是清晰的同步拓扑、明确的版本策略和定期的容灾演练。如果你正准备把 Windows Server 之间的文件备份从定时任务升级成实时同步,建议先用一个小目录跑通整个流程,再逐步扩大范围,千万别一上来就把核心生产目录交给新方案,稳字当头总没错。