自由职业者的树莓派:私有网盘篇

摘要:本篇主要讲解如何使用开源软件 Syncthing,并在树莓派设备上搭建自己的私有网盘,从此容量想要多大都自己做主。内容涉及安装同步软件、配置树莓派和电脑端的同步,以及可选搭建自己的发现和中继服务等。

阅读本篇之前,建议您先了解 基础准备篇 的内容。

不知道您有没有跟我一样的困惑,每天总有很多需要处理的工作,背着个电脑进进出出,从家里到公司上班,下班后再回家,总感觉自己的身体和大脑没得到一丝闲暇。所以我分享给大家的想法很简单,就是想通过打造一个自己的个人云网盘,在家、在公司或随时随地,都可以同步自己的工作成果、照片、文档等。
作为未来工作的自由职业者,我们大量的电子书、技术学习视频、各项目的设计、开发文档,都需要妥善的保存,随时随地获取和同步更新。而不仅仅是像第三方的云网盘那样只能上传下载,容量稍微想要大一点,还得包年包月的不停缴费。
而我们自己有了这样的免费自主控制的私有网盘后,就不用再缴费了。当然,放在公司的电脑,也就不用再天天背着上下班了。

下面,我们就开始来亲手打造吧。

  1. 准备工作
  2. 安装 Syncthing 同步工具
  3. 配置树莓派设备端同步目录
  4. 配置电脑端同步目录
  5. 搭建发现和中继服务(可选)

准备工作

基本的准备工作完成后,就可以开始最主要的搭建云盘了。在动手之前,先规划一下自己的云盘方案。针对 我们平常的使用,一般来说,可以按照存储工作资料、个人资料、公共资源或其它兴趣专题资料分别创建几个云盘。例如:

  • company - 工作资料
  • my - 个人资料
  • resource - 资源(照片、音乐、视频、文档等)
  • works - 作品

为了将云同步的东西与其它分开,我是将这些数据统一放在 [cloud] 目录中的,方便识别。

# 进入移动硬盘
cd /volumes/mydisk

# 创建用作云盘的目录
mkdir [cloud]
cd [cloud]
mkdir company
mkdir my
mkdir resource
mkdir works

现在想好这个规划后,就开始动手搭建吧。

安装 Syncthing 同步工具

接下来,就安装云盘软件,这里主要介绍开源的 Syncthing 方案。

类似的方案,国内还有 微力同步 也不错,可以试试(不过它是非开源软件)。

在 ssh 远程连接的树莓派系统上安装 Syncthing:

# 添加发布 PGP key
curl -s https://syncthing.net/release-key.txt | sudo apt-key add -

# 添加稳定版的 APT 源
echo "deb https://apt.syncthing.net/ syncthing stable" | sudo tee /etc/apt/sources.list.d/syncthing.list

然后:

# 更新并安装 syncthing
sudo apt update
sudo apt install syncthing

更多帮助,参见 https://apt.syncthing.net/

下面再配置一下,使用 system service 来支持开机自启动。

您可以打开源代码 https://github.com/syncthing/syncthing/tree/main/etc/linux-systemd/system,找到目录下的服务文件,将其复制到梅莓派的 /etc/systemd/system 下;也可以采用更简单的手动创建。具体包括下面2个文件:
syncthing@.service

[Unit]
Description=Syncthing - Open Source Continuous File Synchronization for %I
Documentation=man:syncthing(1)
After=network.target

[Service]
User=%i
ExecStart=/usr/bin/syncthing -no-browser -no-restart -logflags=0
Restart=on-failure
RestartSec=5
SuccessExitStatus=3 4
RestartForceExitStatus=3 4

# Hardening
ProtectSystem=full
PrivateTmp=true
SystemCallArchitectures=native
MemoryDenyWriteExecute=true
NoNewPrivileges=true

[Install]
WantedBy=multi-user.target

syncthing-resume.service

[Unit]
Description=Restart Syncthing after resume
Documentation=man:syncthing(1)
After=sleep.target

[Service]
Type=oneshot
ExecStart=-/usr/bin/pkill -HUP -x syncthing

[Install]
WantedBy=sleep.target

然后,启用服务。因为树莓派的 Ubuntu 系统默认用户是 ubuntu,所以按以下命令操作即可。

systemctl enable syncthing@ubuntu.service
systemctl start syncthing@ubuntu.service

如果要检查是否成功或者是想看下日志,可以使用:

systemctl status syncthing@ubuntu.service
journalctl -e -u syncthing@ubuntu.service

更多帮助 ,参见相关的官方文档 https://docs.syncthing.net/users/autostart.html#using-systemd

因为,要从电脑上访问树莓派上运行的 syncthing 的控制台网页,还需要改一下其配置文件。

sudo nano ~/.config/syncthing/config.xml

找到其中的访问地址:

<gui enabled="true" tls="false" debugging="false">
<address>127.0.0.1:8384</address>

将其改为:

<gui enabled="true" tls="true" debugging="false">
<address>0.0.0.0:8384</address>

以便其它主机也可以远程访问。然后重启一下服务:

systemctl restart syncthing@ubuntu.service

