使用GOFS实现文件同步功能

在多个设备之间文件通过网络进行同步和备份, 这是一个基本需求. 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来实现文件的同步.

拉取文件

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自动同步一次. 我认为这种定时任务可能是最适合轻量级用户的做法

推送文件

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确保传输

go run /usr/local/go/src/crypto/tls/generate_cert.go --host 127.0.0.1 

GOROOT默认为/usr/local/go

如果使用局域网IP, 需要使用局域网IP设置--host

会在当前目录下生成

2025/04/14 23:43:28 wrote cert.pem
2025/04/14 23:43:28 wrote key.pem

启动文件服务器

# 启动一个Web文件服务器并随机创建3个用户
# 在生产环境中请将`tls_cert_file`和`tls_key_file`命令行参数替换为正式的证书和密钥文件
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少一个换行符都不行, 很麻烦

来源链接:https://www.cnblogs.com/xuhe2/p/18825634

请登录后发表评论

    没有回复内容