gofs是基于golang开发的一款开箱即用的跨平台文件同步工具

安装

gofs
go install github.com/no-src/gofs/...@latest

在Docker中运行

cd
$ ./scripts/build-docker.sh

或者使用以下命令直接从DockerHub中拉取docker镜像

$ docker pull nosrc/gofs

更多关于发布与docker的脚本参见scripts目录

后台运行

在windows系统中,你可以使用下面的命令构建一个在后台运行的不带命令行界面的程序

go install -ldflags="-H windowsgui" github.com/no-src/gofs/...@latest

快速开始

先决条件

请确保文件同步的源目录和目标目录都已经存在,如果目录不存在,则用你实际的目录替换下面的路径进行提前创建

$ mkdir source dest

生成仅用于测试的证书和密钥文件,生产中请替换为正式的证书

TLS证书和密钥文件仅用于与Web文件服务器和远程磁盘服务端进行安全通讯

$ go run $GOROOT/src/crypto/tls/generate_cert.go --host 127.0.0.1
2021/12/30 17:21:54 wrote cert.pem
2021/12/30 17:21:54 wrote key.pem

查看你的工作目录

$ ls
cert.pem  key.pem  source  dest

使用方法

在磁盘之间同步

使用本地磁盘在磁盘之间同步文件

+----------+                             +----------+                          +----------+
|          |<---(A)-- monitor disk   ----+          |                          |          |
|  DiskA   |                             |  Client  |                          |  DiskB   |
|          |----(B)--- notify change --->|          |                          |          |
|          |                             |          |                          |          |
|          |<---(C)--- read file     ----|          |                          |          |
|          |                             |          |                          |          |
|          |----(D)--- return file   --->|          |----(E)--- write file --->|          |
|          |                             |          |                          |          |
+----------+                             +----------+                          +----------+

从服务器端同步

使用远程磁盘服务端和远程磁盘客户端从服务端同步文件

+----------+                             +----------+                           +----------+                          +----------+
|          |<---(A)-- monitor disk   ----+          |                           |          |                          |          |
|  Server  |                             |  Server  |                           |  Client  |                          |  Client  |
|  Disk    |----(B)--- notify change --->|          |----(C)--notify change --->|          |                          |  Disk    |
|          |                             |          |                           |          |                          |          |
|          |<---(E)--- read file     ----|          |<---(D)-- pull file    ----|          |                          |          |
|          |                             |          |                           |          |                          |          |
|          |----(F)--- return file   --->|          |----(G)--- send file   --->|          |----(H)--- write file --->|          |
|          |                             |          |                           |          |                          |          |
+----------+                             +----------+                           +----------+                          +----------+

同步到服务器端

使用远程推送服务端和远程推送客户端同步文件到服务端

+----------+                             +----------+                         +----------+                          +----------+
|          |<---(A)--- monitor disk  ----+          |                         |          |                          |          |
|  Client  |                             |  Client  |                         |  Server  |                          |  Server  |
|  Disk    |----(B)--- notify change --->|          |                         |          |                          |  Disk    |
|          |                             |          |                         |          |                          |          |
|          |<---(C)--- read file     ----|          |                         |          |                          |          |
|          |                             |          |                         |          |                          |          |
|          |----(D)--- return file   --->|          |----(E)--- push file --->|          |----(F)--- write file --->|          |
|          |                             |          |                         |          |                          |          |
+----------+                             +----------+                         +----------+                          +----------+

从SFTP服务器上同步

使用SFTP拉取客户端从SFTP服务器上同步文件

+----------+                             +----------+                         +----------+                          +----------+
|          |<---(A)--- monitor disk  ----+          |                         |          |                          |          |
|  Client  |                             |  Client  |                         |  SFTP    |                          |  SFTP    |
|  Disk    |----(B)--- notify change --->|          |                         |  Server  |                          |  Server  |
|          |                             |          |                         |          |                          |  Disk    |
|          |<---(C)--- read file     ----|          |                         |          |                          |          |
|          |                             |          |                         |          |                          |          |
|          |----(D)--- return file   --->|          |----(E)--- push file --->|          |----(F)--- write file --->|          |
|          |                             |          |                         |          |                          |          |
+----------+                             +----------+                         +----------+                          +----------+

同步到SFTP服务器

使用SFTP推送客户端同步文件到SFTP服务器