稍等片刻就重启好了。

配置树莓派设备端同步目录

现在我们就可以用桌面电脑浏览器访问控制台网页,轻松的配置云盘目录。

https://192.168.31.199:8384/

程序默认创建了一个 Default Folder,目录位置在 ~/Sync 下。我们如果不想用的话,可以删除它,然后点击 [添加文件夹] 创建自己的云盘目录。

比如,我的新移动硬盘挂在 /volumes/slash 下的,里面创建了 /[cloud]/works/ 目录用来作为一个云盘的根目录。

需要特别注意的是,为了防止将来文件被意外删除和同步,导致文件丢失,请在 [版本控制] 标签页中,选上 [回收站式版本控制],保存 3 天左右。

配置电脑端同步目录

创建好云盘后,接下来就是最关键的,同步云盘数据了,我们在需要桌面电脑上同样安装 Syncthing 软件。比较方便的是官网提供了好用的小工具软件,可以自己到 https://syncthing.net/downloads/ 进行下载,对 Windows、macOS、Linux 和 Android 都提供了支持,只是暂时还没有 iOS 版本,不过我一般都是使用 macOS 系统。

安装好后,与树莓派是类似的,打开浏览器,访问控制台界面:

http://localhost:8384/

然后,点击 [添加远程设备],先将树莓派添加到里面来。因为树莓派和桌面电脑在同一个局域网内,通常是会自动发现树莓派的设备 ID,点选确定即可。

如果因为网络特殊,也可以在上一步树莓派的控制台网页,其右上角的操作下拉菜单,点击 [显示 ID] 来获取树莓派设备 ID,并填入要添加的远程设备 ID,同时取个容易记住的设备名,比如:树莓派 raspi

这时,打开树莓派的控制台网页,将会收到共享请求,确认 [添加设备] 即可。

接下来,就在展开 works,点击 [选项] 按钮,切换至共享标签页,勾选上桌面电脑设备,保存即可发起共享文件夹的请求。

共享操作是双向的,随便哪边发起共享都是一样的。

再次打开桌面电脑的控制台网页,将会收到共享过来的请求,以进行确认添加。

点击 [添加] ,选择电脑本地的文件夹路径,保存即可完成云盘同步设备。

在电脑上同步的文件夹,我就没有再使用回收站式版本控制了,有一边支持就行。

现在,您就可以在电脑上存放您的文档,Syncthing 将会自动帮您把文件同步到树莓派的移动硬盘上了。两边都有同样的文档,就不用那么担心电脑或移动硬盘某一边坏了的情况了。

恭喜您,已完成整个云盘的搭建。如果您还想搭建更多的云盘,与更多的设备同步的话,继续添加远程设备和共享文件夹就可以了。


搭建发现和中继服务(可选)

因为使用全局的发现和中继服务可能会受到可用性和稳定性的影响,所以我们条件允许的话,最好有台自己的、带公网 IP 的云主机,搭建自己的同步发现和中继服务。

小秘密:购买云主机的话,上半年关注 6/18 活动,下半年关注 11/11 活动。我买的 1核2GB 配置,加上公网 IP 和 2MB 带宽,优惠下来也就 100 多元/年,还不错。除了用于搭建网盘同步的发现和中继服务外,还可以多用途使用,比如以后做域名备案、内网穿透、工具软件安装等,看您怎么选择咯。

首先,登录有公网 IP 的服务器,下载相关软件。

ST_DISCOSRV_VER=1.18.6
sudo wget https://github.com/syncthing/discosrv/releases/download/v${ST_DISCOSRV_VER}/stdiscosrv-linux-amd64-v${ST_DISCOSRV_VER}.tar.gz
sudo tar -zxvf stdiscosrv-linux-amd64-v${ST_DISCOSRV_VER}.tar.gz
sudo mv stdiscosrv-linux-amd64-v${ST_DISCOSRV_VER} stdiscosrv
sudo cp stdiscosrv/stdiscosrv /usr/local/bin/
ST_RELAYSRV_VER=1.18.6
sudo wget https://github.com/syncthing/relaysrv/releases/download/v${ST_RELAYSRV_VER}/strelaysrv-linux-amd64-v${ST_RELAYSRV_VER}.tar.gz
sudo tar -zxvf strelaysrv-linux-amd64-v${ST_RELAYSRV_VER}.tar.gz
sudo mv strelaysrv-linux-amd64-v${ST_RELAYSRV_VER} strelaysrv
sudo cp strelaysrv/strelaysrv /usr/local/bin/

需要使用最新的版本,请更新一下 ST_DISCOSRV_VER 和 ST_RELAYSRV_VER 的值。

如果服务器是 Ubuntu 系统,可以更简单地通过 APT 进行安装。

sudo apt-get update
sudo apt-get install syncthing-discosrv
sudo apt-get install syncthing-relaysrv

具体步骤参见文档:https://apt.syncthing.net/

接下来,启动发现服务:

stdiscosrv -listen ":8443"
# 其它可选参数
-cert="/path/to/cert.pem" -key="/path/to/key.pem"
# ...
Server device ID is 7DDRT7J-UICR4PM-...-G3EUPQA

