One-command Docker Compose setup for the *arr stack: Sonarr, Radarr, Prowlarr, Jellyfin, Jellyseerr, and Transmission.
No hand-editing compose files, no hunting for the right image tags. Clone, configure your ports and paths in .env, and run docker compose up -d.
- Prowlarr (port 9696): Indexer manager. Connects Sonarr/Radarr to torrent and Usenet indexers.
- Sonarr (port 8989): TV show manager. Tracks episodes, grabs releases, sends to download client.
- Radarr (port 7878): Movie manager. Same idea as Sonarr but for films.
- Jellyfin (port 8096): Media server. Plays your library on any device, no subscription needed.
- Jellyseerr (port 5055): Request manager. Lets household members request movies/shows through a web UI.
- Transmission (port 9091): BitTorrent client. Optional but included for a complete working setup out of the box.
- Docker 20.10+ with Compose v2
- At least 2 GB RAM (4 GB if you want hardware transcoding in Jellyfin)
- Enough disk for your media library
# 1. Clone
git clone https://github.com/cappy-dev/arr-docker-easy.git
cd arr-docker-easy
# 2. Configure
cp .env.example .env
# Edit .env with your user ID, timezone, and media paths
nano .env
# 3. Launch
docker compose up -dThat's it. Open http://your-server:8989 for Sonarr, :7878 for Radarr, :8096 for Jellyfin.
After first launch, data/ will look like this:
data/
prowlarr/ # Prowlarr config + database
sonarr/ # Sonarr config + database
radarr/ # Radarr config + database
jellyfin/ # Jellyfin config + metadata
jellyseerr/ # Jellyseerr config + database
transmission/ # Transmission config + blocklists
media/
tv/ # TV shows (set this in Sonarr)
movies/ # Movies (set this in Radarr)
downloads/ # Incomplete + completed downloads
Open :9696, complete the setup wizard, then add indexers under Settings > Indexers. Prowlarr will sync them to Sonarr and Radarr automatically once you connect them.
In Prowlarr: Settings > Apps > Add. Point it at your Sonarr and Radarr instances (use the container names: http://sonarr:8989 and http://radarr:7878).
In Sonarr and Radarr: Settings > Download Client > Add > Transmission. Host is transmission, port 9091. No auth by default.
Open :8096, set up your admin account, and add media libraries pointing to /media/tv and /media/movies.
Open :5055, sign in with your Jellyfin account, and configure which libraries to track for requests.
All config lives in .env. Key variables:
PUID(default 1000): User ID for file permissionsPGID(default 1000): Group ID for file permissionsTZ(default America/Chicago): Timezone for scheduling and timestampsDATA_ROOT(default ./data): Where container configs liveMEDIA_ROOT(default ./media): Where your media and downloads live
Run id on your host to find your PUID and PGID. If they are not 1000, change them in .env or file permissions inside containers will be wrong.
# Stop everything
docker compose down
# Update all images
docker compose pull
docker compose up -d
# Check logs for a specific service
docker compose logs -f sonarr
# Reset a service (deletes its config!)
rm -rf data/sonarr
docker compose up -d sonarrJellyfin supports Intel Quick Sync, NVIDIA NVENC, and AMD AMF. To enable it:
- Make sure your host has the right drivers installed
- Pass the device through in
docker-compose.ymlby adding to the jellyfin service:devices: - /dev/dri:/dev/dri # Intel/AMD # - /dev/nvidia0:/dev/nvidia0 # NVIDIA
- In Jellyfin: Dashboard > Playback > Transcoding > select your hardware encoder
- These services expose HTTP ports with no built-in auth on first run. Put them behind a reverse proxy (Caddy, Nginx) with auth if exposed to the internet.
- Transmission has no auth by default. Set a password in its settings after first launch.
- Keep
.envout of version control. It is already in.gitignore.
MIT. Use it however you want.