+----------+                          +----------+                         +----------+                           +----------+
|          |                          |          +----(A)--- pull file --->|          |----(B)--- read file   --->|          |
|  Client  |                          |  Client  |                         |  SFTP    |                           |  SFTP    |
|  Disk    |<---(E)--- write file ----|          |<---(D)--- send file ----|  Server  |<---(C)--- return file ----|  Server  |
|          |                          |          |                         |          |                           |  Disk    |
|          |                          |          |                         |          |                           |          |
|          |                          |          |                         |          |                           |          |
|          |                          |          |                         |          |                           |          |
|          |                          |          |                         |          |                           |          |
+----------+                          +----------+                         +----------+                           +----------+

从MinIO服务器上同步

使用MinIO拉取客户端从MinIO服务器上同步文件

+----------+                             +----------+                         +----------+                          +----------+
|          |<---(A)--- monitor disk  ----+          |                         |          |                          |          |
|  Client  |                             |  Client  |                         |  MinIO   |                          |  MinIO   |
|  Disk    |----(B)--- notify change --->|          |                         |  Server  |                          |  Server  |
|          |                             |          |                         |          |                          |  Disk    |
|          |<---(C)--- read file     ----|          |                         |          |                          |          |
|          |                             |          |                         |          |                          |          |
|          |----(D)--- return file   --->|          |----(E)--- push file --->|          |----(F)--- write file --->|          |
|          |                             |          |                         |          |                          |          |
+----------+                             +----------+                         +----------+                          +----------+

同步到MinIO服务器

使用MinIO推送客户端同步文件到MinIO服务器

+----------+                          +----------+                         +----------+                           +----------+
|          |                          |          +----(A)--- pull file --->|          |----(B)--- read file   --->|          |
|  Client  |                          |  Client  |                         |  MinIO   |                           |  MinIO   |
|  Disk    |<---(E)--- write file ----|          |<---(D)--- send file ----|  Server  |<---(C)--- return file ----|  Server  |
|          |                          |          |                         |          |                           |  Disk    |
|          |                          |          |                         |          |                           |          |
|          |                          |          |                         |          |                           |          |
|          |                          |          |                         |          |                           |          |
|          |                          |          |                         |          |                           |          |
+----------+                          +----------+                         +----------+                           +----------+

核心功能

本地磁盘

监控本地源目录将变更同步到目标目录

logically_delete
checkpoint_countcheckpoint_count=1010+2chunk_sizecheckpoint_countchunk_sizechunk_sizecheckpoint_count0
force_checksum
md5checksum_algorithmmd5sha1sha256sha512crc32crc64adler32fnv-1-32fnv-1a-32fnv-1-64fnv-1a-64fnv-1-128fnv-1a-128
sync_delaysync_delay_eventssync_delay_time
progress
$ gofs -source=./source -dest=./dest

加密

encryptencrypt_path
$ gofs -source=./source -dest=./dest -encrypt -encrypt_path=./source/encrypt -encrypt_secret=mysecret

解密

decrypt
$ gofs -decrypt -decrypt_path=./dest/encrypt -decrypt_secret=mysecret -decrypt_out=./decrypt_out

全量同步

执行一次全量同步,直接将整个源目录同步到目标目录

$ gofs -source=./source -dest=./dest -sync_once

定时同步

定时执行全量同步,将整个源目录同步到目标目录

# 每30秒钟将源目录全量同步到目标目录
$ gofs -source=./source -dest=./dest -sync_cron="*/30 * * * * *"

守护进程模式

启动守护进程来创建一个工作进程处理实际的任务,并将相关进程的pid信息记录到pid文件中

$ gofs -source=./source -dest=./dest -daemon -daemon_pid

Web文件服务器

启动一个Web文件服务器用于访问远程的源目录和目标目录

tls_cert_filetls_key_file
tlsfalse
tlstrue44380server_addr-server_addr=":443"
tlstls_insecure_skip_verifytrue
rand_user_countusers
rand_user_count
server_compress
session_connectionredis://127.0.0.1:6379?password=redis_password&db=10&max_idle=10&secret=redis_secret
# 启动一个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

远程磁盘服务端

启动一个远程磁盘服务端作为一个远程文件数据源

-users="gofs|password|r"
checkpoint_countsync_delay
# 启动一个远程磁盘服务端
# 在生产环境中请将`tls_cert_file`和`tls_key_file`命令行参数替换为正式的证书和密钥文件
# 为了安全起见,请使用复杂的账户密码来设置`users`命令行参数
$ gofs -source="rs://127.0.0.1:8105?mode=server&local_sync_disabled=true&path=./source&fs_server=https://127.0.0.1" -dest=./dest -users="gofs|password|r" -tls_cert_file=cert.pem -tls_key_file=key.pem

远程磁盘客户端

启动一个远程磁盘客户端将远程磁盘服务端的文件变更同步到本地目标目录

