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): /media2. Docker: volumes in docker-compose.yml
qBittorrent:
volumes:
- /srv/dev-disk-by-uuid-801ed916.../Torrent:/downloads
- /srv/dev-disk-by-uuid-4968aa9b.../Storage:/completedJellyfin:
volumes:
- /srv/dev-disk-by-uuid-4968aa9b.../Storage:/media3. 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 qbittorrent2. 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 qbittorrent4. 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
- Go to the Jellyfin admin dashboard
- Navigate to "Libraries"
- Add the path
/media/Media - 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.