Persistent Docker volume mount issues with Gluetun + qBittorrent / Transmission Kategorie: Technical Support / Docker / Portainer

Hi everyone,

I’m having a very persistent and frustrating issue with volume mounts when running torrent clients behind Gluetun on UmbrelOS.

Setup:

  • UmbrelOS (latest) on Umbrel Pro

  • Gluetun (WireGuard + Mullvad)

  • Tried both linuxserver/qbittorrent and linuxserver/transmission

  • Running with network_mode: “container:gluetun”

  • Managing stacks via Portainer

Problem:

Downloads are successfully completed inside the container, but never appear on the host filesystem / in the Umbrel File Manager under Downloads.

Volume mounts I tried:

YAML

- /home/umbrel/umbrel/home/Downloads:/downloads
- /home/umbrel/Downloads:/downloads

Commands executed on host:

Bash

mkdir -p /home/umbrel/Downloads
chown -R 1000:1000 /home/umbrel/Downloads
chmod -R 775 /home/umbrel/Downloads

# Also tried:
mkdir -p /home/umbrel/umbrel/home/Downloads/complete
chown -R 1000:1000 /home/umbrel/umbrel/home/Downloads
chmod -R 775 /home/umbrel/umbrel/home/Downloads

Inside the container:

Bash

mount | grep downloads     # returns nothing → mount not active
ls -la /downloads          # shows the downloaded files are there

The volume shows up correctly in Portainer’s Volumes tab, but the bind mount is not actually working inside the container.

Other official Umbrel apps (Immich, Jellyfin, etc.) have no problems with volume mounts.

Has anyone else experienced this issue recently?
Is there a known limitation with deep paths under /home/umbrel/umbrel/… or when using network_mode: “container:gluetun”?

Any help or workaround would be greatly appreciated.

Thanks!

PS: I new to all of this so I used AI do get it working also English is not my native language so this text is also translated by AI.

Possible solution: wrong Umbrel host path, not Gluetun

It sounds like the issue is probably not Gluetun and not network_mode: “container:gluetun”.

network_mode should only affect networking. It should not prevent Docker volume mounts from working.

The more likely problem is that the wrong Umbrel host path is being mounted.

Instead of using paths like:

- /home/umbrel/Downloads:/downloads

- /home/umbrel/umbrel/home/Downloads:/downloads

try using Umbrel’s storage path:

/home/umbrel/umbrel/data/storage

For example:

- /home/umbrel/umbrel/data/storage/downloads:/downloads

Before redeploying the stack, create the folders on the host:

sudo mkdir -p /home/umbrel/umbrel/data/storage/downloads/complete

sudo mkdir -p /home/umbrel/umbrel/data/storage/downloads/incomplete

sudo chown -R 1000:1000 /home/umbrel/umbrel/data/storage/downloads

sudo chmod -R 775 /home/umbrel/umbrel/data/storage/downloads

Then configure the torrent client to use these paths inside the container:

/downloads/complete

/downloads/incomplete

For qBittorrent, the volumes should look like this:

volumes:

  • /home/umbrel/umbrel/data/storage/app-data/qbittorrent:/config

  • /home/umbrel/umbrel/data/storage/downloads:/downloads

And in qBittorrent settings:

Default Save Path: /downloads/complete

Keep incomplete torrents in: /downloads/incomplete

Also, if qBittorrent or Transmission is using Gluetun’s network namespace, the Web UI port needs to be exposed on the Gluetun container, not on the torrent container.

Example:

services:

gluetun:

image: qmcgaw/gluetun:latest

container_name: gluetun

cap_add:

  - NET_ADMIN

devices:

  - /dev/net/tun:/dev/net/tun

ports:

  - "8080:8080"      # qBittorrent Web UI

  - "6881:6881"

  - "6881:6881/udp"

volumes:

  - /home/umbrel/umbrel/data/storage/app-data/gluetun:/gluetun

environment:

  - VPN_SERVICE_PROVIDER=mullvad

  - VPN_TYPE=wireguard

  - WIREGUARD_PRIVATE_KEY=YOUR_PRIVATE_KEY_HERE

  - WIREGUARD_ADDRESSES=YOUR_WIREGUARD_ADDRESS_HERE

  - SERVER_COUNTRIES=Germany

  - TZ=Europe/Berlin

restart: unless-stopped

qbittorrent:

image: lscr.io/linuxserver/qbittorrent:latest

container_name: qbittorrent

network_mode: "service:gluetun"

depends_on:

  - gluetun

environment:

  - PUID=1000

  - PGID=1000

  - TZ=Europe/Berlin

  - WEBUI_PORT=8080

  - UMASK=002

volumes:

  - /home/umbrel/umbrel/data/storage/app-data/qbittorrent:/config

  - /home/umbrel/umbrel/data/storage/downloads:/downloads

restart: unless-stopped

After changing the stack, he should redeploy/recreate the containers, not only restart them.

Then he can verify the real Docker mount with:

sudo docker inspect qbittorrent --format ‘{{range .Mounts}}{{println .Type .Source “->” .Destination}}{{end}}’

The correct result should show a bind mount like:

bind /home/umbrel/umbrel/data/storage/downloads → /downloads

If it shows volume instead of bind, then Docker/Portainer is still using a named volume, not the host folder.

Final mount test:

sudo docker exec -it qbittorrent sh -c ‘echo test > /downloads/complete/docker-mount-test.txt’

ls -lah /home/umbrel/umbrel/data/storage/downloads/complete

If docker-mount-test.txt appears on the host, the bind mount is working correctly.

So the most likely fix is to use:

- /home/umbrel/umbrel/data/storage/downloads:/downloads

instead of:

- /home/umbrel/Downloads:/downloads

or:

- /home/umbrel/umbrel/home/Downloads:/downloads