找回密码
 立即注册
首页 业界区 安全 使用GOFS实现文件同步功能

使用GOFS实现文件同步功能

珠尿娜 前天 00:13
在多个设备之间文件通过网络进行同步和备份, 这是一个基本需求. gofs开源项目会是一个命令行文件同步工具的优质选择.
如果你需要一个带有图形界面的工具, 那么我想syncthing才是最好的选择.
gofs项目介绍

基于Golang开发的一款开箱即用的跨平台实时文件同步工具.
具体内容参考gofs 官方README
安装

GO安装

使用go install github.com/no-src/gofs/...@latest安装
注意, Go的版本必须是1.23+
在windows系统中需要使用go install -ldflags="-H windowsgui" github.com/no-src/gofs/...@latest编译gofs可执行文件.
docker

官方README提供了Docker的在线构建容器镜像和直接拉去现成容器镜像的方法.
快速上手

通过SFTP协议

SFTP协议自带加密和文件传输功能, gofs可以通过sftp来实现文件的同步.
拉取文件
  1. gofs -source="sftp://127.0.0.1:22?remote_path=/gofs_sftp_server&ssh_user=sftp_user&ssh_pass=sftp_pwd" -dest="./dest" -sync_once
复制代码
不能监听并且同步文件, 只能使用-sync_once执行单次文件同步, 远程的修改无法被监听. 所以, 本质就类似于文件传输脚本一样, 缺乏了自动监听和同步的机制.
每隔一段时间自动执行可以使用-sync_cron="*/30 * * * * *"每隔30S自动同步一次. 我认为这种定时任务可能是最适合轻量级用户的做法
推送文件
  1. gofs -source="/tmp/gofs-dest/" -dest="sftp://10.106.74.224:2022?remote_path=/tmp/gofs-source&ssh_user=xxx&ssh_pass=xxx"
复制代码
因为是从本地推送文件到远端, 所以是可以实现监听的功能, 当文件修改的时候自动推送修改后的文件.
通过gofs提供的server服务

gofs程序提供了文件服务功能, 同时可以作为client和server工作.
生成TLS证书

gofs确保传输
  1. go run /usr/local/go/src/crypto/tls/generate_cert.go --host 127.0.0.1
复制代码
GOROOT默认为/usr/local/go
如果使用局域网IP, 需要使用局域网IP设置--host
会在当前目录下生成
  1. 2025/04/14 23:43:28 wrote cert.pem
  2. 2025/04/14 23:43:28 wrote key.pem
复制代码
启动文件服务器
  1. # 启动一个Web文件服务器并随机创建3个用户
  2. # 在生产环境中请将`tls_cert_file`和`tls_key_file`命令行参数替换为正式的证书和密钥文件
  3. gofs -source=./source -dest=./dest -server -tls_cert_file=cert.pem -tls_key_file=key.pem -rand_user_count=3
复制代码

  • 设置rand_user_count命令行参数来随机生成指定数量的用户或者通过users命令行参数自定义用户信息来保证数据的访问安全, 禁止用户匿名访问数据; 如果rand_user_count命令行参数设置大于0,则随机生成的账户密码将会打印到日志信息中,请注意查看
  • Web文件服务器默认使用HTTPS协议,使用tls_cert_file和tls_key_file命令行参数来指定相关的证书和密钥文件
  • 可以通过tls_insecure_skip_verify命令行参数来控制客户端是否跳过验证服务器的证书链和主机名, 默认为true
  • 可以使用server_addr命令行参数来自定义服务器运行端口,例如-server_addr=":443", 可以用来解决443端口不可用的问题
  • 它会在传输的目录下生成logs目录存放日志内容, 简直就是shit. 使用-log_file=false可以防止它生成这些内容, 也可以通过log_dir参数修改生成的log文件的目录.
文件推送和接受

很多时候, 我们只需要一个推送文件, 一个同步文件. 不需要负责的功能, 所以, 直接建立一个文件推送服务和一个文件接受服务即可.

  • 文件同步的行为是单向的.

  • 启动文件推送服务
  1. gofs -source="rs://10.11.144.196:8105?mode=server&local_sync_disabled=true&path=./source&fs_server=https://10.11.144.196:7878" -dest=./dest -users="gofs|password|r" -tls_cert_file=$HOME/tmp/config/cert.pem -tls_key_file=$HOME/tmp/config/key.pem -token_secret=mysecret_16bytes -server_addr=":7878" -log_file=false
复制代码

  • 你需要严格确保127.0.0.1替换为了你需要的IP地址, 才可以确保正确同步文件.
  • 可以使用server_addr命令行参数来自定义服务器运行端口,例如-server_addr=":443", 可以用来解决443端口不可用的问题. 注意, 在&fs_server=https://10.11.144.196:7878这个地方也需要配置.
  • 使用-log_file=false可以防止它生成这些内容, 也可以通过log_dir参数修改生成的log文件的目录.

  • 文件接受
  1. gofs -source="rs://10.11.144.196:8105" -dest=/home/xuhe/tmp/go/gofs-dest -users="gofs|password" -tls_cert_file=/tmp/cert.pem --log_file=false -server_addr=":7878"
复制代码

  • 设置source为需要的IP, 并且设置-server_addr=":7878"作为443无法访问的时候的替代操作.
  • -server_addr=":7878"设置HTTPS服务端口
cert.pem少一个换行符都不行, 很麻烦

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册