被逼无奈,用 Syncthing 打造自己的同步云盘

3 月份,Dropbox 悄悄「公布」了一项新改动:

从 2019 年 3 月开始,Basic 用户最多只能关联 3 台设备。

Plus 和 Professional 用户可以关联的设备数量没有限制。

Business 用户可以关联的设备数量没有限制,但 Advanced 和 Enterprise Dropbox Business 管理员能够限制其团队可以关联的设备数量。

对于我这种设备绝对不止 3 台的人来说,这种改动无疑是逼着我去付费。

Dropbox 的付费对我又不太友好,最低档也要 8 刀一个月,还得年付。

虽然 Dropbox 特别好用,但是新改动对于我来说太致命,也让我不得不寻找一个新的解决方案了。

Syncthing 是一款开源的同步工具,简单了解一下发现可以实现我的需求,于是就动了下手。

2022.12.07 更新:优化配置逻辑,让 Syncthing 可以自动更新。

安装与更新

服务端

安装 Syncthing

本来考虑到家里有公网 IP,就直接 24 小时开家里的 PC,其他设备都以它为主进行同步。

不过考虑再三,保险起见,还是在 VPS 上部署一个服务端。

其实这个服务端本质上也是客户端,因为我的 VPS 系统是 Ubuntu 18.04 LTS,所以这个也可以视为 Linux 系统下的客户端使用指南。

<2022.12.07 更新>

优化配置逻辑,让 Syncthing 可以自动更新。

打开 官网,找到最新的 Linux 64 bit 版的客户端。

如果以 root 用户启动 Syncthing 会被提示不建议在 root 用户下运行,所以在正式使用之前,先建立一个专门的用户。

1
adduser syncthing

按照引导将用户建立完成,切换到刚创建的用户 syncthing 将客户端下到 VPS 上,并解压出来,将其中的执行程序复制到用户目录下。

1
2
3
4
wget https://github.com/syncthing/syncthing/releases/download/v1.1.0/syncthing-linux-amd64-v1.1.0.tar.gz
tar -xzvf syncthing-linux-amd64-v1.1.0.tar.gz
cd syncthing-linux-amd64-v1.1.0
cp syncthing /home/syncthing/syncthing

运行一次 Syncthing,程序会将配置文件释放出来。

停止运行程序,先编辑配置文件。

1
vim /home/syncthing/.config/syncthing/config.xml

找到 <address> 这行,将 127.0.0.1 改为 0.0.0.0,这样就可以从公网访问 Web UI 了,保存退出。

再次直接运行 Syncthing,然后在地址栏输入 http://w.x.y.z:8384/ 进入 Syncthing 的 Web UI 管理界面,第一次访问时会提醒设置账号及密码,建议设置并重启 Syncthing。

这时候 Syncthing 就已经可以开始正常使用了,如果使用了防火墙,在过程中对相应的规则进行放行。

比如我使用的是 UFW,那么将执行以下命令:

1
2
ufw allow syncthing
ufw allow syncthing-gui

作为服务启动

Syncthing 非常地贴心啊,在第一次启动时不止在用户的 .config 目录释放了配置文件及证书,也释放了 systemd 服务文件,可以直接启用。

不过我为了偷懒,拿它的文件改了一下,指定了用户,这样在用 systemd 控制时可以少打点字母。

1
vim /lib/systemd/system/syncthing.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[Unit]
Description=Syncthing
Documentation=man:syncthing(1)
After=network.target

[Service]
User=syncthing
ExecStart=/home/syncthing/syncthing -no-browser -no-restart -logflags=0
Restart=on-failure
SuccessExitStatus=3 4
RestartForceExitStatus=3 4

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

[Install]
WantedBy=multi-user.target
1
2
systemctl enable syncthing
systemctl start syncthing

更新 Syncthing

2022.12.07 更新:现在已可以自动更新。

下新版本的 Syncthing,关闭当前运行的程序,将可执行文件替换即可,操作如下:

1
2
3
4
5
6
wget https://github.com/syncthing/syncthing/releases/download/v1.1.1/syncthing-linux-amd64-v1.1.1.tar.gz
tar zxvf syncthing-linux-amd64-v1.1.1.tar.gz
cd syncthing-linux-amd64-v1.1.1
systemctl stop syncthing
cp syncthing /usr/local/bin
systemctl start syncthing

