Syncthing介绍
简单地说Syncthing是一款可以实现多端文件同步的开源项目程序,例如,我有3台机器和许多重要的数据资料,这些数据资料会不定时更新补充,为了防止丢失,我希望将资料存放在这3台机器中,并且只要在一台机器更新,就会自动同步到所有机器,那么Syncthing就是用来实现这个功能的,并且其功能远不止此
Syncthing目前几乎可以全平台部署(下载地址),支持Windows、Linux、MacOS、Android等,几乎涵盖大部分人接触到的平台,所以用起来非常方便
部署
下面将只介绍常用的Windows和Linux平台的部署方案
Windows平台
Windows平台提供了一个安装程序,可以直接安装到系统上,然后在GUI界面下使用,非常方便
可以直接点击这里进到Github项目中下载安装程序,按照步骤安装即可
安装好后,程序会默认监听在8384
端口,在浏览器中访问http://127.0.0.1:8384/
即可进入Syncthing的GUI界面,也可以在安装的时候勾选生成shortcut
,这样就可以在桌面点击快捷方式进入了
注:没记错的话,安装过程中有提供开机自启的选项,由于不太记得当时有没有勾选,所以我将
Start Syncthing
这个程序重新生成了个快捷方式放到了启动目录(shell:startup)里以防万一
关于GUI界面操作的内容放到最后面一起讲吧,可以直接点击这里跳转
Linux平台
Syncthing提供了Docker容器镜像,因此推荐使用Docker部署,比较方便
容器创建
推荐直接使用docker-compose
进行部署,确保已经安装了docker
和docker-compose
,安装步骤这里就不再赘述,然后创建docker-compose.yml
文件,写入如下内容:
services:
syncthing:
image: syncthing/syncthing
container_name: syncthing
hostname: my-syncthing
environment:
- PUID=0
- PGID=0
volumes:
- ./syncthing_data:/var/syncthing
- /dir1:/dir1
- /dir2:/dir2
ports:
- 127.0.0.1:8384:8384 # Web UI
- 22000:22000/tcp # TCP file transfers
- 22000:22000/udp # QUIC file transfers
- 21027:21027/udp # Receive local discovery broadcasts
restart: unless-stopped
需要注意的是,我在docker-compose.yml
文件的环境变量中配置了PUID=0
和PGID=0
,这意味着容器启动后Syncthing将具有Root权限,而官方建议配置普通用户权限PUID=1000,PGID=1000
,我之所以使用Root权限是因为我的文件系统中的目录所属用户几乎都为Root,使用普通用户会没法访问,所以干脆提权来一劳永逸
对于挂载卷,需要保证容器的/var/syncthing
目录要挂载到宿主机,其他的可以根据自己需要同步的目录按照需要进行挂载
docker-compose.yml
文件写入后就可以执行docker-compose up -d
启动容器了
反向代理
反代程序使用的依然是我们的老朋友Nginx,我们需要有一个域名,并申请好证书(可以使用certbot
申请Let's Encrypt
证书),这里也不再赘述
然后在/etc/nginx/conf.d/
下创建Nginx配置文件syncthing.conf
,内容如下:
server {
listen 80;
listen [::]:80;
server_name <your_domain>;
return 301 https:$server_name$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name <your_domain>;
ssl_certificate /etc/letsencrypt/live/<your_domain>/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/<your_domain>/privkey.pem;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://localhost:8384/;
proxy_read_timeout 600s;
proxy_send_timeout 600s;
}
}
需要将server_name
和ssl证书部分的<your_domain>
替换为自己的域名,然后systemctl restart nginx
重启Nginx服务,然后就可以直接访问https://<your_domain>
进入GUI界面
配置与操作
搭建好服务后,接下来介绍一下Syncthing GUI界面的操作和使用
访问控制
进入界面后可以先将语言改为中文,然后可以根据需要在设置 - GUI
界面中添加打开网页时的用户名和密码
添加远程设备
接下来,我们需要首先添加一个远程设备来和我们当前设备建立连接,点击首页添加远程设备
,弹出对话框,在常规
菜单里输入远程设备的设备ID和设备名,共享
和高级
菜单可以暂时不用管
其中设备ID是每台设备部署好Syncthing服务后自动生成的唯一标识符,可以点击右上角操作
- 显示ID
找到,设备名可以随便起一个别名即可
添加完设备点击保存后,在远程设备的GUI界面会弹出一个申请建立设备连接的对话框(可能需要等几秒),可以直接点击添加设备
即可完成添加并建立连接(如果没有弹出建立连接的对话框,或者不小心关了,可以用同样的方法手动添加设备)
添加文件夹
添加完设备后,接下来就可以添加用于同步的目录,点击首页的添加文件夹
,弹出对话框
我们需要在常规菜单中指定文件夹标签、文件夹ID和文件夹路径,其中文件夹ID和是唯一标识符,文件夹标签可以随意指定,文件夹路径要指定需同步目录的路径(如果用的是Docker容器,要确保已经将宿主机目录映射到了容器内,路径为容器内部路径)
然后在共享
菜单中选择要将目录内容共享的设备
文件版本控制
菜单主要是涉及文件删除或更替时的行为,默认的无文件版本控制表示不保留文件的旧副本,不同选项的含义可以自行到文档中查看,根据自己的需要设置
忽略模式
是当存在某些文件不应与其他设备同步时设置,可以自行根据文档设置
高级
菜单中可以根据自己的情况设定,例如我要用于目录备份的话,则只需要设置一台设备发送,另一台设备接收即可,就需要根据情况修改菜单中的文件夹类型
遇到的问题
在从Linux向Windows备份文件的时候发现,由于Linux文件系统的文件名大小写敏感而Windows文件系统大小写不敏感,导致Linux系统同一目录下的hello.txt
和Hello.txt
在向Windows系统传输时发生错误(两个文件名在Windows中被视为同一文件),因此需要修改Windows系统的大小写敏感属性,修改方法可参考另一篇文章