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