搭建syncthing并配置中继/发现服务器-使用docker

706

重要!!!
中继服务器和发现服务器不是必须的,没有服务器的可以直接用default填写,也可以用我的
协议监听地址一定要有default !
协议监听地址一定要有default !
协议监听地址一定要有default !

闲鱼用户看此:

请直接查看 配置中继和发现服务器这一章节来设置电脑和手机的协议地址和全局发现服务器.

介绍

Syncthing是一个开源的点对点文件同步软件。它允许用户在不同设备之间同步文件和文件夹,无需依赖第三方服务器。用户可以轻松地分享文件和文件夹,保持数据的同步和备份,而且在安全性方面也有较高的保障。Syncthing具有简单的界面和易于使用的功能,是一个强大而可靠的文件同步工具。

用途

  1. 同步多台手机数据到Nas
  2. 备份Nas数据到其他位置

目录整理

使用备份工具需要有源和目的地,这个源可以是别的设备,也可以是本地的其他路径.我的unraid已经使用duplicati来进行备份数据和虚拟机数据,所有的数据都被加密放在/unraid/backup_by_duplicati中,这是一个源路径,需要备份到其他位置.
还有一个是从别的设备同步过来的数据,需要创建一个目的地路径来进行接收,命名为/unraid/other_transfer_in.
为了数据安全,建议创建一个用户backup_only,并将上面的两个目录赋予权限.用命令** id backup_only**获得他的PUID,PGID.
不过有的目录已经被使用,重复赋权可能会麻烦,可以直接使用管理员:PUID=0,PGID=0

搭建syncthing

官网获取docker-compose脚本:

---
version: "3"
services:
  syncthing:
    image: syncthing/syncthing
    container_name: syncthing
    hostname: my-syncthing
    environment:
      - PUID=0 #1000为默认用户可能读取不到其他docker目录,设置0为管理员
      - PGID=0
    volumes:
      - /unraid/backup_by_duplicati:/var/syncthing/backup_by_duplicati
	  		 - /unraid/other_transfer_in:/var/syncthing/other_transfer_in
    #ports:
     # - 8384:8384 # Web UI
     # - 22000:22000/tcp # TCP file transfers
     # - 22000:22000/udp # QUIC file transfers
     # - 21027:21027/udp # Receive local discovery broadcasts
	  network_mode: "host"    #主机模式.无需预先映射端口
    restart: unless-stopped

也可以从unraid的应用中搜索安装,配置为特权模式,设置PUID,PGID为0,添加映射路径等等

图标链接:

启动Nas端

访问:8384端口或访问通过frp配置的域名成功打开主页:

有三个提示,分别是未配置密码,未配置密码,不应使用管理员权限运行容器.去设置下密码

配置中继和发现服务器(可选)

有篇文章是我之前搭建时写的,现在一看真的好乱啊哈哈
时隔"多年",也该对他进行翻修了,正好看到docker hub里有个中继和发现服务器的镜像

创建中继

中继和发现服务器需要有公网ip,推荐服务器来搭建
作者写的很详细了,这边给复制粘贴一下:

# 拉取镜像
docker pull johngong/syncthing-relay-discosrv:latest
# 创建镜像
docker create \
    --name=syncthing-relay-discosrv \
    -p 22067:22067 \
    -p 22070:22070 \
    -p 8443:8443 \
	   -e PROVIDED_BY="😮‍💨 www.xxdl.xyz" \
	   -e GLOBAL_RATE=2000000 \
    -e POOLS="https://relays.syncthing.net/endpoint" \
    --restart unless-stopped \
    johngong/syncthing-relay-discosrv:latest


22067 :中继的数据端口,用于数据连接
22070 :中继的状态端口用于汇报数据
	# 运行
	docker start syncthing-relay-discosrv
	# 停止
	docker stop syncthing-relay-discosrv
	# 删除
	docker rm  syncthing-relay-discosrv
	# 查看日志
	docker logs syncthing-relay-discosrv

注意:
当使用上面的命令运行后,会提示:
Joining default relay pools, this relay will be available for public use.
Use the -pools="" command line option to make the relay private.
意思就是你加入了公共的中继池,可被别人发现和使用,如果不想加入公共的,需要把设置
-e POOLS=""才行
从下面的变量复制命令后会报错,需要检查格式和缩进

变量:

参数 说明
--name=syncthing-relay-discosrv 容器名
-p 22067:22067 同步中继服务器协议监听端口
-p 22070:22070 同步中继服务器服务状态监听端口
-p 8443:8443 同步发现服务器监听端口
-v /配置文件位置:/config 可不设置,/config/discosrvdb为同步发现服务器数据库位置;/config/certs为服务器证书位置,设置后证书不变,重装后 device ID不变
-e UID=1000 uid设置,默认为1000
-e GID=1000 gid设置,默认为1000
-e GLOBAL_RATE=100000000 全局速率限制 单位为bytes/s
-e PER_SESSION_RATE=10000000 每个会话速率限制 单位为bytes/s
-e MESSAGE_TIMEOUT=1m30s 等待相关消息到达的最长时间
-e NATWORK_TIMEOUT=3m0s 客户端和中继服务器之间的操作超时时间
-e PING_INTERVAL=1m30s ping的发送频率
-e PROVIDED_BY="strelaysrv" 中继提供者
-e POOLS= 中继服务器地址列表,如果不填则为私有中继
-e DISCO_OTHER_OPTION= 同步发现服务器其它自添加选项,-debug -http -listen -metrics -listen -replicate -replication-listen,选项说明详见:https://docs.syncthing.net/users/stdiscosrv.html
-e RELAY_OTHER_OPTION= 同步中继服务器其它自添加选项,-debug -ext-address -listen -nat -nat-lease -nat-renewal -nat-timeout -protocol -status-srv,选项说明详见:https://docs.syncthing.net/users/strelaysrv.html

绑定域名

使用宝塔添加两个域名:

  • stdiscosrv.devitem.top 反代 8443端口
  • strelaysrv.devitem.top 反代22067端口

使用宝塔的ssl为stdiscosrv.devitem.top一键生成https同时记得放行端口8443,22067和22070

使用中继和发现服务器

  1. 先获取deviceID
docker logs syncthing-relay-discosrv
# Server device ID is DG5LEG6-5YUOBMY-33IYXFE-EIRQW4E-MADRY5R-XRSCBKX-H7QSTCB-6M2KXAW
  1. 来到客户端配置处,打开 界面- 操作-设置-连接页面
名称 例子 实际
协议监听地址 relay://ip或域名:本地端口1/?id=deviceID relay://strelaysrv.devitem.top:22067/?id=DG5LEG6-5YUOBMY-33IYXFE-EIRQW4E-MADRY5R-XRSCBKX-H7QSTCB-6M2KXAW
全球发现服务器 https://ip或域名:本地端口3/?id=deviceID, https://stdiscosrv.devitem.top:8443/?id=DG5LEG6-5YUOBMY-33IYXFE-EIRQW4E-MADRY5R-XRSCBKX-H7QSTCB-6M2KXAW

图片信息已过时,已文本为准
重要的注意事项!!!

如果你只想使用自建的发现服务器,就把全局发现服务器里面的default删除,否则就填入defalut,发现服务器地址.但是协议监听地址的default一定要带着,因为删除哪怕在局域网内设备也会通过中继服务器转发流量!!!
发现服务器和中继都是支持多个的,用逗号,分割

图片信息已过时,已文本为准
正确配置后效果如图:

加入公共中继池后可以在官方的中继池信息中找到自己

手机端配置

添加设备

安装好apk后进入网页管理页面,填入中继和发现服务器:

复制手机的设备ID

在nas的管理页面添加远程设备并输入手机的设备ID:


手机端会提示有设备请求连接:

添加设备成功

配置目录同步

添加一个要同步的目录

保存后先退出手机端app,然后nas端会自动提示有目录共享

选择nas里的docker映射目录,保存手机同步过来的数据到需要的位置

结束

按上面的配置完成后就可以开心的同步数据啦,有中继的可以在外网也能同步,其他的回收站机制就很明白了,页面上就很详细

其他

关于协议监听地址全局发现的填写

侦听程序(监听地址)按我的理解是自己传入/传出链接,只有别人知道这个链接才能传输数据.而全局发现的作用是一个地址薄,里面记录的就是用户的监听地址.只有双方的设备在地址薄上,同时能根据地址找到对方,才能进行数据传输.
而传输的速度取决于是怎么直接连接(比如局域网)还是中转的(中转服务器strelaysrv)
默认情况下的状态是这样的:

在默认情况下,侦听程序和设备发现应该是3/3和4/5(设备发现有一个是连不上的),但有时候网络不好,侦听程序只能监听两个本地的22000端口,这就意味外网通过中继池已经连接不上你了

如果只配置中继池,不写default,监听是这样的:
监听器只监听自己的中继池,不监听本地端口,所有的链接也就必须从中级池来,无法通过局域网传输数据

但是只指定发现服务器,设备的发现状态是这样的:

里面不只有自己的发现地址,还有ipv4/6的.
但是通过我的测试,按上面的配置,在同一个wifi下是无法直接传输数据的,原因就在于监听地址没有default

所以正确的配置是这样的:


这是解释:
协议监听地址指定default,自建中继池,在局域网内直接传输,外网环境通过中继
开启全局发现,只填入自建的发现服务器,只有使用这个发现服务器的设备和本地设备才能互相连接.
这样设置后就可以比较稳定的同步数据了.以前困扰我的指定中继服务器就不能局域网传输的问题也就解决了

参考文章:
https://zhuanlan.zhihu.com/p/613068091
https://github.com/gshang2017/docker 中继和发现服务器的docker镜像