搭建Syncthing项目进行同步与备份

Syncthing是一款可以实现多端文件同步的项目

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进行部署,确保已经安装了dockerdocker-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=0PGID=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设备名共享高级菜单可以暂时不用管

image.png

其中设备ID是每台设备部署好Syncthing服务后自动生成的唯一标识符,可以点击右上角操作 - 显示ID找到,设备名可以随便起一个别名即可

image.png

添加完设备点击保存后,在远程设备的GUI界面会弹出一个申请建立设备连接的对话框(可能需要等几秒),可以直接点击添加设备即可完成添加并建立连接(如果没有弹出建立连接的对话框,或者不小心关了,可以用同样的方法手动添加设备)

image.png

添加文件夹


添加完设备后,接下来就可以添加用于同步的目录,点击首页的添加文件夹,弹出对话框

image.png

我们需要在常规菜单中指定文件夹标签文件夹ID文件夹路径,其中文件夹ID和是唯一标识符,文件夹标签可以随意指定,文件夹路径要指定需同步目录的路径(如果用的是Docker容器,要确保已经将宿主机目录映射到了容器内,路径为容器内部路径)

然后在共享菜单中选择要将目录内容共享的设备

image.png

文件版本控制菜单主要是涉及文件删除或更替时的行为,默认的无文件版本控制表示不保留文件的旧副本,不同选项的含义可以自行到文档中查看,根据自己的需要设置

image.png

忽略模式是当存在某些文件不应与其他设备同步时设置,可以自行根据文档设置

image.png

高级菜单中可以根据自己的情况设定,例如我要用于目录备份的话,则只需要设置一台设备发送,另一台设备接收即可,就需要根据情况修改菜单中的文件夹类型

image.png

遇到的问题


在从Linux向Windows备份文件的时候发现,由于Linux文件系统的文件名大小写敏感而Windows文件系统大小写不敏感,导致Linux系统同一目录下的hello.txtHello.txt在向Windows系统传输时发生错误(两个文件名在Windows中被视为同一文件),因此需要修改Windows系统的大小写敏感属性,修改方法可参考另一篇文章

转载请注明出处喔!( •̀ ω •́ )✧
发表了43篇文章 · 总计78.96k字
·
Built with Hugo
主题 StackJimmy 设计