In this post, I’ll show how to properly configure qBittorrent and Jellyfin in Docker so that:

  • qBittorrent downloads files to a temporary directory;
  • after finishing, it automatically moves them to another storage location;
  • keeps seeding the files;
  • Jellyfin continues indexing the content without issues.

1. Folder Structure

Assume the following paths:

  • Temporary downloads: /srv/dev-disk-by-uuid-801ed916.../Torrent/temp
  • Completed downloads: /srv/dev-disk-by-uuid-4968aa9b.../Storage/Media

In Docker:

downloads: /downloads
completed: /completed
media (for Jellyfin): /media

2. Docker: volumes in docker-compose.yml

qBittorrent:

volumes:
  - /srv/dev-disk-by-uuid-801ed916.../Torrent:/downloads
  - /srv/dev-disk-by-uuid-4968aa9b.../Storage:/completed

Jellyfin:

volumes:
  - /srv/dev-disk-by-uuid-4968aa9b.../Storage:/media

3. qBittorrent Configuration via Web UI

  • Save to location: /downloads/temp
  • Move completed downloads to: /completed/Media
  • "Keep incomplete torrents in" — should not be enabled!
Once downloads finish, qBittorrent will automatically move them and continue seeding from the new location.

4. Move Already Downloaded Files Manually

1. Stop qBittorrent:

docker stop qbittorrent

2. Move files to the new disk:

mv /srv/dev-disk-by-uuid-801ed916.../Torrent/*.mkv \
   /srv/dev-disk-by-uuid-4968aa9b.../Hdd16Gb/Media/

3. Start qBittorrent:

docker start qbittorrent

4. Update paths per torrent in the Web UI:

Right-click → Set location → Select /completed/Media/filename

qBittorrent will resume seeding the same files from the new location.

5. Jellyfin: Update Library

  1. Go to the Jellyfin admin dashboard
  2. Navigate to "Libraries"
  3. Add the path /media/Media
  4. Start a manual scan
Jellyfin will re-index the files from the new storage location; watch history will not be lost.

6. Automate Moving Completed Torrents

Below is a sample bash script that automates moving completed files from the temporary download directory to the final storage location and updates the torrent paths accordingly in qBittorrent:

#!/bin/bash

SRC="/srv/dev-disk-by-uuid-801ed916.../Torrent/temp"
DST="/srv/dev-disk-by-uuid-4968aa9b.../Storage/Media"

# Stop qBittorrent container
docker stop qbittorrent

# Move only completed files (example: .mkv, .mp4, etc)
find "$SRC" -type f \( -iname '*.mkv' -o -iname '*.mp4' -o -iname '*.avi' \) -exec mv {} "$DST" \;

# Start qBittorrent again
docker start qbittorrent

# Optionally, notify user
echo "Files moved from $SRC to $DST and qBittorrent restarted."

You can set this up as a cron job or trigger it manually whenever needed.


Conclusion

  • Downloads: qBittorrent → /downloads/temp
  • Finished: auto-moved to → /completed/Media
  • Seeding continues
  • Jellyfin sees everything under /media/Media

This setup allows you to scale by adding large disks without losing data or re-downloading torrents.