sync_once
sync_cron
force_checksum
sync_delay
# 启动一个远程磁盘客户端
# 请将`users`命令行参数替换为上面设置的实际账户名密码
$ gofs -source="rs://127.0.0.1:8105" -dest=./dest -users="gofs|password"

远程推送服务端

push_server
-users="gofs|password|rw"
# 启动一个远程磁盘服务端并启用远程推送服务端
# 在生产环境中请将`tls_cert_file`和`tls_key_file`命令行参数替换为正式的证书和密钥文件
# 为了安全起见,请使用复杂的账户密码来设置`users`命令行参数
$ gofs -source="rs://127.0.0.1:8105?mode=server&local_sync_disabled=true&path=./source&fs_server=https://127.0.0.1" -dest=./dest -users="gofs|password|rw" -tls_cert_file=cert.pem -tls_key_file=key.pem -push_server

远程推送客户端

启动一个远程推送客户端将本地文件变更同步到远程推送服务端

chunk_size10485761MB
checkpoint_countsync_delay

更多命令行参数用法请参见远程磁盘客户端

# 启动一个远程推送客户端并且启用本地磁盘同步,将source目录下的文件变更同步到本地dest目录和远程推送服务器上
# 请将`users`命令行参数替换为上面设置的实际账户名密码
$ gofs -source="./source" -dest="rs://127.0.0.1:8105?local_sync_disabled=false&path=./dest" -users="gofs|password"

SFTP推送客户端

启动一个SFTP推送客户端,将发生变更的文件同步到SFTP服务器

$ gofs -source="./source" -dest="sftp://127.0.0.1:22?local_sync_disabled=false&path=./dest&remote_path=/gofs_sftp_server" -users="sftp_user|sftp_pwd"

SFTP拉取客户端

启动一个SFTP拉取客户端,将文件从SFTP服务器拉到本地目标路径

$ gofs -source="sftp://127.0.0.1:22?remote_path=/gofs_sftp_server" -dest="./dest" -users="sftp_user|sftp_pwd" -sync_once

MinIO推送客户端

启动一个MinIO推送客户端,将发生变更的文件同步到MinIO服务器

$ gofs -source="./source" -dest="minio://127.0.0.1:9000?secure=false&local_sync_disabled=false&path=./dest&remote_path=minio-bucket" -users="minio_user|minio_pwd"

MinIO拉取客户端

启动一个MinIO拉取客户端,将文件从MinIO服务器拉到本地目标路径

$ gofs -source="minio://127.0.0.1:9000?secure=false&remote_path=minio-bucket" -dest="./dest" -users="minio_user|minio_pwd" -sync_once

中继

如果你需要在两个无法直接相连的设备之间同步文件,可以使用反向代理作为中继服务器来实现,详情参见中继模式

远程磁盘服务端数据源协议

远程磁盘服务端数据源协议基于URI基本语法,详见RFC 3986

方案

rs

主机名

0.0.0.0

端口号

8105

参数

仅在远程磁盘服务端模式下设置以下参数

示例

 rs://127.0.0.1:8105?mode=server&local_sync_disabled=true&path=./source&fs_server=https://127.0.0.1
 \_/  \_______/ \__/ \____________________________________________________________________________/
  |       |       |                                      |
 方案   主机名   端口号                                    参数

管理接口

基于Web文件服务器的应用管理接口

默认情况下,仅允许私有地址和回环地址访问管理接口的相关路由

manage_privatefalse
$ gofs -source=./source -dest=./dest -server -tls_cert_file=cert.pem -tls_key_file=key.pem -rand_user_count=3 -manage

性能分析接口

pprof访问地址如下:

https://127.0.0.1/manage/pprof/

配置接口

jsonjsonyaml
https://127.0.0.1/manage/config
format
https://127.0.0.1/manage/config?format=yaml

报告接口

reportmanage

报告接口详情参见Report API

https://127.0.0.1/manage/report

日志

log_filefalse
log_levelINFODEBUG=0INFO=1WARN=2ERROR=3
log_dir./logs/
log_flush
log_flush_interval3s
log_event
log_sample_rate1
log_formattextjsontext
log_split_date
# 在"本地磁盘"模式下设置日志信息
$ gofs -source=./source -dest=./dest -log_file -log_level=0 -log_dir="./logs/" -log_flush -log_flush_interval=3s -log_event

使用配置文件

jsonyaml

所有的配置字段名称跟命令行参数一样,你可以参考配置示例或者配置接口的响应结果

$ gofs -conf=./gofs.yaml

校验和

checksum
chunk_sizecheckpoint_countcheckpoint_count
$ gofs -source=./gofs -checksum

更多信息

帮助信息

$ gofs -h

版本信息

$ gofs -v

关于信息

$ gofs -about