系列:文件共享与传输
- 用 vsftpd 在 Ubuntu 上搭建文件共享服务器
- SCP 和 SFTP 使用指南:远程文件传输基础
- Samba 安装与配置指南:Linux 和 Windows 文件共享
- NFS 安装与配置指南:Linux 系统间文件共享
- Syncthing 异地同步指南:多设备文件同步不带公网 IP
背景
多台设备之间同步文件,最直接的方式是网盘。但网盘有容量限制、隐私风险,而且需要公网服务器中转。如果在不同城市的 Linux 服务器、笔记本、NAS 之间保持文件夹实时同步,又不想暴露公网 IP,Syncthing 是比 rsync 更合适的选择。
Syncthing 基于 P2P 架构,设备之间直接传输,数据不经过中心服务器。它使用设备 ID(一串唯一标识)建立信任关系,通过 全局发现服务器 和 中继服务器 辅助 NAT 穿透,即使两台设备都没有公网 IP,也能建立连接。同步过程加密,支持版本控制和忽略模式。源码托管在 GitHub,官方文档 详尽。
本文从在两台 Ubuntu 22.04 服务器和一台 Windows 笔记本之间同步一个文件夹为例,介绍 Syncthing 的基本使用和常见问题的处理。
Syncthing 的核心概念
开始之前需要理解几个关键概念,否则后面配置容易混乱。
设备 ID
每台安装 Syncthing 的设备都会自动生成一个设备 ID,类似 ABC123DEF-456GHI... 的字符串。这是一台设备的唯一标识,用于其他设备识别和加密连接。设备 ID 可以在 Web 管理界面查看,也可以从命令行获取。
共享文件夹
你想同步的目录,在不同设备上可以路径不同,但同一个共享文件夹的标签必须一致。例如服务器 A 的 /data/project 和笔记本的 D:\project 都对应标签 myproject,Syncthing 会将它们视为同一个文件夹并同步内容。
引入(Introducer)
如果设备 A 已经和 B 建立了连接,并且 A 和 C 也建立了连接,你可以让 A 作为引入人,把 B 介绍给 C。这样 B 和 C 不需要手动添加对方,适合设备数量多的场景。
中继与发现
Syncthing 依赖发现服务器来获知其他设备的地址和端口,如果两端都在 NAT 后面无法直连,会自动尝试通过中继服务器中转流量。中继服务器默认由社区提供,也可以自建。
安装 Syncthing
在 Ubuntu 上推荐使用官方 APT 仓库安装,这样能自动更新:
sudo curl -s -o /usr/share/keyrings/syncthing-archive-keyring.gpg https://syncthing.net/release-key.gpgecho "deb [signed-by=/usr/share/keyrings/syncthing-archive-keyring.gpg] https://apt.syncthing.net/ syncthing stable" | sudo tee /etc/apt/sources.list.d/syncthing.listsudo apt updatesudo apt install syncthing -y安装完成后,Syncthing 会以当前用户身份运行。启动用户级别的 systemd 服务:
systemctl --user enable syncthing.servicesystemctl --user start syncthing.serviceSyncthing 默认监听本地 127.0.0.1:8384,仅能从本机访问 Web 管理界面。如果服务器无图形界面,可以通过 SSH 隧道访问:
ssh -L 8384:localhost:8384 user@server-ip然后浏览器打开 http://localhost:8384。
Windows 和 macOS 可以直接从 Syncthing 下载页面 获取安装包。Windows 下默认会作为系统服务运行,启动后在系统托盘可以打开管理界面。
首次配置:绑定地址与安全
刚安装的 Syncthing 监听 127.0.0.1,如果需要在同一局域网的其他设备访问这台服务器上的管理界面(或者服务器有桌面环境的远程桌面),可以改为 0.0.0.0:8384。通过 Web 界面右上角 “操作” -> “设置” -> “GUI” 修改 GUI 监听地址。同时建议设置用户名和密码,防止未授权访问。
修改后需要重启 Syncthing 服务:
systemctl --user restart syncthing.service添加设备并共享文件夹
假设有两台设备:服务器 A(Ubuntu,/data/docs)和笔记本 B(Windows,D:\docs)。
第一步:获取设备 ID
在每台设备的 Web 界面顶部可以看到自己的设备 ID,或者在命令行执行:
syncthing --device-id记录下两台设备的 ID。
第二步:在服务器 A 上添加笔记本 B
点击右侧 “远程设备” -> “添加设备”,输入笔记本 B 的设备 ID,可以自定义设备名称。高级选项保留默认(动态地址、自动接受等)。点保存后,服务器 A 会尝试连接笔记本 B。
第三步:在笔记本 B 上确认
稍等片刻,笔记本 B 的 Web 界面会弹出 “来自服务器A的设备连接请求”,同样添加设备并输入服务器 A 的设备 ID 确认。双方设备建立信任后,“远程设备”列表中会显示彼此的状态为“已连接”。
第四步:共享文件夹
在服务器 A 界面点击 “文件夹” -> “添加文件夹”,输入标签(如 docs),路径设为 /data/docs。在“共享”标签页勾选笔记本 B,然后保存。同样,在笔记本 B 上添加相同标签 docs 的文件夹,路径设为 D:\docs,并共享给服务器 A。
之后两台设备会开始扫描文件和同步。注意:如果某个文件夹已经有文件,Syncthing 会扫描后推送给对方;双方都存在同名文件时会以时间戳较新的为准。
更详细的操作流程可参考 Syncthing 入门指南。
高级特性:中继、版本控制和 ignore
中继地址
如果两台设备始终显示“断开连接”,可能是 NAT 穿透失败。可以在每台设备设置 -> 连接 -> 协议监听地址中添加 relay:// 确保中继可用。默认使用的社区中继服务器列表见 Relay Pool。有隐私需求可以自建中继,参考 Syncthing Relay Server。
版本控制
防止误删或同步冲突,可以在文件夹的高级设置中启用版本控制。支持几种模式:
simple:保留 N 个版本,旧版本删除。staggered:按时间保留版本,越新的保留越多。trashcan:删除的文件移到.stversions目录。
忽略模式
在文件夹的“忽略模式”中可以编写类似 .gitignore 的规则,排除临时文件、编译产物等。例如:
*.tmpnode_modules/.venv/配置文件存储在 .stfolder 同级的 .stignore 中。
常见问题
1. 两台设备始终显示“断开连接”
首先检查双方是否都能访问互联网(P2P 连接可能因防火墙被直接阻断)。在 Web 界面右上角的“帮助” -> “调试”中,查看 “最近发现的设备” 和 “连接尝试”。如果长期无尝试,可能是发现服务器不可达。另外确认设备 ID 完全正确,且双方都已添加对方。尝试在设置中开启全局发现和中继。
2. 同步速度极慢(几十 KB/s)
P2P 直连的速度取决于两端网络,但如果是通过中继传输,速度会受中继服务器带宽限制。可以尝试在连接设置中限制速率,或使用 UPnP 来打洞。如果设备在同一局域网,可以在连接设置中填写对方的局域网 IP 地址,强制走局域网直连。
3. 文件冲突出现两个文件
Syncthing 没有文件锁机制,多人同时编辑同一文件会冲突。冲突后会将一个文件重命名为 文件名.sync-conflict-年月日-时分秒.扩展名。可以通过版本控制功能恢复,或手动合并。
4. 如何备份同步配置
Syncthing 所有配置默认存储在 ~/.config/syncthing/(Linux)或 %LOCALAPPDATA%\Syncthing\ 下。备份整个目录即可。配置文件是 XML 格式,也可以只备份 config.xml 和数据库目录 index-v0.14.0.db。
5. 更换设备后如何恢复
在新设备安装 Syncthing 后,不要直接启动,先将备份的 config.xml 和索引数据库复制到对应配置目录,再启动服务。这样设备 ID 不变,其他设备无需重新添加。
总结
Syncthing 解决了多设备文件同步时的网络障碍和中心化依赖问题。一旦设备之间建立信任,文件自动分发,即使跨地域、无公网 IP 也能工作。常见的连接问题多与 NAT 或防火墙有关,利用中继和静态地址可解决。对于需要离线协作或备份的场景,Syncthing 是一个稳定且自控的基础工具。
如果需要共享给其他人(非设备间直接信任),Syncthing 并不擅长,这时候可以考虑结合 Samba 安装与配置指南:Linux 和 Windows 文件共享 或搭建临时 Web 服务器分发文件。