Syncthing 实现多设备文件同步与备份
Syncthing 实现多设备文件同步与备份
什么是 Syncthing
Syncthing 是一个开源的、去中心化的持续文件同步程序,能够在两台或多台设备之间实时同步文件。它具备以下核心特性:
- 去中心化:没有中央服务器,数据仅存储在你自己的设备上
- 端到端加密:所有通信使用 TLS 加密,支持完美前向保密
- 强认证:每个设备通过加密证书进行唯一标识
- 开放协议:同步协议完全公开文档化
- 跨平台:支持 Windows、macOS、Linux、FreeBSD、Android 等
官网:https://syncthing.net/ GitHub:https://github.com/syncthing/syncthing 文档:https://docs.syncthing.net/
典型应用场景
| 场景 | 说明 |
|---|---|
| 多设备文件同步 | 桌面、笔记本、服务器之间保持文件一致 |
| 离线可用备份 | 无需云存储服务,本地设备间即可完成备份 |
| 照片自动备份 | Android 手机拍照后自动同步到 PC/NAS |
| 文档协作 | 多人共享文件夹,实时同步修改 |
| 服务器配置备份 | 将服务器关键配置目录同步到远程备份机 |
安装部署
Linux(Debian/Ubuntu)
通过官方 APT 仓库安装,获取最新稳定版:
# 添加 Syncthing 发布密钥
sudo mkdir -p /etc/apt/keyrings
sudo curl -L -o /etc/apt/keyrings/syncthing-archive-keyring.gpg https://syncthing.net/release-key.gpg
# 添加稳定版仓库
echo "deb [signed-by=/etc/apt/keyrings/syncthing-archive-keyring.gpg] https://apt.syncthing.net/ syncthing stable" | sudo tee /etc/apt/sources.list.d/syncthing.list
# 安装
sudo apt-get update
sudo apt-get install syncthingLinux(RHEL/CentOS/Rocky)
官方未提供 RPM 仓库,使用 GitHub Release 手动安装:
# 下载最新版本(替换版本号)
SYNCTHING_VERSION="v1.27.0"
curl -L "https://github.com/syncthing/syncthing/releases/download/${SYNCTHING_VERSION}/syncthing-linux-amd64-${SYNCTHING_VERSION}.tar.gz" -o syncthing.tar.gz
# 解压并安装
tar xzf syncthing.tar.gz
sudo cp syncthing-linux-amd64-*/syncthing /usr/local/bin/
sudo chmod +x /usr/local/bin/syncthing
# 验证
syncthing --versionDocker 部署
推荐使用 Docker 方式部署,便于管理和迁移:
# docker-compose.yml
version: "3"
services:
syncthing:
image: syncthing/syncthing
container_name: syncthing
hostname: my-syncthing
environment:
- PUID=1000
- PGID=1000
volumes:
- ./syncthing-config:/var/syncthing/config
- /path/to/data:/var/syncthing/data
ports:
- "8384:8384" # Web GUI
- "22000:22000/tcp" # TCP 文件传输
- "22000:22000/udp" # QUIC 文件传输
- "21027:21027/udp" # 本地发现
restart: unless-stopped启动服务:
docker compose up -dWindows
- 从 GitHub Releases 下载
syncthing-windows-amd64-*.zip - 解压到固定目录,如
C:\syncthing\ - 双击
syncthing.exe运行,浏览器会自动打开 Web GUI
设置开机自启(使用任务计划程序):
- 打开任务计划程序(
taskschd.msc) - 创建任务 → 名称填
Syncthing - 触发器 → 新建 → 登录时
- 操作 → 新建 → 程序填
C:\syncthing\syncthing.exe,参数填--no-console --no-browser - 设置 → 取消勾选「如果任务运行超过以下时间,停止任务」
配置 systemd 服务(Linux)
系统级服务
适用于服务器环境,开机即启动,无需用户登录:
# 启用并启动服务(替换 myuser 为实际用户名)
sudo systemctl enable syncthing@myuser.service
sudo systemctl start syncthing@myuser.service
# 查看状态
sudo systemctl status syncthing@myuser.service
# 查看日志
journalctl -e -u syncthing@myuser.service用户级服务
适用于桌面环境,用户登录后才启动:
# 启用并启动
systemctl --user enable syncthing.service
systemctl --user start syncthing.service
# 查看状态
systemctl --user status syncthing.service如果需要开机自启而不是登录后才启动:
sudo loginctl enable-linger myuser基本使用
访问 Web GUI
启动 Syncthing 后,默认在 http://127.0.0.1:8384 提供 Web 管理界面。
首次使用建议立即设置 GUI 密码:操作 → 设置 → GUI → 用户名和密码
获取设备 ID
每个 Syncthing 实例都有一个唯一的设备 ID(基于加密证书生成)。
查看方式:
- Web GUI → 操作 → 显示 ID
- 命令行:
syncthing --device-id
设备 ID 格式示例:6FOKXKK-SKUBWFW-GSKX6IQ-ZC4SYUZ-5IEVZKE-TC42AAX-HW7IBW4-GAZFAQ7
添加远程设备
在两台设备上互相添加对方的设备 ID:
- Web GUI → 右下角「添加远程设备」
- 输入对方的设备 ID
- 可选:填写设备名称(方便辨认)
- 点击保存
两端都需要操作。连接是双向认证的,只有双方都添加了彼此才能建立连接。
共享文件夹
- Web GUI → 左侧「添加文件夹」
- 填写文件夹标签和本地路径
- 在「共享」选项卡中勾选要共享给的设备
- 点击保存
文件夹类型与备份策略
Syncthing 提供三种文件夹同步类型,根据不同的备份需求选择:
发送与接收(Send & Receive)
默认模式,两端双向同步。适合多设备协作场景。
仅发送(Send Only)
本设备作为「主副本」,只向外推送变更,忽略远端的修改。
适用场景:
- 源代码主机 → 备份机的单向推送
- 生产服务器 → 备份服务器
如果远端产生了意外修改,可以点击「覆盖变更」按钮强制以本端为准。
仅接收(Receive Only)
本设备只接收来自集群的变更,本地修改不会同步出去。
适用场景:
- 备份目的地(NAS、备份服务器)
- 镜像副本
如果本地意外修改了文件,可以点击「恢复本地变更」按钮回退到集群版本。
备份推荐组合:源设备设为
Send Only+ 备份设备设为Receive Only
文件版本控制
Syncthing 支持对被替换或删除的旧文件进行归档,防止误操作导致数据丢失。版本文件默认存储在共享文件夹内的 .stversions 目录中。
回收站模式(Trash Can)
最简单的策略,被替换或删除的文件移入 .stversions,相当于回收站。
cleanoutDays:自动清理超过指定天数的旧文件,设为 0 则永不清理
简单模式(Simple)
在回收站的基础上,保留文件的多个历史版本。
keep:每个文件保留的版本数(如设为 5,则保留最近 5 个版本)cleanoutDays:清理超龄文件
阶梯模式(Staggered)
按时间间隔递减保留版本,适合长期归档:
| 时间范围 | 保留密度 |
|---|---|
| 最近 1 小时 | 每 30 秒间隔保留 1 个版本 |
| 最近 1 天 | 每小时保留 1 个版本 |
| 最近 30 天 | 每天保留 1 个版本 |
| 超过 30 天 | 每周保留 1 个版本 |
maxAge:最大保留天数,设为 0 则永久保留
外部命令模式(External)
调用外部脚本处理版本归档,灵活度最高。可以对接自定义备份系统。
实战:服务器配置文件备份
以下以 Docker Compose 部署为例,实现服务器配置目录到远程备份机的单向同步。
架构
[生产服务器 A] [备份服务器 B]
Send Only ── Syncthing ──> Receive Only
/etc/nginx/ /backup/server-a/nginx/
/opt/app/config/ /backup/server-a/app-config/生产服务器 A 配置
# docker-compose.yml
version: "3"
services:
syncthing:
image: syncthing/syncthing
container_name: syncthing
volumes:
- ./syncthing-config:/var/syncthing/config
- /etc/nginx:/var/syncthing/data/nginx:ro
- /opt/app/config:/var/syncthing/data/app-config:ro
ports:
- "8384:8384"
- "22000:22000/tcp"
- "22000:22000/udp"
- "21027:21027/udp"
restart: unless-stopped注意
:ro(只读)挂载,防止 Syncthing 容器意外修改源文件。
在 Web GUI 中:
- 将 nginx 和 app-config 文件夹类型设为
Send Only - 添加备份服务器 B 的设备 ID
- 共享文件夹给 B
备份服务器 B 配置
# docker-compose.yml
version: "3"
services:
syncthing:
image: syncthing/syncthing
container_name: syncthing
volumes:
- ./syncthing-config:/var/syncthing/config
- /backup/server-a:/var/syncthing/data
ports:
- "8384:8384"
- "22000:22000/tcp"
- "22000:22000/udp"
- "21027:21027/udp"
restart: unless-stopped在 Web GUI 中:
- 接受来自 A 的共享文件夹
- 设置文件夹类型为
Receive Only - 开启文件版本控制(推荐阶梯模式,
maxAge设为 365 天)
防火墙配置
Syncthing 需要以下端口:
| 端口 | 协议 | 用途 |
|---|---|---|
| 8384 | TCP | Web GUI(仅本地) |
| 22000 | TCP/UDP | 设备间文件同步 |
| 21027 | UDP | 本地发现广播 |
# firewalld
sudo firewall-cmd --permanent --add-port=22000/tcp
sudo firewall-cmd --permanent --add-port=22000/udp
sudo firewall-cmd --permanent --add-port=21027/udp
sudo firewall-cmd --reload
# iptables
sudo iptables -A INPUT -p tcp --dport 22000 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 22000 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 21027 -j ACCEPTWeb GUI 端口 8384 不建议暴露到公网。如需远程访问,使用 SSH 隧道或反向代理。
安全建议
- 设置 GUI 密码:首次启动后立即在设置中配置用户名和密码
- 启用 HTTPS:设置 → GUI → 勾选「使用 HTTPS」
- 不暴露 8384 端口:Web GUI 仅监听 127.0.0.1,远程管理通过 SSH 隧道
- 定期检查连接设备:确保没有未知设备接入
- 使用 Receive Only 模式:备份目标设备应禁止反向同步
与其他备份方案对比
| 特性 | Syncthing | rsync | Rclone | 云存储 |
|---|---|---|---|---|
| 实时同步 | ✅ | ❌(需定时触发) | ❌ | ✅(取决于客户端) |
| 去中心化 | ✅ | ✅ | ❌ | ❌ |
| 端到端加密 | ✅ | ❌(需 SSH) | ✅ | 取决于服务商 |
| 版本控制 | ✅ | ❌ | ❌ | 部分支持 |
| 跨平台 GUI | ✅ | ❌ | ❌ | ✅ |
| 资源占用 | 低-中 | 极低 | 低 | 取决于客户端 |
| 适合场景 | 多设备持续同步 | 定时单向备份 | 云端备份 | 通用 |
常见问题
设备无法互相发现
- 确认两端都开放了 22000/tcp、22000/udp、21027/udp 端口
- 如在 NAT 后面,Syncthing 会尝试使用中继服务器,但速度较慢
- 可手动指定对方的地址:设备设置 → 地址 → 填写
tcp://IP:22000
同步速度慢
- 检查是否通过中继传输(Web GUI 中连接类型会显示
relay) - 优先使用直连:确保端口转发或 UPnP 正常工作
- Docker 部署时使用
--network=host可改善本地发现
文件冲突
当同一文件在多个设备上同时修改时,Syncthing 会保留两个版本,冲突文件以 .sync-conflict-<date>-<time> 命名。手动检查并合并后删除冲突文件即可。
参考资料
- Syncthing 官网:https://syncthing.net/
- Syncthing 文档:https://docs.syncthing.net/
- GitHub 仓库:https://github.com/syncthing/syncthing
- 社区论坛:https://forum.syncthing.net/
更新日志
66d58-于4a535-于