论多设备同步文件,它说第二,没人敢说第一:Syncthing 使用笔记

本贴最后更新于 1429 天前,其中的信息可能已经时移世改

Syncthing 介绍

Syncthing 是一个多设备文件同步工具,具有以下特性:

  • 开源免费,跨平台(Windwos、macOS、Android、Linux、FreeBSD、Solaris、NAS,你甚至可以在一些路由器上运行它)
  • 设备间 TLS 加密传输数据,P2P 点对点直连,去中心化,没有隐私泄漏风险
  • 类似于 torrent 协议,参与同步的设备越多,同步的速度越快
  • 通过图形化页面控制,操作简单
  • 文件版本控制,神奇的后悔药
  • 单向同步

相关链接:官方文档 官方论坛 官方疑难解答

客户端

Syncthing 本身是一个命令行程序,直接从 Syncthing releases 下载对应系统的版本解压打开即可运行,然后你就可以浏览器访问 127.0.0.1:8384 进入 Syncthing 的控制面板。

但为了方便用户使用,有其他开发者做了相应系统的 GUI 程序:

下图是 Windows 上在 Synctrazor 中打开 Syncthing 的控制台(其实在浏览器中打开 127.0.0.1:8384 也是一样的界面):

image.png

上手使用视频教程

对安卓同步的重要提醒

在安卓上设置同步时,一定要在高级设置中将 忽略权限 打上勾。因为安卓多是基于 Fuse 的存储格式,不支持权限设置,所以每次同步到安卓,会返回说权限不一致,导致冲突。(在 Syncthing-Android 上其实是默认打开的)

image.png

