banner
Leo

Leo的恒河沙

一个活跃于在珠三角和长三角的商业顾问/跨境电商专家/投资人/技术宅/骑行爱好者/两条边牧及一堆小野猫的王/已婚;欢迎订阅,日常更新经过我筛选的适合精读的文章,横跨商业经济情感技术等板块,总之就是我感兴趣的一切

2023-09-11-搭建syncthing并配置中继-发现服务器-使用docker - 知乎

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

#Omnivore

重要!!!中继服务器和发现服务器不是必须的,没有服务器的可以直接用 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. 不过有的目录已经被使用,重复赋权可能会麻烦,可以直接使用管理员=0,PGID=0

官网获取 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, 添加映射路径等等

图标链接: https://raw.githubusercontent.com/linuxserver/docker-templates/master/linuxserver.io/img/syncthing-logo.png

启动 Nas 端#

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

image

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

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

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

image

创建中继#

中继和发现服务器需要有公网 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=1000uid 设置,默认为 1000
-e GID=1000gid 设置,默认为 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=1m30sping 的发送频率
-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=deviceIDrelay://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

image

图片信息已过时,已文本为准

重要的注意事项!!!

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

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

image

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

手机端配置#

添加设备#

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

image

复制手机的设备 ID

image

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

image

image

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

image

添加设备成功

image

配置目录同步#

添加一个要同步的目录

image

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

image

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

image

image

结束#

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

其他#

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

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

image

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

image

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

image

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

image

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

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

image

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

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

Loading...
Ownership of this post data is guaranteed by blockchain and smart contracts to the creator alone.