客户端

Windows

Windows 平台下有个很好用的 GUI 客户端 SyncTrayzor,基本上就是下载、安装、打开使用,开袋即食。

GUI 客户端本身及 Syncthing 核心都会提示更新,按照提示操作即可。

Android

没啥说的,官方客户端

更新也是按照 Google Play 官方提示更新。

Synology

打开 套件中心 - 设置 - 套件来源,点击 新增 添加第三方来源 SynoCommunity,地址为 http://packages.synocommunity.com/,确定保存。

添加来源

刷新套件中心会看到多出一个 社群 类别,点进去找到 Syncthing 安装即可。

安装 Syncthing

这个客户端 Web GUI 默认监听 0.0.0.0:8384,可以直接访问群晖内网 IP 的 8384 端口而不需要更改任何设置。

更新可以依赖套件中心(可能会慢),或 Web GUI 自动更新。

使用

不论服务端还是客户端,使用逻辑都是同一套的 Web UI,服务端访问方式上面已说,本地客户端可以访问 http://127.0.0.1:8384/

当然,SyncTrayzor 之类的客户端自带界面。

Web GUI 界面

右上角 操作 中有个 显示 ID,点开可以看到 ID 和二维码,方便其他设备添加该设备,点击右下角的 添加远程设备 输入 ID 提交添加申请,被添加的设备通过后设备之间就联系上了。

在用电脑添加服务端时,在 共享 选项卡中把 作为中介 勾上,这样其他设备在添加服务端后,会自动把与服务端联系的设备自动添加上。

添加设备

设备添加完了,就该设置同步了。

点击 添加文件夹 打开界面。

添加文件夹

设置一下 文件夹路径,不要去 动文件夹 ID文件夹标签 按自己的习惯填写。

然后打开 版本控制 选项卡。

版本控制

Syncthing 有一个强大的版本控制功能,合理设置能有效降低误操作带来的损失。

对于一般使用者来说,简易版本控制 够用了,保留版本数量随自己喜好。

实际使用中,效果是这样的:

恢复历史版本

这时再回到 共享 选项卡,把文件夹共享给要同步的设备,目标设备接受就算完成了。

如果设备勾选了 自动接受,在共享勾上时就会自动接受并开始同步,但会在默认目录建立,所以如果对路径有比较强的规划,不推荐给设备勾选此选项。

不过这里有个问题,Android 客户端接受之后会让用户设置文件夹属性,并指定位置,但 Web UI 界面下接受后就直接在默认目录按照 文件夹标签 建立文件夹,这个并不符合所有人的使用习惯,起码不符合我的。

为了避免这个文件,我会在所有设备上先建立好要同步的文件夹,指定好路径,只要所有设备里同步文件夹的 文件夹 ID 一致,设置完后勾上共享就可以开始同步了。

到这里,属于我自己的私人同步云盘就建立起来并正常开始工作了,使用方式和 Dropbox 并无太大区别,将要同步的内容丢到文件夹中即可。

微小的工作

字体

Web UI 的字体我总是看它不太爽,尤其是字母和数字对不齐真是要了我的老命。

这字体可真让我难受

看了看好像是默认字体的锅,想了想还是没忍住把它给干了。

使用类似 Stylus 之类的扩展,在里面添加一个新样式,写入如下内容:

1
2
3
h4 {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"
}

然后应用于本地及远程 Web UI 的地址即可,效果如下:

对齐后就舒服了

@eaDir 文件夹

DSM 会在含有图片的文件夹建立索引,@eaDir 文件夹就是为了实现这个功能而在目录自动添加的。

但是对我来说,其他设备上看到这个挺烦的,还好 Syncthing 支持忽略模式,可以写一条规则避免将这个文件夹同步到别的设备上。

点击要修改的文件夹,点击 选项,转到 忽略模式 选项卡,在下面正文部分添加一条:

1
@eaDir

保存即可生效。

结语

这么多天使用下来,Syncthing 还是能满足我的使用要求的,并且相对于 Dropbox 来说,我有了一些更自由的选项。

天下宴席,终有散时,Dropbox,我们后会有期,感谢这么些年来给我带来的美好体验。