Syncthing 发现服务(discosrv

介绍 discosrv

官方文档

在同一局域网下时,你的设备可以互相发现对方。而在不同网络时,因为隔了层层路由,设备间很难相互找到。

Syncthing 可以使设备在不同局域网下也能相互同步,靠的就是发现服务器。只要你的电脑连接到了发现服务器,手机也连上了发现服务器,那么你的手机和电脑就能相互发现对方,进而直接连接,进行同步。

Syncthing 官方提供了全球发现服务器,但是,由于全球发现服务器在国外、互联网防火墙等因素,全球发现服务器可能会速度很慢,或者无法访问。

所以 Syncthing 的发现服务器 discosrv 源码是开源的,你可以自己下载一份,在你自己的服务器上运行,搭建一个发现服务器。

你可以添加多个发现服务器,用英文逗号隔开即可。只要在你的 Syncthing 同步配置中填入你自己的同步服务器地址,就可以使用了:

image.png

语法

stdiscosrv [-cert=<file>] [-db-dir=<string>] [-debug] [-http] [-key=<string>]
           [-listen=<address>] [-metrics-listen=<address>]
           [-replicate=<peers>] [-replication-listen=<address>]

Syncthing 依赖 发现服务 来找到同伴,任何人都可搭建发现服务器。Syncthing 项目也提供公共节点。

选项

  • -cert=<file>
  • -db-dir=<string>
  • -debug
  • -http
  • -key=<file>
  • -listen=<address>
  • -metrics-listen=<address>
  • -replicate=<peers>
  • -replication-listen=<address>

指定 Syncthing 到你的发现服务

使用 default 就是使用默认的通用发现服务。要自定义,进入 web-GUI ,设置,连接,全球发现服务器,填入用逗号分隔的一系列网址。例如 https://disco.example.com:8443/

搭建

描述

下面的教程假设你已经搭建好了 syncthing 。

安装

releases 页面下载合适的安装包。启动它,后,stdiscosrv 会自动生成验证文件和数据库到当前文件夹(除了另有参数时)

wget https://github.com/syncthing/discosrv/releases/download/v1.3.1/stdiscosrv-linux-amd64-v1.3.1.tar.gz
tar -xzvf stdiscosrv-linux-amd64-v1.3.1.tar.gz
mv stdiscosrv-linux-amd64-v1.3.1 syncthing_discover_server
cd syncthing_discover_server

配置

验证

发现服务通过 https 提供服务。为保证,有三个选项:

  • 用于发现服务的域名的 CA-signed certificate pair 。客户端会验证域名和证书。
  • 使用任意 certificate pair 并让客户端基于它的 device ID 验证。这个选项被用于发现服务自动生成的证书。
  • 使用 -http ,如果发现服务已经是在 ssl-secured 反向代理后,可以使用这个。

对于前两个选项,因为是使用 https,所以发现服务器必须给定一个 certificate 和 key 的路径:

$ stdiscosrv -cert=/path/to/cert.pem -key=/path/to/key.pem

在运行后,发现服务会打印它的设备 id :

Server device ID is 7DDRT7J-UICR4PM-PBIZYL3-MZOJ7X7-EX56JP6-IK6HHMW-S7EK32W-G3EUPQA

如果你在使用非 CA 签名的证书,客户端必须在 url 中提供设备 ID ,例如:

https://disco.example.com:8443/?id=7DDRT7J-UICR4PM-PBIZYL3-MZOJ7X7-EX56JP6-IK6HHMW-S7EK32W-G3EUPQA

image.png

Syncthing 中继服务 relysrv

介绍 relysrv

官方文档

Syncthing 可以通过发现服务器,让处在不同网络环境的设备互相发现,再直接连接。但是,有的时候,网络环境复杂,即使两个设备能互相发现,也无法搭建直连通道。这时候,就需要中继服务器来进行数据转发,得以同步。

Syncthing 官方提供了全球中继服务器,但是,由于全球发现服务器在国外、互联网防火墙等因素,全球中继服务器可能会速度很慢,或者无法访问。

所以 Syncthing 的发现服务器 relysrv 源码是开源的,你可以自己下载一份,在你自己的服务器上运行,搭建一个中继服务器。

你可以添加多个中继服务器,用英文逗号隔开即可,default 表示官方默认中继服务器。只要在你的 Syncthing 同步配置中填入你自己的中继服务器地址,就可以使用了:

image.png

语法

strelaysrv [-debug] [-ext-address=<address>] [-global-rate=<bytes/s>] [-keys=<dir>] [-listen=<listen addr>]
           [-message-timeout=<duration>] [-nat] [-nat-lease=<duration> [-nat-renewal=<duration>]
           [-nat-timeout=<duration>] [-network-timeout=<duration>] [-per-session-rate=<bytes/s>]
           [-ping-interval=<duration>] [-pools=<pool addresses>] [-protocol=<string>] [-provided-by=<string>]
           [-status-srv=<listen addr>]

选项

  • -pools=<pool addresses>

    逗号分隔的中继池列表,表示要加入哪些。默认是“http://relays.syncthing.net/endpoint” 留空表示不加入。中继池可以相互连接,组成一个大的中继池

建设

默认使用 22067 端口。

发布地址在 release

wget https://github.com/syncthing/relaysrv/releases/download/v1.3.1/strelaysrv-linux-amd64-v1.3.1.tar.gz
tar -xzvf strelaysrv-linux-amd64-v1.3.1.tar.gz
mv strelaysrv-linux-amd64-v1.3.1 syncthing-relay-server
cd syncthing-relay-server

Linux 设置 discosrv 和 relysrv 自启动

方法一:

chmod +x /etc/rc.d/rc.local
vim /etc/rc.d/rc.local
nohup /root/syncthing-relay-server/strelaysrv -pools="" &
nohup /root/syncthing_discover_server/stdiscosrv &

方法二:

touch /etc/init.d/my_startup_command
chmod a+x /etc/init.d/my_startup_command
vim /etc/init.d/my_startup_command
#!/bin/sh
#chkconfig: 35 20 80
#description: start up command
nohup /root/syncthing-relay-server/strelaysrv -pools="" > /root/syncthing-relay-server/nohup & 
nohup /root/syncthing_discover_server/stdiscosrv > /root/syncthing_discover_server/nohup &
chkconfig --add my_startup_command
chkconfig my_startup_command on
# 检查下:
chkconfig --list | grep my_startup_command
2 操作
HaujetZhao 在 2020-08-19 16:13:54 更新了该帖
HaujetZhao 在 2020-08-19 16:12:49 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • optwei 2 评论

    请问能够转载文章到自己的博客么?

    注名署名转载即可
    HaujetZhao
    @HaujetZhao 好的,多谢 👍
    optwei