前言
现在很多插件和软件都支持使用WebDAV的方法来备份用户个人设置,所以尝试在主机上使用 docker compose 部署 rclone 让他充当一个“协议网关”,将通过 WebDAV 传输的内容写入到 mega 当中。
生成conf配置文件
这里我并没有直接使用 mega 的网盘,因为我开启了2FA的设置,保存2FA信息既不方便也不安全。所以这里我选择使用 s3 协议来进行传输。因为docker上没有交互界面,为了在主机上能够使用conf文件,我们需要先在其他地方生成conf文件,可以在主机上,也可以在你自己的电脑上。这里我是直接在自己的Windows电脑上操作的。前往rclone官网下载跟你系统相配的版本。解压随便找个地方放一下,用完我们就可以删除掉了。mega这里我们使用s4(兼容s3)的协议连接。打开cmd,输入命令:
rclone config
# 没配置环境变量就是
你的路径\rclone.exe config
初次会提示没有找到 remote ,选择 n新建
选择 storage 方式,输入s3
选择 provider ,输入Mega
输入 env_auth ,直接回车,因为我们不使用亚马逊的服务
输入 access_key_id,mega的设置
输入 secret_access_key,mega的设置
选择节点 endpoint ,根据你自己的需求
edit advanced config? ,n
q,退出
配置文件会被存储在:
C:\\Users\\用户名\\AppData\\Roaming\\rclone\\rclone.conf
将这个文件保存下来。
其实你也可以复制粘贴下面这个示例配置,但是我不敢保证以后官方会对conf文件做任何的修改,除了 key 你要自己填写外,节点也推荐你进行一下测速,看一下你的主机连接哪里的节点速度最好最稳定。我这里使用的是蒙特利尔的节点。注意这里的megas4这个名字,这个 remote 名我们后面会用到。
[megas4]
type = s3
provider = Mega
access_key_id = 填写你mega上的
secret_access_key = 填写你mega上的
endpoint = s3.ca-central-1.s4.mega.io
docker compose文件编写
services:
rclone:
image: rclone/rclone:latest
container_name: rclone-mega-webdav
restart: unless-stopped
# Rclone 启动命令:
# serve webdav: 启动 WebDAV 服务
# mega: 指定要服务的远程配置名,与 rclone.conf 中的 [mega] 对应
# --addr :5572: 在容器的 5572 端口上监听
# --user webdav_user: 设置 WebDAV 的登录用户名 (请修改)
# --pass your_strong_password: 设置 WebDAV 的登录密码 (请修改)
# -v: 显示详细日志
command: >
serve webdav megas4:rclone
--addr :5572
--user 设定用户名
--pass 设定高强度密码
--vfs-cache-max-size 8G
--log-level NOTICE
--dir-cache-time 48h
--vfs-cache-mode writes
--cache-dir /cache
ports:
# 关键:将容器的5572端口映射到宿主机的127.0.0.1:5572
# 这确保了该端口只能被宿主机本地访问(比如Nginx),而不会暴露到公网。
- "127.0.0.1:5572:5572"
volumes:
# 将我们预先生成的配置文件挂载到容器中,设置为只读(ro)更安全
- ./rclone.conf:/config/rclone/rclone.conf:ro
# 创建一个命名卷用于可能的数据缓存或其他用途,保持数据持久化
- rclone_data:/config/rclone/data
- rclone_cache:/cache
environment:
# 设置时区
- TZ=Asia/Shanghai
volumes:
rclone_data:
rclone_cache:
这里的内容请根据自己的情况来修改,我只能提供一个大概。具体参数讲解一下:
command:
serve webdav megas4:rclone:开启webdav,这里的megas4就是上面conf文件里面的 remote 名,冒号必须要有,表示根目录,后面的名称可有可无。如果写了具体的名称,比如现在这样megas4:rclone,就表示将所有内容放在名称为rclone的桶中。如果没有写具体的名称,比如megas4:则代表将内容直接放在根目录下,这样的话创建出来的根目录下的每个文件夹都会成为一个桶。因为对于 mega 来说使用对象存储,就是在云盘里面的S4 Object storage这个文件夹内进行操作,这个文件夹内的第一层目录的每个文件夹都是一个桶。
--addr :5572:设置端口5572
--vfs-cache-mode writes:这个是缓存模式,在writes模式下,当你通过 WebDAV 读取文件时,Rclone 会直接从 mega 服务器流式传输数据给你,不会将文件缓存到本地缓存盘。当写入文件时:Rclone 会现将文件完整的存放在本地缓存盘,上传成功后再将其删除,确保上传功能的稳定和快速。
--vfs-cache-mode full:这个缓存模式与上面的互斥,二选一。在full模式下,读取文件和上传文件 Rclone 都会将其先缓存在主机的本地磁盘,这样可以获得更好的体验,尤其是流媒体播放。但是对硬盘的性能和空间要求极高。这里我并没有使用这种方式,所以我后面的配置也都不是按照full模式配置的。
--vfs-cache-max-size 8G:设置缓存最大存储空间为8G,要是使用full模式建议提供更大的空间,否则在流媒体等大型文件(>8G)的时候 Rclone 会高速度删除和下载内容,反而更加影响体验。
--dir-cache-time 48h :设置缓存时间
--cache-dir /cache :设置缓存的目录
ports:
"127.0.0.1:5572:5572":因为我要使用Nginx反代,所以我直接将映射端口限制在了本地,如果你需要使用端口访问的话,改成5572:5572。
volumes:
- ./rclone.conf:/config/rclone/rclone.conf:ro:将我们之前得到的配置文件挂载进去,这里我将配置文件放在了和 compose 文件同目录下
使用Nginx设置反代
server {
listen 80;
listen [::]:80;
server_name xxx.xxx.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name xxx.xxx.com;
# 证书路径保持不变,因为你用的是通配符证书
ssl_certificate /etc/letsencrypt/live/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE+AESGCM:ECDHE+CHACHA20:DHE+AESGCM:DHE+CHACHA20:!aNULL:!MD5:!DSS;
# 超时设置(针对 WebDAV 操作优化,增加超时时间)
proxy_connect_timeout 120s;
proxy_send_timeout 600s;
proxy_read_timeout 600s;
location / {
# 代理到 rclone 容器暴露在宿主机器上的端口
proxy_pass http://127.0.0.1:5572;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $http_cf_connecting_ip;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_redirect off;
proxy_buffering off;
proxy_request_buffering off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 无上传大小限制
client_max_body_size 0;
}
}
这里需要注意的就是关闭缓存和设置无上传大小限制,其他的参数都可根据需求修改。
文章封面: