gofs使用教程-基于golang的开源跨平台文件同步工具

概述 gofs是基于golang开发的一款开箱即用的跨平台文件同步工具,开源地址如下:https://github.com/no-src/gofs,欢迎点个Star或者提交Issue和PR,共同进步!
安装 首先需要确保已经安装了Go (版本必须是1.18+),然后你就可以使用下面的命令来安装gofs
如果你不需要自行从源码编译安装,也可以直接下载最新发布的二进制文件

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

在Docker中运行
如果你想要在docker中运行,请在安装或者编译的时候使用-tags netgo命令行参数或者设置环境变量CGO_ENABLED=0,否则当你运行docker容器时可能会报找不到gofs的错误
go install -tags netgo github.com/no-src/gofs/...@latest

后台运行
在windows系统中,你可以使用下面的命令构建一个在后台运行的不带命令行界面的程序
go install -ldflags="-H windowsgui" github.com/no-src/gofs/...@latest

移除Web文件服务器
如果你不需要一个Web文件服务器,可以使用下面命令构建一个体积更小的不带Web文件服务器的程序
go install -tags "no_server" 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.pemkey.pemsourcedest

本地磁盘
监控本地源目录将变更同步到目标目录
你可以使用logically_delete命令行参数来启用逻辑删除,从而避免误删数据
$ gofs -source=./source -dest=./dest

全量同步
执行一次全量同步,直接将整个源目录同步到目标目录
$ 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文件服务器
【gofs使用教程-基于golang的开源跨平台文件同步工具】启动一个Web文件服务器用于访问远程的源目录和目标目录
Web文件服务器默认使用HTTPS协议,使用tls_cert_filetls_key_file命令行参数来指定相关的证书和密钥文件
如果你不需要使用TLS进行安全通讯,可以通过将tls命令行参数指定为false来禁用它
如果将tls设置为true,则服务器默认运行端口为443,反之默认端口为80,你可以使用server_addr命令行参数来自定义服务器运行端口,例如-server_addr=":443"
出于安全考虑,你应该设置rand_user_count命令行参数来随机生成指定数量的用户或者通过users命令行参数自定义用户信息来保证数据的访问安全,禁止用户匿名访问数据
如果rand_user_count命令行参数设置大于0,则随机生成的账户密码将会打印到日志信息中,请注意查看
如果你需要启用gzip压缩响应结果,则添加server_compress命令行参数,但是目前gzip压缩不是很快,在局域网中可能会影响传输效率
# 启动一个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

远程磁盘服务端
启动一个远程磁盘服务端作为一个远程文件数据源
source命令行参数详见远程磁盘服务端数据源协议
注意远程磁盘服务端的用户至少要拥有读权限,例如:-users="gofs|password|r"
# 启动一个远程磁盘服务端 # 在生产环境中请将`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命令行参数,可以定时将远程磁盘服务端的文件整个全量同步到本地目标目录,就跟定时同步一样
source命令行参数详见远程磁盘服务端数据源协议
# 启动一个远程磁盘客户端 # 请将`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_size命令行参数来设置大文件上传时切分的区块大小,默认值为1048576,即1MB
更多命令行参数用法请参见远程磁盘客户端
# 启动一个远程推送客户端并且启用本地磁盘同步,将source目录下的文件变更同步到本地dest目录和远程推送服务器上 # 请将`users`命令行参数替换为上面设置的实际账户名密码 $ gofs -source="./source" -dest="rs://127.0.0.1:8105?local_sync_disabled=false&path=./dest" -users="gofs|password"

远程磁盘服务端数据源协议
远程磁盘服务端数据源协议基于URI基本语法,详见RFC 3986
方案 方案名称为rs
主机名 远程磁盘服务端数据源在远程磁盘服务端模式下使用0.0.0.0或者其他本地网卡IP地址作为主机名,在远程磁盘客户端
模式下使用远程磁盘服务端的IP地址或者域名作为主机名
端口号 远程磁盘服务端数据源端口号,默认为8105
参数 仅在远程磁盘服务端模式下设置以下参数
  • path 远程磁盘服务端真实的本地源目录
  • mode 指定运行模式,只有在远程磁盘服务端模式下需要手动指定为server,默认为远程磁盘客户端模式
  • fs_server Web文件服务器地址,例如https://127.0.0.1
  • local_sync_disabled 是否将远程磁盘服务端的文件变更同步到远程本地的目标目录,可选值为truefalse,默认值为false
示例 远程磁盘服务端模式下的示例
rs://127.0.0.1:8105?mode=server&local_sync_disabled=true&path=./source&fs_server=https://127.0.0.1 \_/\_______/ \__/ \____________________________________________________________________________/ |||| 方案主机名端口号参数

管理接口
基于Web文件服务器的应用管理接口
默认情况下,仅允许私有地址和回环地址访问管理接口的相关路由
你可以通过将manage_private命令行参数设置为false来禁用默认行为,允许公网IP访问管理接口的路由
$ 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/

配置接口 读取应用程序配置,默认返回json格式,当前支持jsonyaml格式
https://127.0.0.1/manage/config

或者使用format参数来指定返回的配置格式
https://127.0.0.1/manage/config?format=yaml

报告接口 使用report命令行参数来启用报告接口的路由并且开始收集报告数据,需要先启用manage命令行参数
报告接口详情参见Report API
https://127.0.0.1/manage/report

日志
默认情况下会启用文件日志与控制台日志,你可以将log_file命令行参数设置为false来禁用文件日志
使用log_level命令行参数设置日志的等级,默认级别是INFO,可选项为:DEBUG=0 INFO=1 WARN=2 ERROR=3
使用log_dir命令行参数来设置日志文件目录,默认为./logs/
使用log_flush命令行参数来设置自动刷新日志到文件中,默认启用
使用log_flush_interval命令行参数设置自动刷新日志到文件中的频率,默认为3s
使用log_event命令行参数启用事件日志,所有事件都会记录到文件中,默认为禁用
# 在"本地磁盘"模式下设置日志信息 $ 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

更多信息 帮助信息
$ gofs -h

版本信息
$ gofs -v

关于信息
$ gofs -about

    推荐阅读