使用 Syncthing 多端丝滑同步与备份

折腾背景

一直想找一个能够快速同步手机与电脑数据的工具,因为手机云服务的空间少的可怜,所以习惯隔一段时间将手机里的照片、视频还有一些文件导出到电脑上。但是每次备份文件都得连接数据线,并且没法增量备份,得手动挑选,也还挺麻烦的。

逛 GitHub 时,无意间发现了 Syncthing,几乎符合了我所有的预期。

  • 开源,免费,自己电脑就可以当服务器,以后入了 NAS,可以自己搭建本地服务器。
  • 同步速度快,取决 WIFI 的速度,目前使用 30M/s,基本满速。
  • 多端支持,除了 IOS(反正我也没有 iOS 设备,嘿嘿),几乎全平台支持,包括 NAS 及路由器。
  • 增量同步,再也不用挑文件备份了。

话不多说,开整。

下载安装

直接进入Syncthing官网,下载安装。在 Ubuntu 下安装参考这里。Android 版本下载Syncthing

接下来以 Windows 与 Android 手机同步为例,下载安装后,打开syncthing.exe,即可打开管理界面,或者浏览器输入http://127.0.0.1:8384也可进入管理界面。

Windows 界面:

Android 界面:

设备配对

Windows 管理页面->操作->显示 ID,会显示本机的二维码:

Android 手机打开应用,切换到设备界面,点击右上角加号,点击二维码标识,即可扫描二维码,完成设备添加。

如果正确添加,Windows 管理界面会显示 Android 设备:

Android 同步至 Windows

打开 Android 应用,切换到文件夹界面,点击右上角加号,配置同步的文件夹:

根据下图提示,配置应用,记得保存:

目录列表显示刚刚的配置:

点击打开,开启与远程设备 Windows 同步:

当返回时,Windows 端将会弹出通知,提示有 Android 设备的文件要分享到电脑,点击添加

至此,Android 同步至 Windows 完成。此时在 Android 设备的文件夹中添加任意文件,都会同步到 Windows。

如果是局域网内,发现设备的速度很慢,可以尝试设置静态的 IP。手机端 -> 设备 -> 链接图标。默认为 dynamic,将其改为 Windows 的 IP 和 syncthing 的端口。如tcp://192.168.1.9:22000

也可以在服务端配置手机的IP,手机IP可以通过设置中心->关于手机->状态->IP地址查看。比如192.168.1.16,那么可以配置为tcp://192.168.1.16:22000

Windows 同步至 Android

Windows 管理界面,添加文件夹:

点击保存后,与之前类似,Android 会提示有 Windows 设备的文件要分享到 Android,点击添加

如果 Android 设备没有弹出提示添加共享文件夹,那么打开应用侧边栏->网页管理页面,将会有弹窗,如下图

点击添加,配置文件夹目录等与之前类似。

至此,Windows 同步至 Android 完成。此时在 Windows 设备的文件夹中添加任意文件,都会同步到 Android。

使用技巧

Syncthing 支持三种工作模式

  • 发送和接收,Send & Receive Folder,这是文件夹的默认模式,对文件夹的修改会发送,其他设备的修改也会同步回来。
  • 仅发送 Send Only,这种模式表示仅仅将当前设备上的文件夹的改动发送到其他设备,用来隐式地表示其他同步设备上的文件不会被修改,或者其他设备上的修改可以被忽略。这种模式非常适合,将当前设备设定为工作设备,然后设定一台设备作为此设备的备份。
    • 在 Send Only 模式下,集群中其他设备的修改都会被忽略,修改依然会接收,文件夹可能会出现 「out of sync」,但是没有修改会被应用到本地。
    • 当 Send Only 文件夹出现 out of sync,那么一个红色的 Override Changes 会出现在文件夹详情中,点击该按钮会强制将当前主机的状态同步到其他剩余节点。任何对文件的修改,都会被当前主机上的版本所覆盖,任何不存在于当前主机节点的文件都会被删除,其他类似。
  • 仅接收 Receive Only,这种模式下所有的修改都会被接收并应用,然后重新分发给其他使用 send-receive 模式的设备。但是本地的修改不会被分发给其他设备。这种模式适合于建立备份镜像(replication mirrors),或者备份目的主机的场景,这些情况下不期望有本地修改或者本地的修改是不允许的
    • 当本地文件被删除时,Syncthing 会显示一个 Revert Local Changes 按钮。使用这个按钮会将本地的修改回撤,所有添加的文件会被删除,修改或删除的文件会重新从其他节点同步,比较容易理解,但是假如 A 设备设置仅发送,B 设备设置发送和接收,A 是不会同步 B 的更改的!

忽略特定文件、目录

忽略列表,和 gitignore 类似。每一台设备上的 .stignore 都是分别设置的,不会进行同步。

如果 A 的.stignore忽略了 test ,而 B 没有这样做,实际上会发生这样的事情:

  • A 不会扫描和通知 B(广播)关于 test 的变动;
  • B 对关于 test 的变动持开放的姿态,但不会收到任何关于 A 上面 test 的变动信息(可能接收到其它同步设备的);
  • B 会扫描 test 以及推送其关于 test 变动的信息,但会被 A 忽略,A 也会忽略其它同步设备关于 test 的信息;
  • B 会接收来自其它同步设备推送的关于 test 的信息;

参考资料

Syncthing 又一款同步工具 | Verne in GitHub

Folder Types — Syncthing documentation