menu E4b9a6's blog
rss_feed
E4b9a6's blog
有善始者实繁,能克终者盖寡。

文件同步神器Syncthing使用指南

作者:E4b9a6, 创建:2020-10-25, 字数:5804, 已阅:331, 最后更新:2020-10-25

这篇文章更新于 1488 天前,文中部分信息可能失效,请自行甄别无效内容。

1. 介绍

Syncthing是一个开源的文件同步工具,用于在多个设备之间同步和共享文件和文件夹,它可以在不同的操作系统上运行,包括Windows、MacOS、Linux和Android

官方网站:https://syncthing.net/

Syncthing不依赖于中转服务器,即不需要使用任何服务器也可以完成文件同步,使用Syncthing可以让两台处于完全不同网络的PC完成文件同步

虽不依赖中转,但为了实现文件同步,还是需要有一个全球发现服务器来完成所有设备登记的

由于文件同步是点对点的,所以syncthing是非常安全的文件同步技术,除此之外还有以下优点

  1. 去中心化:没有中心服务器,设备直接连接并同步数据
  2. 自动同步:一旦文件发生变化,Syncthing会自动检测并同步到其他设备
  3. 跨平台支持:可以在不同的操作系统上运行并同步数据

以下实践基于Ubuntu2204 LTS,其他发行版大同小异

2. 使用

syncthing客户端安装非常简单,我们从官网下载页面下载合适的安装包

假设我们将syncthing存放到/apps/syncthing

Bash
wget https://github.com/syncthing/syncthing/releases/download/v1.23.6/syncthing-linux-amd64-v1.23.6.tar.gz
tar -zxvf syncthing-linux-amd64-v1.23.6.tar.gz

运行程序后,在当前目录下会产生一个.config文件夹,里面是syncthing的自签证书、配置文件等,保管好这个文件夹即可迁移syncthing

进入解压后的目录,运行程序

Bash
# HOME目录的路径会决定
export HOME="/apps/syncthing/syncthing-linux-amd64-v1.23.6"
./syncthing

访问http://localhost:8384,既可管理配置syncthing

编辑/etc/supervisor/conf.d/syncthing.conf,将其写成supervisor的daemon服务

TEXT
[program:syncthing]
# 根据你的路径自定,注意.config
directory=apps/syncthing/syncthing-linux-amd64-v1.23.0
command=/apps/syncthing/syncthing-linux-amd64-v1.23.0/syncthing
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/%(program_name)s.log
stderr_logfile=/var/log/supervisor/%(program_name)s.log
stdout_logfile_maxbytes=10MB
stdout_capture_maxbytes=1MB
user=app
environment=HOME="/apps/syncthing/syncthing-linux-amd64-v1.23.0"

3. 自建服务器同步

3.1. 中心服务器

中心服务器只提供给双方设备的连接地址,普通的内网也可以使用,速度快,不依赖于服务端的性能,让设备直接互连

根据服务端系统选择软件版本下载 discosrv-server

下载完成之后,解压下载的tar.gz文件夹,并需要注意在防火墙开放844319200端口

Bash
sudo firewall-cmd --add-port=8443/tcp --zone=public --permanent
sudo firewall-cmd --add-port=19200/tcp --zone=public --permanent

运行服务端程序,参数请根据需要自行添加

Bash
./stdiscosrv -debug -listen ":8443" -replication-listen ":19200" -db-dir "./discovery.db" -cert "./certpem"

编辑/etc/supervisor/conf.d/syncthing-stdiscosrv.conf,将其写成supervisor的daemon服务

TEXT
[program:syncthing-stdiscosrv]
# 根据你的路径自定,注意.config
directory=apps/syncthing-stdiscosrv
command=/apps/syncthing-stdiscosrv/./stdiscosrv -debug -listen ":8443" -replication-listen ":19200" -db-dir "./discovery.db" -cert "./certpem"
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/%(program_name)s.log
stderr_logfile=/var/log/supervisor/%(program_name)s.log
stdout_logfile_maxbytes=10MB
stdout_capture_maxbytes=1MB
user=app

3.2. 中继服务器

中心服务器只负责发现设备,提供设备的地址,但不保障设备之间一定能够互连,所以当设备无法互联时,往往就需要一个中转服务器

也可以给syncthing客户端添加代理,用于互连,可参考 Syncthing - 通过配置全局环境变量来实现代理功能

中继服务器可以代为中转文件,所以消耗带宽是难免的,如设备无法直连的话,则同步速度取决于中继服务器的网络瓶颈

根据服务端系统选择软件版本下载 relay-server

下载完成之后,解压下载的tar.gz文件夹,并在防火墙开放22067220702个端口

TEXT
sudo firewall-cmd --add-port=22067/tcp --zone=public --permanent
sudo firewall-cmd --add-port=22070/tcp --zone=public --permanent

