Docker Compose stacks for a media server running on a remote host (Barad-dur), deployed via Portainer.
All services share an external media Docker network and use a single /mnt/media/library:/data volume mount to enable hardlinks and atomic moves between apps.
| Service | Port | Description |
|---|---|---|
| Traefik | 80, 443 | Reverse proxy — HTTPS access via *.myhome.local |
| Sonarr | 8989 | TV show management and automation |
| Radarr | 7878 | Movie management and automation |
| Prowlarr | 9696 | Indexer manager for Sonarr and Radarr |
| Transmission | 9091 | Torrent client routed through Mullvad VPN via Gluetun |
| Bazarr | 6767 | Automatic subtitle downloader |
| Recyclarr | — | Syncs TRaSH Guides quality profiles to Sonarr/Radarr |
| FlareSolverr | 8191 | Bypass Cloudflare protection for Prowlarr indexers |
| Jellyseerr | 5055 | Media request management |
| Tdarr | 8265 | Media transcoding (not currently in use) |
| Watchtower | — | Automatic Docker image updates |
Browser (*.myhome.local)
|
Traefik (HTTPS reverse proxy)
|
+--> Prowlarr (indexers) --> Sonarr/Radarr (management)
| |
| v
| Gluetun (Mullvad VPN)
| |
| v
+--> Transmission (downloads) -----+
| |
| v
| /mnt/media/library
| |
| v
+--> Bazarr (subtitles), Tdarr (transcoding)
|
+--> Jellyseerr (request portal)
Recyclarr --> syncs quality profiles to Sonarr/Radarr
FlareSolverr --> Cloudflare solving for Prowlarr
Each service has its own docker-compose.yml. Deploy each stack individually through the Portainer web UI on the remote host.
- Create the shared network:
docker network create media - Configure DNS: point
*.myhome.localto the server's LAN IP (via NextDNS rewrites) - Ensure
/mnt/media/libraryexists on the host with the following subdirectories:movies/— Movie librarytvshows/— TV show librarydownloads/— Active downloadsincomplete/— Incomplete downloadscompleted/— Completed downloads
- Traefik — Reverse proxy (generate certs first, see traefik/README)
- Gluetun/Transmission — VPN + download client (requires Mullvad credentials)
- Prowlarr — Indexer manager
- FlareSolverr — Cloudflare solver (if needed by indexers)
- Sonarr and Radarr — Media managers
- Recyclarr — Quality profile sync
- Bazarr — Subtitles
- Jellyseerr — Request management
All services use Docker named volumes for config and a bind mount for the shared media library:
- Config: named volumes (e.g.,
sonarr-config,radarr-config) - Media:
/mnt/media/library:/data
The single /data mount across all services enables hardlinks and atomic moves, avoiding unnecessary disk usage when Sonarr/Radarr import completed downloads.