DIY NAS系列24 — 数据同步与备份管理之 Syncthing

Syncthing 简介

在当今的数字化时代,我们的生活和工作中充满了各种文件,如文档、照片、音乐和电影。这些文件需要在多台设备之间进行同步和存储,以便我们随时随地地访问和使用。然而,随着国内各大网盘服务的衰落或限速,找到一个可靠的文件同步和存储解决方案变得越来越困难。市场上有很多自建网盘和云存储服务的软件,如 Seafile、NextCloud、ownCloud 和 Resilio Sync(原 BT Sync)。然而,Syncthing 以其独特的优点脱颖而出,受到了许多专业人士的推荐,被誉为 Resilio Sync 和 Dropbox 的最佳开源替代品。

Syncthing 的最大特点是它采用了与 Resilio Sync 类似的 P2P 分布式技术,这使得多台设备可以在没有中心服务器的情况下实时同步文件。这种设计不仅提供了高效的文件同步能力,还增强了数据的隐私保护。Syncthing 支持多种操作系统,包括: Linux、Windows、OS X、FreeBSD 和 Solaris,同时还有第三方的 iOS 和 Android 应用。此外,Syncthing 的轻量级设计也非常吸引人。无论在 Linux 还是 Windows 系统上,Syncthing 只需要一个可执行文件,就可以提供完整的文件同步服务。对于希望在桌面环境中使用 Syncthing 的用户,还有一个 GUI 桌面程序可供选择。

Syncthing 的特点:

  1. 私有性:由于 Syncthing 不使用中心服务器,您的文件只在您自己的设备之间同步,不会存储在任何第三方的服务器上。这提供了极高的隐私保护。
  2. 安全性:Syncthing 使用 TLS 和完全的端到端加密来保护您的数据。只有您的设备才能读取您的文件,其他人即使拦截了您的数据也无法解密。
  3. 实时同步:Syncthing 可以实时监控文件的更改,并立即同步到其他设备。这使得您可以立即在所有设备上看到您的更改。
  4. 跨平台:Syncthing 支持所有主要的操作系统,包括 Windows、macOS、Linux 和 Android。无论您使用哪种设备,都可以使用 Syncthing。

总之 Syncthing 是一个强大的文件同步工具,它提供了高度的私有性和安全性,并且可以在几乎所有的设备上运行。无论您是需要在家庭网络中同步文件,还是在远程服务器之间备份数据,Syncthing 都是一个值得考虑的选择。

部署 Syncthing

特别说明
因为 Syncthing 是采用的P2P模式,所以它并没有真正意义上的服务器端(都是客户端),所以文档中后续的服务器端(NAS) == 客户端(NAS),macOS 客户端 == 客户端(muzi-macOS)

说明: 基于前期构建的 traefik 网关,详见:  DIY NAS系列12 — Traefik 出口网关配置
在 docker-compose.yaml 文件中,会对重要的配置进行说明,因个人网络环境等不同,需要根据自身实际情况调整配置。

[root@demo ~]# cat > docker-compose.yml << \EOF
version: "3"
services:
  syncthing:
    image: linuxserver/syncthing:1.28.0
    container_name: syncthing
    hostname: syncthing
    environment:
      - PUID=0
      - PGID=0
      - TZ=Asia/Shanghai
    volumes:
      - /SSD/Demo/Syncthing/config:/config
      - /SSD/Backup:/data # 备份文件存放目录
    ports:
      - 8384:8384
      - 22000:22000/tcp # 除了开启对应WEB服务端口至公网外,还需要开启这三个端口。
      - 22000:22000/udp
      - 21027:21027/udp
    restart: unless-stopped
    networks:
      - traefik_net
    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=traefik_net"
      - "traefik.http.routers.syncthing.rule=Host(`sync.rockylinux.cn`)"
      - "traefik.http.routers.syncthing.entryPoints=websecure"
      - "traefik.http.routers.syncthing.tls.certresolver=myresolver"
      - "traefik.http.routers.syncthing.service=syncthing"
      - "traefik.http.services.syncthing.loadbalancer.server.port=8384"
