使用 rclone 连接 WebDAV 并提供 Web Api 给 nginx
最近调整了 Steem 区块数据的备份服务,使用了新的服务商 Hetzner。
由于 Hetzner 提供了多种上传下载数据的方式,我测试了 rsync,samba,webdav,目前决定使用 webdav,通过牛逼的 rclone 工具。
这篇文章记录下相关的配置。
首先需要安装 rclone,安装方法在官网有 https://rclone.org/install/。
配置 rclone 也很简单,安装后执行 rclone config
,按照提示,创建新的连接,输入连接名(比如 hetzner),选择连接方式为 WebDAV
,输入 URL、用户名、密码完成配置。
使用 rclone ls [连接名]:[目录名]
命令,检查一下是否配置成功。
1 | [root@steem ~]# rclone ls hetzner:steem |
执行成功。
现在把本地备份服务器和远端的 https://files.steem.fans 服务器上都配置好 rclone。
本地备份服务器的备份脚本,涉及上传删除的指令都换成 rclone copy
和 rclone delete
。
远端服务器之前是 nginx 做 autoindex,并以 json 格式显示目录文件结构:
1 | location /data { |
现在换成 rclone 了,rclone 可以用挂载的方式继续使用 nginx 的 autoindex。
不过这里有一个问题,就是我的 nginx 是 docker 方式运行的,rclone 挂载目录后,还需要再挂载进 docker 容器。而每次 rclone 重启,都需要再重启一遍 nginx 容器。这就很糟糕了。
研究了下 rclone 的文档,发现可以使用 rclone serve web
启动一个 Web 服务器来显示 Hetzner 服务器目录,不过不支持 json 格式显示结果。幸好有个参数可以自定义模板。于是我自己写了个模板,
1 | [{{$length := len .Entries}}{{- range $i, $entry := .Entries}}{{- if $entry.IsDir}}{{if ne $i 0}},{{end}}{ "name":"{{html $entry.Leaf}}", "type":"directory", "mtime":"{{$entry.ModTime.Format "Jan 02, 2006 15:04:05 UTC"}}", "size":{{$entry.Size}}}{{- else}}{{if ne $i 0}},{{end}}{ "name":"{{html $entry.Leaf}}", "type":"file", "mtime":"{{$entry.ModTime.Format "Jan 02, 2006 15:04:05 UTC"}}", "size":{{$entry.Size}}}{{- end}}{{- end}}] |
然后安装 supervisor 来管理 rclone serve
服务,
1 | [program:rclone_hetzner] |
最后,修改 nginx 配置文件,
1 | location ~ ^/data(/?)(.*) { |
访问测试下 https://files.steem.fans/data,成功。
目前总体迁移工作完成了大部分了,还得需要再等最后的数据replay结束。