OpenWrt/LEDE 搭建 Syncthing p2p 私有文件同步服务
简介
因为最近团队有文件同步的需要,常见的公有云服务要么就是不靠谱要么是速度慢,要么就是太贵:expressionless: 饱受好评的坚果云则是限制流量而且据说有隐性限制。
家里上传有 30M 带宽,足够满足常规的文件同步了。常见的私有云系统有 NextCloud/Syncthing/Resilio(BTSync)。NextCloud 更像是一个私人网盘,属于c/s模式,对中心服务器稳定性要求极高,家里路由器感觉无法担此重任。BTSync 是一个基于 BT 的同步软件,近年来大陆的 BT 情况并不好所以也暂不考虑。最终采用 Syncthing。Syncthing 是一个开源免费的文件同步系统,有多平台支持(官方不支持IOS,有一个第三方的收费客户端)。
Syncthing 是分布式的,不依赖中心服务器,如果节点有公网 IP 那么会走直连同步,否则走中继。Syncthing 有不少免费开放的公共中继节点可惜都不在大陆,速度比较慢。如果非常介意可以搭建一个私有中继服务。
先看看成品图:
安装
需要强调:Syncthing 是不分服务器/客户端的。本文仅把路由器节点作为逻辑上的「服务器」以便保证任何时候都有具有公网 IP 的节点在线以便加速传输。
在 release 页面可以看到各个平台编译好的安装包。由于我使用的是 J1900 软路由,所以选择 linux-64 版本。
# 进入用于保存程序的目录
cd /mnt/sda5/
# 下载程序
wget https://github.com/syncthing/syncthing/releases/download/v1.3.0/syncthing-linux-amd64-v1.3.0.tar.gz
# 解压
tar -zxvf syncthing-linux-amd64-v1.3.0.tar.gz
# 为了方便整洁改个名字
mv syncthing-linux-amd64-v1.3.0 syncthing
# 给予执行权限
chmod +x syncthing/syncthing
其实到此为止我们直接执行 syncthing 就能开启服务了。它默认会在 \$HOME/.config/syncthing
创建配置文件。不过我们干脆一次性配置完再运行也不迟。
# 创建一个软链接,就可以在任何目录下执行了
ln -s /mnt/sda5/syncthing/syncthing /usr/bin/syncthing
开机自启
接下来要配置开机自启,编辑 /etc/rc.local
,也可以在路由器 web 管理 系统-启动项
处设置。在 exit 0
之前添加以下内容:
syncthing -gui-address="0.0.0.0:8384" -home="/mnt/sda5/syncthing/conf" -logfile="/var/log/syncthing.log" -no-browser >/dev/null &
gui-address
用于指定 Syncthing web 控制台的地址与端口,默认是127.0.0.1
也就是只有路由器本机可以访问,我们电脑是访问不了的,改成0.0.0.0
也就是任何人都可以访问。home
用于指定配置文件存放位置。logfile
用于指定日志文件存放位置。no-browser
启动时不要自动打开 web 控制台。只对 GUI 系统有效,顺手加上就行了。>/dev/null
将输出重定向到dev/null
,这是个特殊位置,相当于直接丢弃。也就是不要显示输出。&
后台运行。
最后我们先手动执行一下上面的自启命令,就可以启动 Syncthing 服务了。登录路由器 IP + 上面配置的端口可以打开控制台。PS: 有可能会有个红色警告,点击右上角设置修改下密码就行了。
配置 https 远程访问
有时也许我们希望在外面打开控制台查看状态之类的(其实并不非常必要),那么就得配置远程访问。需要路由器具有公网 IP 否则需要内网穿透,本文假设具有公网 IP。
首先到路由器 网络-防火墙-端口转发
新增一个转发规则,协议是 tcp+udp
,外部端口填你想访问的端口,友情提示:大多数家庭宽带 80/8080/443
等常见 web 端口都是被屏蔽的。内部 IP 地址就是路由器的 IP,也即运行 Syncthing 服务设备的 IP。内部端口就是上面设置的端口,此处是 8384
。
到此为止就可以在外网通过 IP:外部端口
的形式访问了。开启外部访问务必设置一个较为复杂的密码。
Syncthing 默认已经支持了 https,你可以直接使用 https://
来访问,毫无疑问会收到一个类似「隐私设置错误」的警告。这是因为自带的证书不被浏览器信任。要想解决首先需要绑定一个域名,这就涉及到 ddns 动态域名解析。在 服务-动态DNS
已经集成了这项功能,自己去配就可以绑定一个域名。
接着还需要获取一个证书,Lets Encrypt 是一个互联网公益机构,免费提供可信的 https 证书。KoolLEDE 软件中心已经有了相关插件可以自动申请,你也可以手动申请或者通过其他渠道申请。
如果使用 Lets 插件申请,最后证书会保存在
/koolshare/acme/域名
处。其中fullchain.cer
是公钥,域名.key
是私钥。
用自己的公私钥文件分别替换 Syncthing conf 目录下的 https-cert.pem
和 https-key.pem
即可。重启 Syncthing 后就可以用 https 顺畅访问了。在控制台 设置-图形用户界面
可以设置强制 https,届时 http 会自动跳转。