Building a Media Server Stack: Jellyfin + *arr Apps
Prerequisites
Before we begin, you’ll need:
- Docker and Docker Compose installed and working
- Some storage for media files (the more the merrier, honestly)
- A basic understanding of media sourcing (use legally, obviously)
- At least one unresolved argument about whether a film is “actually good” or just nostalgic
- A beverage of your choosing. This isnt optional.
What We’re Building
Right, lets talk about what every self-respecting homelab eventually becomes: a media server.
You could just use Plex. You could also eat cereal with water. Technically functional, spiritually bankrupt. We’re going to build something proper. A complete media server with automatic organisation, a beautiful interface, and remote access. Jellyfin handles the streaming, Sonarr and Radarr handle the library management, and you handle the existential joy of watching your collection grow while you sleep.

The Approach
- Deploy Jellyfin for streaming
- Add Sonarr for TV management
- Add Radarr for movie management
- Configure download client
- Connect everything
Simple enough on paper. Famous last words.
Step 1: Directory Structure
First up, we need somewhere for all this media to live. Create the folder structure:
mkdir -p media/{movies,tv,downloads}
mkdir -p config/{jellyfin,sonarr,radarr,prowlarr,qbittorrent}
Nothing fancy here. Each service gets its own config directory, and media gets split by type. Keep it tidy now and future you will be grateful.
Step 2: Docker Compose
Here’s the main event. This compose file spins up the entire stack in one go:
services:
jellyfin:
image: jellyfin/jellyfin
ports:
- "8096:8096"
volumes:
- ./config/jellyfin:/config
- ./media:/media
environment:
- PUID=1000
- PGID=1000
sonarr:
image: lscr.io/linuxserver/sonarr
ports:
- "8989:8989"
volumes:
- ./config/sonarr:/config
- ./media:/media
environment:
- PUID=1000
- PGID=1000
radarr:
image: lscr.io/linuxserver/radarr
ports:
- "7878:7878"
volumes:
- ./config/radarr:/config
- ./media:/media
environment:
- PUID=1000
- PGID=1000
prowlarr:
image: lscr.io/linuxserver/prowlarr
ports:
- "9696:9696"
volumes:
- ./config/prowlarr:/config
environment:
- PUID=1000
- PGID=1000
qbittorrent:
image: lscr.io/linuxserver/qbittorrent
ports:
- "8080:8080"
- "6881:6881"
volumes:
- ./config/qbittorrent:/config
- ./media/downloads:/downloads
environment:
- PUID=1000
- PGID=1000
Five services, one file. Bring it all up with:
docker compose up -d
Go make a cup of tea while Docker pulls the images. You’ve earned it.

Step 3: Configure Jellyfin
This is the bit where it starts feeling real.
- Navigate to
http://server:8096 - Complete the setup wizard
- Add your media libraries:
- Movies:
/media/movies - TV Shows:
/media/tv
- Movies:
- Enable hardware transcoding if your hardware supports it
Jellyfin’s interface is genuinely lovely. It doesnt have the corporate energy of Plex, just a clean, open-source media player that minds its own business.
Step 4: Configure Prowlarr
Prowlarr is the glue that holds the *arr stack together. It manages indexers so Sonarr and Radarr dont have to.
- Navigate to
http://server:9696 - Add your indexers (search providers)
- Settings → Apps → Add Sonarr and Radarr
- Grab the API keys from the Sonarr/Radarr settings pages
Once Prowlarr is connected, any indexer you add automatically syncs to both Sonarr and Radarr. Proper clever stuff.
Step 5: Configure Sonarr
Sonarr is your TV librarian. A very organised, slightly obsessive TV librarian.
- Navigate to
http://server:8989 - Settings → Media Management:
- Root Folder:
/media/tv - Enable renaming (trust me on this one)
- Root Folder:
- Settings → Download Clients:
- Add qBittorrent
- Host:
qbittorrent - Port:
8080
- Add your series and set them to monitor
The renaming is important. Without it you end up with folders called things like The.Office.S03E07.720p.BluRay.x264-DEMAND and that is no way to live.
Step 6: Configure Radarr
Same idea as Sonarr, but for films.
- Navigate to
http://server:7878 - Root Folder:
/media/movies - Add qBittorrent as the download client
- Add your movies and monitor them
You will absolutely add 200 films in the first sitting. Everyone does. No judgement.

Step 7: Quality Profiles
In both Sonarr and Radarr, set up quality profiles so you’re not downloading anything rubbish:
4K Profile:
- Bluray-2160p
- WEB 2160p
- HDTV-2160p
1080p Profile:
- Bluray-1080p
- WEB 1080p
- HDTV-1080p
Set a minimum quality to avoid poor releases. Life is too short for 480p.
The Result
Once everything is wired up, you get:
- Automated media collection and organisation
- Consistent naming and folder structure
- A genuinely beautiful streaming interface
- Available on any device, anywhere
It’s the kind of setup that makes you wonder why you ever used anything else.

What I’d Do Differently
Use hardlinks or atomic moves from the very start. I made the mistake of copying files initially, which wastes both disk space and time. Make sure your download and media folders are on the same filesystem and save yourself the headache.
Took a weekend to get right, runs itself now. New episodes just appear like magic. Honestly the best kind of lazy.