Upload speed for rclone serve function

What is the problem you are having with rclone?

I’m running an rclone service on a VPS, which includes a Google Drive remote. I need to share it to multiple user, and let them upload local files to Google Drive via the VPS.
For some reasons, they cannot directly mount Google Drive locally. Additionally, the direct connection from local machine to the VPS is unstable, So they need to use a proxy to maximize upload speed. I'm using rclone serve webdav as backend, and nginx reverse proxy for https connection.
So it should be like this Local -> Proxy -> Nginx reverse proxy -> rclone serve webdav
But I noticed that the upload speed is only fast at the beginning and then drops significantly over time. Speedtest for proxy is fine on speedtest.net

Now my question is: Is the slow speed caused by my configuration, or is it inherent to this method? Should I switch to another rclone serve option, such as s3, for uploading?

Run the command 'rclone version' and share the full output of the command.

rclone v1.69.1

  • os/version: ubuntu 22.04 (64 bit)
  • os/kernel: 6.13.5-x64v3-xanmod1 (x86_64)
  • os/type: linux
  • os/arch: amd64
  • go/version: go1.24.0
  • go/linking: static
  • go/tags: none

Which cloud storage system are you using? (eg Google Drive)

workspace Google Drive

The command you were trying to run (eg rclone copy /tmp remote:tmp)

/usr/bin/rclone serve webdav gdrive:/ --addr 127.0.0.1:8080 --user "user" --pass "pass" --vfs-cache-mode writes --transfers 16 --vfs-cache-max-size 15Gi --vfs-cache-max-age 1h --vfs-cache-min-free-space 3Gi

Please run 'rclone config redacted' and share the full output. If you get command not found, please make sure to update rclone.

[gdrive]
type = drive
client_id = XXX
client_secret = XXX
scope = drive
token = XXX

Nginx reverse proxy part

  location / {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Range $http_range;
    proxy_set_header If-Range $http_if_range;
    proxy_request_buffering off;
    proxy_redirect off;
    client_max_body_size 0;
    proxy_max_temp_file_size 0;
    proxy_pass http://127.0.0.1:8080;
  }

A log from the command that you were trying to run with the -vv flag

not set any log path since there is no error

After a day of testing, my conclusion is that using nginx to reverse proxy webdav results in very poor performance. Directly providing the webdavs service through rclone is the best option, you only need to add the ssl from the nginx configuration to the rclone serve webdav parameters.

[Unit]
Description=rclone webdav service

[Service]
User=root
ExecStart=/usr/bin/rclone serve webdav gdrive:/ \
--addr :8443 \
--user user \
--pass pass \
--cache-dir /home/cache/webdav \
--vfs-cache-mode writes \
--vfs-cache-max-size 20Gi \
--vfs-cache-max-age 10m \
--vfs-cache-min-free-space 3Gi \
--vfs-write-back 0s \
--dir-cache-time 5m \
--ignore-checksum \
--no-modtime \
--no-seek \
--cert /usr/local/nginx/conf/ssl/xxx.pem \
--key /usr/local/nginx/conf/ssl/xxx.key \
--fast-list \
--disable-http2 \
--buffer-size 128Mi \
--checkers 16 \
--transfers 16
--vfs-refresh
Restart=always

[Install]
WantedBy=multi-user.target

Also, do not use Raidrive to mount webdav, it makes uploading files like shit, so I switch to cyberduck.
Now I can upload at high speed without using a proxy.

1 Like