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
- 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.