七叶笔记 » golang编程 » gofs使用教程-基于golang的开源跨平台文件同步工具

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

概述

gofs 是基于golang开发的一款开箱即用的跨平台文件同步工具,支持在本地磁盘之间同步、从远程服务器同步变更到本地、将本地文件变更推送到远程服务器三种模式。开源地址如下: github.com/no-src/gofs ,欢迎Star或者提交Issue和PR,共同进步!

安装

首先需要确保已经安装了Go ( 版本必须是1.18+ ),然后你就可以使用下面的命令来安装 gofs

如果你不需要自行从源码编译安装,也可以直接下载最新发布的二进制文件Release

 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.pem  key.pem  source  dest  

本地磁盘

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

你可以使用 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文件服务器

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

Web文件服务器默认使用HTTPS协议,使用 tls_cert_file tls_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=#34; -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=#34; -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文件服务器地址,例如
  • local_sync_disabled 是否将远程磁盘服务端的文件变更同步到远程本地的目标目录,可选值为 true false ,默认值为 false

示例

远程磁盘服务端模式下的示例

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

管理接口

基于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访问地址如下:

   

配置接口

读取应用程序配置,默认返回 json 格式,当前支持 json yaml 格式

   

或者使用 format 参数来指定返回的配置格式

   

报告接口

使用 report 命令行参数来启用报告接口的路由并且开始收集报告数据,需要先启用 manage 命令行参数

报告接口详情参见Report API

   

日志

默认情况下会启用文件日志与控制台日志,你可以将 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  

使用配置文件

如果需要的话,你可以使用配置文件来代替所有的命令行参数,当前支持 json yaml 格式

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

 $ gofs -conf=./gofs.yaml  

更多信息

帮助信息

 $ gofs -h  

版本信息

 $ gofs -v  

关于信息

 $ gofs -about  

相关文章