networks:
  traefik_net:
    external: true
EOF

# 启动服务 
[root@demo ~]# docker-compose up -d

配置 Syncthing 服务器端

这里说一下重点配置,打开 https://sync.rockylinux.cn

设置登录密码

点击操作 — 设置 — 图形用户界面,设置登录账号及密码,保障基础安全。实际上 Syncthing 还支持 LDAP 认证,这个在企业中使用会很方便。

开启 NAT 穿透

在 Syncthing 中 NAT 穿透功能允许设备即使在私有网络后面也能建立直接的连接。这意味着,即使您的设备位于防火墙或路由器之后,它们仍然可以直接与其他设备同步数据,而无需通过中间服务器。这可以提高同步的速度和效率,同时还能提高数据的隐私性,因为您的数据不需要经过任何第三方服务器。需要注意的是,并非所有的网络环境和设备都支持 NAT 穿透,比如一些企业级的防火墙,在这种情况下,您可能需要在路由器上进行一些配置,以使 NAT 穿透能够正常工作。

配置公网连接地址

参考文档: Syncthing Configuration — Syncthing v1.23.4 documentation

在这是设置对应连接地址及端口,注意端口需要在个人防火墙或路由器上开启。协议监听地址配置可以是 tcp://sync.rockylinux.cn:22000,default,这里详细说一下,配置设备地址的语法:

  • tcp://sync.rockylinux.cn:22000: 这部分表示 Syncthing 通过 TCP 协议连接到指定的服务器的 22000 端口。
  • ,: 这是一个分隔符,用于分隔多个地址。
  • default: 默认就是 tcp://0.0.0.0:22000 quic://0.0.0.0:22000 dynamic+https://relays.syncthing.net/endpoint
  • dynamic: 这是一个特殊的关键字,它让 Syncthing 内置的发现服务器来查找和连接到其他设备。这对于设备的 IP 地址经常变动或者设备位于 NAT(网络地址转换)之后的情况非常有用。

因此 tcp://sync.rockylinux.cn:22000,default 这样的设置意味着 Syncthing 将尝试直接连接到 sync.rockylinux.cn 的 22000 端口,并且还会使用动态发现来寻找其他设备。

木子更建议在客户端直接设置对应服务器端地址,点击操作–高级–设备–远端设备 NAS: tcp://sync.rockylinux.cn:22000,dynamic

macOS 配置客户端

macOS 客户端下载: Releases · syncthing/syncthing-macos

Syncthing 的客户端有很多,我们可以根据自己的需求下载。这里以 macOS 客户端为例。macOS 安装后打开,在状态栏会出现一个图标,点击 Open,会打开对应本地 Web 页面,和服务器端页面一样,然后再根据自己需求配置对应客户端即可。

添加远程设备

从服务器端(NAS)获取设备 ID,点击操作 — 显示 ID 。

复制对应设置 ID 号,设备 ID 号格式: XXXXXXX-XXXXXXX-XXXXXXX-XXXXXXX-XXXXXXX-XXXXXXX-XXXXXXX-XXXXXXX,服务器和本地的客户端都有各自的设备 ID 用于访问,这本质上就是一个公钥,用于双方身份验证的。

来到客户端(muzi-macOS)这边,点击【添加远程设备】

粘贴对应设备 ID 号,并设置设备名称。

这时候服务器端(NAS)会提示请求连接,点击【添加设备】,就可以将对应客户端(muzi-macOS)授权至服务器端(NAS)远程设备列表。

添加同步文件夹

客户端(muzi-macOS)设置

客户端(muzi-macOS)点击【添加文件夹】,设置同步文件夹,木子这里设置的是 Documents 文件夹。

客户端(muzi-macOS)设置允许哪些远程设备可以同步共享文件夹 Documents。这里是基于文件夹级别对于远程设备客户端(NAS)的授权。

共享文件夹级别的授权:

1、设置允许客户端(NAS)同步共享文件夹(勾选即可)。
2、设置加密密码,当设置加密密码后,客户端(NAS)存放的数据将以加密形式存储,非明文存储,格式为:0.syncthing-enc ......A.syncthing-enc .......,且客户端(NAS)只能够以加密方式接收数据。

【高级】选项设置文件夹类型为仅发送,勾选监视更改,点击【保存】即可。

然后再在客户端(muzi-macOS)上设置授权哪台远程设备同步哪个共享文件夹。这时候我们在远程设备客户端(NAS)【选项】中设置将客户端(muzi-macOS)上共享的文件夹 Documents 授权给客户端(NAS),允许客户端(NAS)进行同步。这时我们需要去到客户端(NAS)授权接收客户端(muzi-macOS)的共享文件夹 Documents 同步。

客户端(NAS)设置

点击【添加】按钮,表示接受客户端(muzi-macOS)共享文件夹 Documents 同步至本地(NAS)。

在弹出的对话框【常规】选项中设置备份数据存放的位置,这里的文件夹路径就是我们在 Syncthing 服务器端(NAS) docker-compose.yaml 中设置的数据备份目录。默认会存放在 /config/jzqai-zuafw 目录下,所以我们一定要手动修改为 /data。此图为设置好后截图,所以文件夹路径为灰色不可编辑状态,正常初次设置是可编辑状态。

客户端(NAS)不能够单独设置加密密码,必须在客户端(muzi-macOS)上设置加密密码,然后再在客户端(NAS)设置相同的加密密码。

【高级】选项设置文件夹类型为仅接收,勾选监视更改,点击【保存】即可。

至此两个节点之间就开始进行数据同步了。

同步模式

Syncthing 的同步方式具有很强的灵活性,既可以设置为双向同步,也可以设置为单向同步,用户可根据实际需要进行调整。

Syncthing 提供了以下四种数据同步模式:

  • 仅发送 (Send Only):此模式下的设备只会发送数据,而不接收任何来自连接设备的更改。这非常适合作为数据的主要源头,例如,如果您有一个包含所有重要文件的服务器,您可能希望将其设置为“仅发送”模式,以防止其他设备上的更改影响服务器上的数据。
  • 仅接收 (Receive Only):与“仅发送”模式相反,此模式下的设备只接收数据,而不发送任何更改。这可以用于备份或存档目的,例如,如果您有一个备份服务器,您可能希望将其设置为“仅接收”模式,以便它可以接收所有其他设备的更改,但不会将其自身的更改发送回去。
  • 发送与接收 (Send & Receive):这是默认的同步模式。在此模式下,设备既可以发送也可以接收更改。这适用于大多数常见的使用场景,例如,在多台设备之间同步文件。
  • 加密接收 (Encrypted Receive):在此模式下,设备只接收并存储加密的数据。这对于在不信任的、可能遭到攻击的设备上存储数据非常有用。例如,如果您在公共云服务上存储备份,您可能希望使用加密接收模式,以确保即使数据被第三方获取,他们也无法阅读它。

所以您可以针对每个单独的共享文件夹设置不同的数据同步模式,以便更好地控制数据流。

例如:如果我们想要客户端(NAS)仅作为接收端,只接受客户端上传的文件,而客户端(muzi-macOS)仅做为发送端,将指定文件夹同步至客户端(NAS),那么可以按照以下步骤进行设置。

客户端(muzi-macOS)设置仅发送

客户端(NAS)设置仅接收

这里的接收方式有两种: 仅接收加密接收。两者的区别在于如果客户端(muzi-macOS)设置了加密密码,那么客户端(NAS)就必须以加密方式接收,仅接收方式不可选为灰色。当客户端(muzi-macOS)未设置加密密码,那么客户端(NAS)接收方式只能选择仅接收,加密接收不可选为灰色。

忽略模式

忽略模式有两种设置方法:

  • 设置共享文件夹时设置忽略哪些文件。在客户端(muzi-macOS)设置共享文件夹时设置。
  • 接受共享文件夹时设置增强忽略模式。在客户端(NAS)在接受共享文件夹时设置。