接着运行运行服务端程序,pools参数表示不加入全球公共池

Bash
./relaysrv -pools ""

全球公共池列表:https://relays.syncthing.net/ , 如果不设置pools参数则会出现在这个列表中,全球的所有syncthing客户端在无法直连的时候都会通过你的服务器来中转文件,请注意这会消耗非常大的流量

如果服务器有多余的带宽资源,可以考虑开放给所有syncthing用户帮助他们改善软件体验!

下面是relaysrv的运行参数参考

Bash
使用 ./strelaysrv 的参数说明:
  -debug
        启用调试输出
  -ext-address string
        可选的广告地址                允许在非特权端口上监听,并通过端口转发(如443)进行连接  -global-rate int
        全局速率限制,以字节/秒为单位
  -keys string
        存储 cert.pem 和 key.pem 的目录(默认为当前目录)
  -listen string
        协议监听地址(默认为 ":22067")
  -message-timeout duration
        等待相关消息到达的最长时间(默认为 1m0s)
  -nat
        使用 UPnP/NAT-PMP 获取外部端口映射
  -nat-lease int
        NAT 租约长度(以分钟为单位)(默认为 60)
  -nat-renewal int
        NAT 更新频率(以分钟为单位)(默认为 30)
  -nat-timeout int
        NAT 发现超时时间(以秒为单位)(默认为 10)
  -network-buffer int
        网络缓冲区大小(每个代理连接两个)(默认为 65536)
  -network-timeout duration
        客户端和中继之间网络操作的超时时间                如果在此时间段内未收到客户端和中继之间的数据,则终止连接                此外,如果在此时间段内未发送任何数据,则终止中继的两个客户端之间的会话,(默认为 2m0s)
  -per-session-rate int
        每个会话的速率限制,以字节/秒为单位
  -ping-interval duration
        发送 ping 的频率(默认为 1m0s)
  -pools string
        要加入的中继池地址的逗号分隔列表(默认为 "https://relays.syncthing.net/endpoint")
  -pprof
        在状态服务器上启用内置的性能分析
  -protocol string
        用于监听的协议,'tcp' 表示 IPv4 和 IPv6,'tcp4' 表示 IPv4,'tcp6' 表示 IPv6(默认为 "tcp")
  -provided-by string
        关于提供中继的可选描述
  -status-srv string
        状态服务的监听地址(留空以禁用)(默认为 ":22070")
  -token string
        限制对中继的访问的令牌(可选),禁用加入任何中继池  -version
        显示版本信息

编辑/etc/supervisor/conf.d/syncthing-relaysrv.conf,将其写成supervisor的daemon服务

TEXT
[program:syncthing-relaysrv]
# 根据你的路径自定,注意.config
directory=apps/syncthing-relaysrv
command=/apps/syncthing-relaysrv/relaysrv -debug -pools "" -listen ":22067" -keys "" -message-timeout "1m0s"  -network-timeout "2m0s" -ping-interval "1m0s" -protocol "tcp4" -provided-by "TYFS" -status-srv ":22070"
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/%(program_name)s.log
stderr_logfile=/var/log/supervisor/%(program_name)s.log
stdout_logfile_maxbytes=10MB
stdout_capture_maxbytes=1MB
user=app

运行成功之后会有类似如下输出,请复制这个地址,将0.0.0.0换成服务器对应的ip

Bash
relay://0.0.0.0:22067/?id=4ZVSHHI-ZSJID5Y-CKSUQAV-6KATUHA-HJN6WMQ-TU2KEUJ-H5RYSNN-NREXNA7

打开syncthing客户端,依次打开右上角的Actions-Connections,在Sync Protocol Listen Addresses中填入刚才复制的地址保存即可

Sync Protocol Listen Addresses的值如下

TEXT
default, relay://[your_server_ip]:22067/?id=4ZVSHHI-ZSJID5Y-CKSUQAV-6KATUHA-HJN6WMQ-TU2KEUJ-H5RYSNN-NREXNA7

将这一串复制到syncthing客户端的配置中的即可启用该中继服务器

4. 参考资料

官方文档

  1. relay-server 官方文档链接
  2. discovery-server 官方文档链接
  3. relay-server 下载地址

[[replyMessage== null?"发表评论":"发表评论 @ " + replyMessage.m_author]]

account_circle
email
web_asset
textsms

评论列表([[messageResponse.total]])

还没有可以显示的留言...
gravatar
[[messageItem.m_author]] [[messageItem.m_author]]
[[messageItem.create_time]]
[[getEnviron(messageItem.m_environ)]]
[[subMessage.m_author]] [[subMessage.m_author]] @ [[subMessage.parent_message.m_author]] [[subMessage.parent_message.m_author]]
[[subMessage.create_time]]
[[getEnviron(messageItem.m_environ)]]