如果你经常在电脑、手机、NAS 和 VPS 之间复制同一批文件,很快就会遇到三个问题:哪一份才是最新的、删错文件会不会同步删除、外网环境下怎么安全连接。Syncthing 的作用就是让多台设备直接同步文件,不依赖某一家网盘。
把 Syncthing 部署在 VPS 上,可以得到一个长期在线的同步节点。笔记本关机时,手机仍能先把文件同步到 VPS;另一台电脑上线后,再从 VPS 获取最新内容。不过,VPS 不是 Syncthing 的“中心服务器”,设备之间能够直连时仍会直接传输。
本文使用 Syncthing v2.1.3 和官方 Docker 镜像,讲清 Docker Compose、设备配对、文件夹模式、版本保留、冲突文件、.stignore、22000 端口、WireGuard 私网、备份恢复和常见故障。最重要的结论先说:同步不等于备份,删除、覆盖和勒索软件修改都可能传播到其他节点。
适合使用 Syncthing 的情况:
- 在 Windows、macOS、Linux、Android 和 NAS 之间同步文件;
- 想让 VPS 作为全天在线的中转和副本节点;
- 不想把文件交给第三方网盘;
- 需要局域网高速直连,外网时自动切换直连或 Relay;
- 想按文件夹控制发送、接收、版本保留和忽略规则;
- 能自己维护 VPS、权限、防火墙和独立备份。
不适合的情况:
- 需要多人在线编辑同一个 Office 文档;
- 需要浏览器分享链接、在线预览和复杂权限;
- 把同步目录当作唯一备份,完全不做快照或离线备份;
- 需要严格的企业审计、文件审批和数据防泄漏;
- 大量小文件频繁变化,却没有评估磁盘、数据库和扫描开销。
如果更需要网盘式的网页访问和分享,可以参考 VPS 搭建 OpenList 教程。如果主要管理合同、发票和扫描件,可以看 Paperless-ngx OCR 文档归档教程。
| 工具 | 同步方式 | 主要优势 | 注意点 |
|---|---|---|---|
| Syncthing | 多设备持续双向同步 | 自动发现、加密传输、跨平台 | 删除和覆盖会传播 |
| rsync | 命令行单向复制 | 简单、可脚本化、适合服务器 | 不负责多设备实时状态 |
| rclone | 云存储复制与同步 | 支持大量对象存储和网盘 | 双向实时同步不是核心能力 |
| Nextcloud | 中心化网盘和协作 | 网页、分享、用户和应用生态 | 服务更重,依赖数据库和 Web |
| OpenList | 多存储聚合与 WebDAV | 统一挂载和浏览云盘 | 不是点对点同步系统 |
Syncthing 最适合“这些设备都属于我,我想让文件自动保持一致”。它没有中心账号体系,每个设备通过 Device ID 互相信任,文件传输使用 TLS 加密。
一个典型架构如下:
手机 ───────────────┐
│
笔记本 ── 直连/Relay ├── VPS Syncthing 常在线节点
│
家中 NAS ───────────┘
VPS 的价值主要有三个:
- 其他设备不同时在线时,VPS 暂存最新副本;
- 家庭网络没有公网入口时,VPS 更容易被设备连接;
- 可以在 VPS 上保留版本目录和额外备份。
但是,如果手机和笔记本在同一个局域网,Syncthing 通常会尝试局域网直连,不需要绕 VPS。不要把它误解成所有流量必须经过 VPS 的传统网盘。
本文按 2026 年 8 月核对的稳定版本编写:
Syncthing v2.1.3
Docker image: syncthing/syncthing:2.1.3
常见端口:
| 端口 | 用途 | 是否需要公网开放 |
|---|---|---|
| 8384/TCP | Web GUI | 默认不开放,只监听本机或 VPN |
| 22000/TCP | 文件同步直连 | 需要公网直连时开放 |
| 22000/UDP | QUIC 文件同步 | 需要 QUIC 直连时开放 |
| 21027/UDP | 局域网发现 | 公网 VPS 通常不需要开放 |
Syncthing 还能使用公共 Relay。即使 22000 没有公网放行,设备也可能通过 Relay 建立连接,但速度和延迟通常不如直连。
Syncthing 本身很轻,资源主要消耗在文件扫描、哈希计算、数据库索引和版本保留:
| 场景 | 推荐配置 | 说明 |
|---|---|---|
| 少量文档与配置 | 1 核 1GB、30GB SSD | 适合几万文件以内 |
| 照片与家庭文件 | 2 核 2GB、80GB+ SSD | 给版本目录和索引留空间 |
| 多设备、大量小文件 | 2-4 核、4GB+ | 重点关注磁盘 I/O 和 inode |
磁盘容量至少要覆盖:
当前同步数据
+ 文件版本目录
+ 临时下载文件
+ Syncthing 索引数据库
+ 独立备份预留
如果源目录有 100GB,而你开启了长期版本保留,80GB VPS 肯定不够。版本历史应该设置保留周期和最大数量,不能无限增长。
确认 Docker 与 Compose:
docker version
docker compose version
没有 Docker 时,可以先看 Docker 部署实战指南。
创建配置、同步数据和版本目录:
sudo mkdir -p /opt/syncthing/config
sudo mkdir -p /opt/syncthing/data
sudo mkdir -p /opt/syncthing/versions
sudo chown -R 1000:1000 /opt/syncthing
sudo chmod 750 /opt/syncthing
cd /opt/syncthing
官方容器默认使用 UID 1000 和 GID 1000。先检查宿主机目标目录权限,避免容器能启动但无法写入同步文件。
创建 /opt/syncthing/compose.yaml:
services:
syncthing:
image: docker.io/syncthing/syncthing:2.1.3
container_name: syncthing
hostname: vps-syncthing
network_mode: host
restart: unless-stopped
environment:
PUID: "1000"
PGID: "1000"
UMASK: "0022"
STGUIADDRESS: ""
volumes:
- ./config:/var/syncthing/config
- ./data:/var/syncthing/data
- ./versions:/var/syncthing/versions
healthcheck:
test:
- CMD-SHELL
- curl -fkLsS -m 2 127.0.0.1:8384/rest/noauth/health | grep -q OK
interval: 1m
timeout: 10s
retries: 3
官方 Docker 文档推荐 host network,因为默认 bridge 网络会让 Syncthing 只看到容器地址,影响局域网发现和直连判断。使用 host network 后,Syncthing 自己控制监听地址和端口,防火墙配置必须更谨慎。
STGUIADDRESS 设为空,让 Syncthing 使用配置文件里的 GUI 地址。初始配置通常监听 127.0.0.1:8384,避免管理界面直接暴露到公网。
检查配置:
cd /opt/syncthing
docker compose config --quiet
启动:
docker compose pull
docker compose up -d
docker compose ps
docker compose logs --tail=150 syncthing
检查 GUI 健康状态:
curl -fsS http://127.0.0.1:8384/rest/noauth/health
正常时会看到 OK。如果连接被拒绝,查看容器日志和监听地址:
sudo ss -lntup | grep -E ':(8384|22000)\b'
docker compose logs --tail=250 syncthing
在自己的电脑建立隧道:
ssh -L 8384:127.0.0.1:8384 your_user@your_vps_ip
浏览器打开:
http://127.0.0.1:8384
第一次登录后立即做三件事:
- 设置 GUI 用户名和独立强密码;
- 确认 GUI Listen Address 仍为 127.0.0.1:8384;
- 给设备设置清晰名称,例如 vps-sync、home-nas、work-laptop。
Device ID 用于识别设备证书,不是 GUI 密码。只把它提供给需要配对的设备,GUI API Key 和管理员密码则必须保密。
如果希望设备直接连接 VPS,可以开放 22000 TCP 和 UDP:
sudo ufw allow 22000/tcp
sudo ufw allow 22000/udp
sudo ufw status numbered
通常不要在公网 VPS 上开放 21027/UDP。它主要用于局域网广播发现,跨互联网同步依赖全局发现、静态地址或 Relay。
确认 8384 没有公网开放:
sudo ufw status
sudo ss -lntp | grep ':8384'
只要 GUI 监听 127.0.0.1,即使防火墙误放行 8384,外网通常也无法连接。但安全配置应同时限制监听地址和防火墙,不能只依赖其中一层。
如果所有设备已经加入 WireGuard,可以不开放公网 22000,只允许 VPN 网段访问:
sudo ufw allow from 10.66.66.0/24 to any port 22000 proto tcp
sudo ufw allow from 10.66.66.0/24 to any port 22000 proto udp
在客户端的远程设备地址中填写:
tcp://10.66.66.1:22000
quic://10.66.66.1:22000
然后可以关闭全局发现和 Relay,减少外部元数据暴露。WireGuard 部署可以参考 VPS 搭建 WireGuard VPN 教程。
注意:关闭发现和 Relay 后,地址配置错误就没有自动备用路径。先确认 VPN 路由和 22000 端口可达,再关闭自动连接机制。
在 VPS GUI 中找到本机 Device ID,然后在另一台设备中选择 Add Remote Device。填入 VPS Device ID,设置设备名称和地址。
推荐的配对流程:
- 在设备 A 添加设备 B;
- 在设备 B 接受待添加设备;
- 双方核对显示的 Device ID;
- 先不共享重要目录,只共享一个测试文件夹;
- 确认连接类型、上传下载和删除行为后再迁移数据。
设备状态显示 Connected 不代表文件夹已经共享。设备信任和文件夹共享是两层配置,必须在文件夹设置中选择允许访问的设备。
在 VPS 上新增文件夹:
Folder Label: Personal Sync
Folder ID: personal-sync
Folder Path: /var/syncthing/data/personal
Folder Type: Send & Receive
宿主机对应目录是:
/opt/syncthing/data/personal
创建并修正权限:
sudo mkdir -p /opt/syncthing/data/personal
sudo chown -R 1000:1000 /opt/syncthing/data/personal
Folder ID 必须在共享设备之间一致,但每台设备的 Folder Path 可以不同。例如 Windows 使用 D:\Sync\Personal,VPS 使用 /var/syncthing/data/personal。
所有设备都可以修改,变化会互相同步。适合个人文档、照片和项目文件,但最容易传播误删和冲突。
本设备被当作主要来源。本地内容发送给其他设备,远程修改不会正常覆盖本地权威副本。适合把 NAS 或工作电脑设为主数据源。
本设备主要接收其他节点的数据。本地出现未同步修改时会提示 Revert Local Changes。适合 VPS 作为只接收副本,但它仍不是独立备份。
不受信任设备只保存加密后的文件块,无法直接读取文件内容。适合租用的 VPS 只承担加密存储节点。
Receive Encrypted 需要在可信设备上正确保存文件夹密码。密码丢失后,VPS 上的加密数据不能直接恢复。部署前用测试文件确认加密、恢复和迁移流程。
Syncthing 的版本管理主要保护“从其他设备同步过来的删除和覆盖”。常见类型:
- Trash Can:把旧文件移动到版本目录;
- Simple File Versioning:为旧版本添加时间戳并保留固定数量;
- Staggered File Versioning:近期版本密集保留,旧版本逐步稀疏;
- External File Versioning:调用自定义脚本处理版本。
家庭和个人场景可以从 Staggered File Versioning 开始,并把版本目录设为:
/var/syncthing/versions/personal
对应宿主机:
/opt/syncthing/versions/personal
重要限制:版本管理通常处理来自远程设备的变化。如果你在同一台设备本地直接覆盖文件,不一定会产生 Syncthing 版本。真正重要的数据仍要使用快照、restic 或对象存储备份。
在同步文件夹根目录创建 .stignore,可以忽略缓存、构建产物和临时文件:
(?d).DS_Store
Thumbs.db
~*
*.tmp
node_modules
.git
.cache
规则要先在测试目录验证。忽略数据库文件、应用配置或隐藏目录可能导致恢复时缺少关键数据。
.stignore 是设备本地规则,不要假设它会自动按你的预期传播到所有设备。多设备使用时逐台检查忽略规则和扫描结果。
两台离线设备同时修改同一个文件,重新连接后可能生成类似文件:
report.sync-conflict-20260808-103000-DEVICE.txt
处理步骤:
- 暂停相关文件夹;
- 比较原文件和冲突文件;
- 手动合并或保留正确版本;
- 删除不需要的冲突副本;
- 恢复同步并观察是否再次产生冲突。
Syncthing 不理解 Word、Excel 或数据库内部结构,不能自动合并复杂文件。SQLite、虚拟机磁盘、邮件数据库等持续写入文件不适合直接实时同步,应该使用应用自带的导出或一致性备份。
Windows、macOS 和 Linux 可以使用对应平台客户端。Android 常见方案包括社区维护客户端;iOS 受后台运行和文件系统限制,第三方客户端的行为与桌面版不同。
移动端要注意:
- 系统省电策略可能暂停后台同步;
- 蜂窝网络同步会消耗大量流量;
- 照片目录权限可能被系统限制;
- 客户端退出后不一定持续扫描;
- 首次同步前先限制文件夹范围。
不要一开始就同步整个手机存储或用户主目录。先选择一个测试文件夹,验证充电、Wi-Fi、后台和冲突策略。
Syncthing 会忠实传播变化,其中也包括坏变化:
- 误删文件;
- 勒索软件批量加密;
- 应用写入损坏数据;
- 错误脚本重命名或清空目录;
- 用户把错误版本覆盖到所有设备。
至少准备一套独立备份:
Syncthing 实时同步
+ VPS/存储快照
+ restic 或 rclone 异地备份
+ 定期恢复演练
可以参考 VPS 备份恢复演练教程。
备份 Syncthing 配置前停止容器:
cd /opt/syncthing
docker compose stop
sudo tar -czf syncthing-config-$(date +%F).tar.gz config compose.yaml
docker compose start
chmod 600 syncthing-config-*.tar.gz
同步数据应使用独立备份工具处理,不要只打包到同一个 VPS 磁盘。
升级前记录当前镜像并备份配置:
cd /opt/syncthing
docker inspect syncthing --format '{{.Config.Image}}'
sudo tar -czf syncthing-before-upgrade-$(date +%F).tar.gz config compose.yaml
修改镜像标签后执行:
docker compose pull
docker compose up -d
docker compose ps
docker compose logs --tail=200 syncthing
升级后检查:
- GUI 登录和设备列表;
- 直连、QUIC 或 Relay 连接类型;
- 文件夹扫描和同步状态;
- 版本目录是否仍可写;
- 忽略规则和文件夹密码;
- 健康检查是否通过。
Syncthing 2.x 可能升级内部数据库。不要在没有配置备份的情况下随意回退到旧大版本;先阅读 Release Notes,必要时在副本节点测试。
检查监听和容器状态:
docker compose ps
docker compose logs --tail=200 syncthing
sudo ss -lntp | grep ':8384'
curl -v http://127.0.0.1:8384
如果 GUI 只监听 127.0.0.1,必须使用 SSH 隧道或在 VPS 本机访问。不要为了方便直接改成 0.0.0.0 而不设置认证和防火墙。
先检查远程地址和 22000 端口:
sudo ss -lntup | grep ':22000'
sudo ufw status
nc -vz your_vps_ip 22000
再看 GUI 的 Connections 和日志。若直连失败但 Relay 正常,通常是防火墙、NAT 或地址配置问题。
Relay 说明设备没有建立直接连接。检查:
- VPS 22000 TCP/UDP 是否放行;
- 客户端网络是否限制 UDP;
- 全局发现是否开启;
- 静态地址是否填写错误;
- WireGuard 路由是否覆盖 VPS 私网地址。
先确认 TCP 直连,再排查 QUIC,不要一次改动所有连接选项。
检查容器 UID/GID 和宿主机目录:
docker compose exec syncthing id
ls -ld /opt/syncthing/data /opt/syncthing/versions
sudo chown -R 1000:1000 /opt/syncthing/data /opt/syncthing/versions
如果同步外接磁盘或网络挂载,还要检查挂载参数、ACL 和文件系统是否支持权限与重命名。
Syncthing 会在文件夹根目录使用 .stfolder 标记。目录被替换、挂载失败或标记被误删时会暂停同步。
先确认真正的数据盘已经挂载,再恢复标记。不要在空目录上直接点击恢复同步,否则可能把“空目录”当成删除结果传播到其他设备。
大量小文件、频繁变更和多个版本会增加数据库与扫描开销。可以:
- 排除 node_modules、缓存和构建目录;
- 降低不必要的全量扫描频率;
- 把日志、数据库和虚拟机磁盘移出同步目录;
- 检查磁盘 I/O、inode 和可用空间;
- 按业务拆分多个文件夹。
Syncthing v2.1 支持对特定文件夹关闭块索引,以减少数据库大小和开销,但会降低增量传输效率。只有理解取舍并完成测试后再启用。
- GUI 8384 只监听本机或 WireGuard 私网;
- GUI 设置用户名、强密码,不公开 API Key;
- 公网只开放确实需要的 22000 TCP/UDP;
- 公网 VPS 通常不开放 21027/UDP;
- 不需要全局发现和 Relay 时可以关闭;
- Device ID 只与需要配对的设备交换;
- 重要文件夹启用版本管理,但不把版本目录当唯一备份;
- 不同步数据库、虚拟机磁盘和持续写入的应用文件;
- 定期检查冲突文件、失败项目和磁盘空间;
- 配置、数据和备份使用不同的恢复路径;
- 升级前固定版本并备份 config;
- Receive Encrypted 的文件夹密码保存在可信设备和密码管理器中。
能够直连时,文件在设备之间直接传输。直连失败时可能使用 Relay,但文件传输仍是端到端加密。全局发现服务主要帮助设备找到彼此。
只要其他设备能互相连接,就可以继续同步。VPS 只是一个常在线节点,不是必须存在的中心控制器。
会。Send & Receive 文件夹中的删除通常会传播到其他设备。需要版本管理和独立备份来降低误删风险。
可以使用 Receive Only。它能降低 VPS 本地误操作传播的风险,但勒索软件或源设备误删仍可能同步到 VPS,因此依然需要版本管理和快照。
个人使用可以从 1 核 1GB VPS、Syncthing v2.1.3、一个测试文件夹和 SSH 隧道管理开始。先确认设备配对、文件新增、修改、删除、冲突和版本恢复都符合预期,再逐步扩大同步范围。
稳定的 Syncthing 架构不是“所有设备都双向同步整个硬盘”,而是按用途拆分文件夹,为每个节点选择正确模式,限制 GUI 和同步端口,并在同步系统之外保留一套真正可恢复的备份。