备注
-cert 和 -key:证书和私钥默认会自动生成;如果有自己购买的 CA 签名证书,可以手动追加相应启动参数。

对于 Syncthing 客户端配置来说:

  • 如果您使用的是 CA 签名证书,发现服务器 URL (示例)为:
https://disco.example.com:8443/
  • 如果是非 CA 签名证书,则必须追加设备 ID(指纹)提供给客户端配置,发现服务器 URL (示例)为:
https://disco.example.com:8443/?id=7DDRT7J-UICR4PM-...-G3EUPQA
https://11.22.33.44:8443/?id=7DDRT7J-UICR4PM-...-G3EUPQA
  • 如果是域名主机方式,请将示例中disco.example.com 修改为您的域名主机。
  • 如果是 IP 地址方式,请将示例中 11.22.33.44 修改为您的公网 IP。

其中,id 值修改为您启动时收到的 Server device ID。

详细的配置参见帮助文档:https://docs.syncthing.net/users/stdiscosrv.html

再启动中继服务:

strelaysrv -pools=""
# 其它可选参数
-listen=":22067" -status-srv=":22070"
-keys "/path/to/keys"
-provided-by="Foo"
# ...
URI: relay://0.0.0.0:22067/?id=YBQOVTD-LCXFTSW-...-VKML6AN&pingInterval=1m0s&networkTimeout=2m0s&sessionLimitBps=0&globalLimitBps=0&statusAddr=:22070&providedBy=Foo

备注
-pools:当不想共享给其它人使用时,一定要加上 -pools=""
-listen:协议侦听端口,默认端口为 22067。
-status-srv:状态服务的监听端口,默认端口为 22070(-status-srv="" 为禁用)。
-keys:证书和私钥默认会自动生成;如果有自己购买的 CA 签名证书,可以手动追加相应启动参数,存放的文件名为 cert.pem 和 key.pem。

详细的配置参见帮助文档:https://docs.syncthing.net/users/strelaysrv.html

当然,您也可以使用 docker 或 containerd(nerd) 容器方式来安装:

  • 发现服务
sudo nerdctl run -d --name syncthing-discovery --restart always \
  -p 8443:8443 \
  -v /volumes/data/app/syncthing-discovery:/var/stdiscosrv \
  syncthing/discosrv:1.18.6

# 可选参数
  -p 19200:19200 \
  -v /volumes/data/app/cert/syncthing-discovery:/etc/stdiscosrv \
# 可选参数(discosrv 应用)
  -key "/etc/stdiscosrv/key.pem" \
  -cert "/etc/stdiscosrv/cert.pem" \

通过容器日志查看 Server device ID:

sudo nerdctl logs syncthing-discovery
# ...
Server device ID is TW4S6ES-4EZK2NL-...-LH5EQA5

文档参见:https://docs.syncthing.net/users/stdiscosrv.html

  • 中继服务
sudo nerdctl run -d --name syncthing-relay --restart always \
  -p 22067:22067 -p 22070:22070 \
  -v /volumes/data/app/syncthing-relay:/var/strelaysrv \
  syncthing/relaysrv:1.18.6 \
  -pools="" -provided-by="Foo"

# 可选参数
  -v /volumes/data/app/cert/syncthing-relay:/etc/strelaysrv \
# 可选参数(discosrv 应用)
  -keys /etc/strelaysrv

通过容器日志查看 URI:

sudo nerdctl logs syncthing-relay
# ...
URI: relay://0.0.0.0:22067/?id=YBQOVTD-LCXFTSW-...-VKML6AN&pingInterval=1m0s&networkTimeout=2m0s&sessionLimitBps=0&globalLimitBps=0&statusAddr=:22070&providedBy=Foo

文档参见:https://docs.syncthing.net/users/strelaysrv.html

具体的启动参数与前面一致,就不再重复描述。另外,关于 Syncthing 客户端的容器启动,文档参见:https://github.com/syncthing/syncthing/blob/main/README-Docker.md

现在,您已成功启动发现和中继服务器。
接下来,就可以在各个需要同步的 Syncthing 客户端网站右上角,点击『操作 > 设备 > 连接』标签页,配置相关地址:


配置发现服务器和中继地址

其中,

  • 协议监控地址:根据启动中继服务时返回的 URI 地址,摘取相关部分,并替换 0.0.0.0为自己的公网 IP 即可,示例:tcp://0.0.0.0:22000, quic://0.0.0.0:22000, relay://11.22.33.44:22067/?id=YBQOVTD-LCXFTSW-...-VKML6AN ,多个地址以逗号分隔。
    详细的配置参见帮助文档:listenAddressglobalAnnounceServer
  • 全局发现服务器:根据启动发现服务时返回的 Server device ID,并结合自己的公网 IP 和端口进行相应拼接,示例:https://11.22.33.44:8443/?id=TW4S6ES-4EZK2NL-...-LH5EQA5

配置后,稍等一下,就可以看到运行状态,以及是否能同步文件了。


Syncthing 客户端状态

我是几昆虫,一个追求终身成长的努力者。感谢您完整阅读这篇文章,期待与您的思想相遇。