木子这里设置忽略的一些文件如下:

.DS_Store
.AppleDouble
.LSOverride
.trash
.UTSystemConfig
.localized
.spacedrive

本质这是编辑文件:~/Documents/.stignore

状态说明

在 Syncthing 同步软件中,全局状态和本地状态是两个重要指标,分别表示以下含义:

  • 全局状态(Global State): 这是 Syncthing 网络中所有设备共享的文件和目录的总数、大小和版本。简单地说,它表示了 Syncthing 网络中所有设备上存在的所有文件的最新版本的总和(下图针对的是 Documents 共享文件夹)。
  • 本地状态(Local State): 这是您的设备上的文件和目录的总数、大小和版本。它表示了您的设备上存在的所有文件的总和。

所以,他们之间的区别在于全局状态是所有同步设备的状态总和,而本地状态则只是指您的设备上的状态。

常用操作说明

查看最近同步记录: 两台 Syncthing 之间数据同步记录,可以点击【最近更改】查看。
手动立即同步: 点击暂停,然后再点击恢复。

其它客户端

Android 客户端下载: Releases · syncthing/syncthing-android
Windows 客户端下载: Releases · syncthing/syncthing

常见问题

数据同步异常

服务器端(NAS)同步报错如下:

2024-04-26 17:18:20: Error on folder "Documents" (jzqai-zuafw): folder marker missing (this indicates potential data loss, search docs/forum to get information about how to proceed)

这种情况一般是因为服务器端(NAS)Synthing 数据库中存放的数据同步元数据与客户端存放的数据同步元数据不一致,造成 Synthing 暂停数据同步。

解决方法:

方法一:在客户端(muzi-macOS)或客户端(NAS)尝试暂停同步,再启用同步,看是否恢复正常。如果无法恢复,再尝试取消同步,再设置共享文件夹同步,看是否可以恢复同步。如果这两种操作都无法恢复同步,可以采用方法二,理论上 100% 可以恢复正常同步。

方法二:删除客户端(NAS)上 Syncthing 中的数据同步元数据,然后重启 Syncthing 服务,恢复正常同步。

# 元数据存放在配置文件目录的 index xx 文件夹中,您的文件夹名称可能不同。
# 删除元数据。
rm -rf /config/index-v0.14.0.db/*

# 重启 Syncthing 服务
docker-compose restart

参考文献

[1] Syncthing 官网
[2] GitHub – syncthing/syncthing

后述

总结起来,Syncthing 是一个强大而灵活的同步工具,它还包含许多高级特性等待我们去发掘和利用,例如中继服务器功能可以帮助我们在复杂的网络环境中实现设备之间的连接,文件版本控制功能可以让我们追踪文件的历史变更并能恢复到任意的旧版本。Syncthing 的可能性远不止于此,这只是冰山一角。它的真正力量在于我们如何去应用它,以满足我们自己独特的需求和场景。

变更记录

  • 2024-04-09
    • 梳理文档逻辑,优化文档结构
    • 新增【状态说明】
    • 新增【其它客户端】
  • 2024-04-26
    • 重新梳理文档逻辑,优化文档结构
    • 新增【同步模式】
    • 新增【忽略模式】
    • 新增【常见问题】
    • 升级 Syncthing 版本至 v1.27.6
    • 补充加密数据格式说明等
  • 2024-11-11
    • 新增忽略文件,移除 .git 类型
    • 升级 Syncthing 版本至 v1.28.0,升级 Alpine 版本至 3.20,修正了 macOS 上的一些 bug
Avatar photo

关于 木子

Founder of the Rocky Linux Chinese community, MVP、VMware vExpert、TVP, advocate for cloud native technologies, with over ten years of experience in site reliability engineering (SRE) and the DevOps field. Passionate about Cloud Computing、Microservices、CI&CD、DevOps、Kubernetes, currently dedicated to promoting and implementing Rocky Linux in Chinese-speaking regions.
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