Met een Arr-stack kun je een groot deel van je mediaserver automatiseren. Denk aan het beheren van series, films, indexers, downloadclients, ondertitels en het afspelen van media via Jellyfin.
In deze handleiding installeren we een basisstack met:
- Sonarr voor series
- Radarr voor films
- Prowlarr voor indexers
- qBittorrent voor torrents
- SABnzbd voor usenet
- Bazarr voor ondertitels
- Jellyfin als mediaserver
Daarnaast nemen we twee optionele, maar handige onderdelen mee:
- Jellyseerr voor media-aanvragen
- Unpackerr voor het automatisch uitpakken van downloads
We gaan ervan uit dat Docker al geïnstalleerd is. Is dat nog niet zo, volg dan eerst de handleiding voor het installeren van Docker op Debian of Ubuntu.
Benodigdheden
Voor deze handleiding heb je nodig:
- Een Debian- of Ubuntu-server
- Docker
- Docker Compose
- Een gebruiker met sudo-rechten
- Voldoende opslagruimte voor media
- Een vast intern IP-adres voor je server
- Basiskennis van de terminal
In deze handleiding gebruiken we als voorbeeldgebruiker:
moofz
Pas dit aan naar je eigen gebruikersnaam als die anders is.
Waarom de mappenstructuur belangrijk is
Bij een Arr-stack is de mappenstructuur belangrijk. Als downloads en media verkeerd gekoppeld worden in Docker, kunnen Sonarr en Radarr bestanden niet netjes importeren, verplaatsen of hardlinken.
Dat kan zorgen voor:
- Dubbele bestanden
- Trage imports
- Onnodige belasting van je schijven
- Permission errors
- Downloads die blijven hangen in Sonarr of Radarr
Daarom gebruiken we één hoofdmap voor downloads en media:
/data
Daaronder maken we aparte mappen voor torrents, usenet en media.
De structuur wordt:
/data
├── torrents
│ ├── movies
│ ├── tv
│ └── incomplete
├── usenet
│ ├── complete
│ │ ├── movies
│ │ └── tv
│ └── incomplete
└── media
├── movies
└── tv
De Docker-configuratie bewaren we apart onder:
/opt/media
Kort gezegd:
/opt/media → Docker Compose en containerconfiguratie
/data → downloads en mediabibliotheek
Stap 1: mappen aanmaken
Maak alle benodigde mappen in één keer aan:
sudo mkdir -p \
/opt/media/compose \
/opt/media/config/{sonarr,radarr,prowlarr,qbittorrent,sabnzbd,bazarr,jellyfin,jellyseerr,unpackerr} \
/data/torrents/{movies,tv,incomplete} \
/data/usenet/complete/{movies,tv} \
/data/usenet/incomplete \
/data/media/{movies,tv}
Stap 2: rechten goed zetten
Achterhaal eerst je eigen user ID en group ID:
id moofz
Je krijgt dan iets terug zoals:
uid=1000(moofz) gid=1000(moofz) groups=1000(moofz),27(sudo)
In dit voorbeeld gebruiken we:
PUID=1000
PGID=1000
Zet daarna de eigenaar van de mappen goed:
sudo chown -R moofz:moofz /opt/media /data
Zet daarna de basisrechten:
sudo chmod -R 775 /opt/media /data
Stap 3: Docker Compose-bestand maken
Ga naar de compose-map:
cd /opt/media/compose
Maak een nieuw Docker Compose-bestand:
nano docker-compose.yml
Plaats daarin de volgende configuratie:
services:
sonarr:
image: lscr.io/linuxserver/sonarr:latest
container_name: sonarr
restart: unless-stopped
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Amsterdam
volumes:
- /opt/media/config/sonarr:/config
- /data:/data
ports:
- "8989:8989"
radarr:
image: lscr.io/linuxserver/radarr:latest
container_name: radarr
restart: unless-stopped
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Amsterdam
volumes:
- /opt/media/config/radarr:/config
- /data:/data
ports:
- "7878:7878"
prowlarr:
image: lscr.io/linuxserver/prowlarr:latest
container_name: prowlarr
restart: unless-stopped
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Amsterdam
volumes:
- /opt/media/config/prowlarr:/config
ports:
- "9696:9696"
qbittorrent:
image: lscr.io/linuxserver/qbittorrent:latest
container_name: qbittorrent
restart: unless-stopped
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Amsterdam
- WEBUI_PORT=8080
volumes:
- /opt/media/config/qbittorrent:/config
- /data/torrents:/data/torrents
ports:
- "8080:8080"
- "6881:6881"
- "6881:6881/udp"
sabnzbd:
image: lscr.io/linuxserver/sabnzbd:latest
container_name: sabnzbd
restart: unless-stopped
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Amsterdam
volumes:
- /opt/media/config/sabnzbd:/config
- /data/usenet:/data/usenet
ports:
- "8081:8080"
bazarr:
image: lscr.io/linuxserver/bazarr:latest
container_name: bazarr
restart: unless-stopped
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Amsterdam
volumes:
- /opt/media/config/bazarr:/config
- /data/media/movies:/movies
- /data/media/tv:/tv
ports:
- "6767:6767"
jellyfin:
image: lscr.io/linuxserver/jellyfin:latest
container_name: jellyfin
restart: unless-stopped
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Amsterdam
volumes:
- /opt/media/config/jellyfin:/config
- /data/media:/data/media:ro
ports:
- "8096:8096"
# Gebruik deze regels alleen als je hardware transcoding wilt gebruiken
# en /dev/dri beschikbaar is op je host.
# devices:
# - /dev/dri:/dev/dri
jellyseerr:
image: fallenbagel/jellyseerr:latest
container_name: jellyseerr
restart: unless-stopped
environment:
- LOG_LEVEL=info
- TZ=Europe/Amsterdam
volumes:
- /opt/media/config/jellyseerr:/app/config
ports:
- "5055:5055"
unpackerr:
image: golift/unpackerr:latest
container_name: unpackerr
restart: unless-stopped
environment:
- TZ=Europe/Amsterdam
- UN_SONARR_0_URL=http://sonarr:8989
- UN_SONARR_0_API_KEY=VUL_HIER_JE_SONARR_API_KEY_IN
- UN_RADARR_0_URL=http://radarr:7878
- UN_RADARR_0_API_KEY=VUL_HIER_JE_RADARR_API_KEY_IN
volumes:
- /data:/data
Let op: pas PUID en PGID aan als jouw gebruiker een andere ID heeft dan 1000.
Sla het bestand op met:
CTRL + O
Enter
CTRL + X
Stap 4: containers starten
Start de stack:
docker compose up -d
Controleer daarna of alles draait:
docker ps
Je zou nu containers moeten zien voor Sonarr, Radarr, Prowlarr, qBittorrent, SABnzbd, Bazarr, Jellyfin, Jellyseerr en Unpackerr.
Stap 5: webinterfaces openen
Open de webinterfaces via het IP-adres van je server.
Vervang 192.168.1.50 door het IP-adres van jouw server.
Sonarr: http://192.168.1.50:8989
Radarr: http://192.168.1.50:7878
Prowlarr: http://192.168.1.50:9696
qBittorrent: http://192.168.1.50:8080
SABnzbd: http://192.168.1.50:8081
Bazarr: http://192.168.1.50:6767
Jellyfin: http://192.168.1.50:8096
Jellyseerr: http://192.168.1.50:5055
Stap 6: qBittorrent instellen
Open qBittorrent:
http://server-ip:8080
Stel de downloadlocaties in.
Gebruik als standaard downloadmap:
/data/torrents
Gebruik als map voor incomplete downloads:
/data/torrents/incomplete
Maak daarna categorieën aan:
movies → /data/torrents/movies
tv → /data/torrents/tv
Sonarr en Radarr kunnen later automatisch de juiste categorie meegeven.
Stap 7: SABnzbd instellen
Open SABnzbd:
http://server-ip:8081
Stel de tijdelijke downloadmap in:
/data/usenet/incomplete
Stel de map voor voltooide downloads in:
/data/usenet/complete
Maak daarna categorieën aan:
movies → /data/usenet/complete/movies
tv → /data/usenet/complete/tv
Stap 8: root folders instellen in Sonarr en Radarr
Open Sonarr:
http://server-ip:8989
Ga naar:
Settings → Media Management → Root Folders
Voeg deze root folder toe:
/data/media/tv
Open daarna Radarr:
http://server-ip:7878
Voeg daar deze root folder toe:
/data/media/movies
Stap 9: downloadclients koppelen aan Sonarr en Radarr
qBittorrent koppelen aan Sonarr
Ga in Sonarr naar:
Settings → Download Clients → Add → qBittorrent
Gebruik:
Host: qbittorrent
Port: 8080
Category: tv
Vul de gebruikersnaam en het wachtwoord van qBittorrent in.
Test de verbinding en sla op.
qBittorrent koppelen aan Radarr
Ga in Radarr naar:
Settings → Download Clients → Add → qBittorrent
Gebruik:
Host: qbittorrent
Port: 8080
Category: movies
Test de verbinding en sla op.
SABnzbd koppelen aan Sonarr
Ga in Sonarr naar:
Settings → Download Clients → Add → SABnzbd
Gebruik:
Host: sabnzbd
Port: 8080
Category: tv
De API-key vind je in SABnzbd onder de instellingen.
SABnzbd koppelen aan Radarr
Ga in Radarr naar:
Settings → Download Clients → Add → SABnzbd
Gebruik:
Host: sabnzbd
Port: 8080
Category: movies
Test de verbinding en sla op.
Let op het verschil tussen extern en intern:
Vanaf je browser:
http://server-ip:8081
Binnen Docker:
http://sabnzbd:8080
Stap 10: Prowlarr koppelen aan Sonarr en Radarr
Prowlarr gebruik je om indexers centraal te beheren.
Open Prowlarr:
http://server-ip:9696
Ga naar:
Settings → Apps
Voeg Sonarr toe:
Name: Sonarr
Sync Level: Full Sync
Prowlarr Server: http://prowlarr:9696
Sonarr Server: http://sonarr:8989
Vul de Sonarr API-key in.
Die vind je in Sonarr onder:
Settings → General → Security → API Key
Voeg daarna Radarr toe:
Name: Radarr
Sync Level: Full Sync
Prowlarr Server: http://prowlarr:9696
Radarr Server: http://radarr:7878
Vul ook hier de API-key in.
Daarna kun je in Prowlarr je indexers toevoegen. Prowlarr stuurt deze automatisch door naar Sonarr en Radarr.
Stap 11: Bazarr koppelen aan Sonarr en Radarr
Bazarr zorgt voor ondertitels.
Open Bazarr:
http://server-ip:6767
Koppel Sonarr:
Sonarr Address: http://sonarr
Sonarr Port: 8989
Koppel Radarr:
Radarr Address: http://radarr
Radarr Port: 7878
Vul de API-keys van Sonarr en Radarr in.
Controleer daarna of Bazarr je series en films kan zien.
Stap 12: Jellyfin instellen
Open Jellyfin:
http://server-ip:8096
Doorloop de eerste installatie.
Maak daarna bibliotheken aan:
Films:
/data/media/movies
Series:
/data/media/tv
In deze compose-file heeft Jellyfin alleen-lezen toegang tot /data/media.
Dat betekent dat Jellyfin je media wel kan afspelen, maar niet zomaar kan wijzigen of verwijderen. Voor de meeste installaties is dat een veilige standaard.
Stap 13: Jellyseerr koppelen
Jellyseerr is optioneel, maar handig als je gebruikers films of series wilt laten aanvragen.
Open Jellyseerr:
http://server-ip:5055
Koppel Jellyfin als mediaserver.
Daarna kun je Sonarr en Radarr koppelen:
Sonarr URL: http://sonarr:8989
Radarr URL: http://radarr:7878
Gebruik ook hier de API-keys van Sonarr en Radarr.
Stap 14: Unpackerr instellen
Unpackerr is handig als downloads als .rar-bestanden binnenkomen.
In de compose-file staan placeholders:
UN_SONARR_0_API_KEY=VUL_HIER_JE_SONARR_API_KEY_IN
UN_RADARR_0_API_KEY=VUL_HIER_JE_RADARR_API_KEY_IN
Vul daar je echte API-keys in.
Herstart daarna de stack:
cd /opt/media/compose
docker compose up -d
Controleer de logs van Unpackerr:
docker logs -f unpackerr
Stap 15: controleren of de workflow werkt
Een goede test is om één serie of film toe te voegen en te controleren of het hele proces werkt.
De workflow is ongeveer:
Sonarr/Radarr zoekt een release
↓
Prowlarr levert indexerresultaten
↓
De download gaat naar qBittorrent of SABnzbd
↓
De download komt binnen in /data/torrents of /data/usenet
↓
Sonarr/Radarr importeert naar /data/media
↓
Jellyfin ziet de nieuwe media
Als dit goed werkt, zie je uiteindelijk bestanden verschijnen in:
/data/media/tv
/data/media/movies
Veelgemaakte fouten
Fout 1: verschillende paden per container gebruiken
Bijvoorbeeld:
qBittorrent gebruikt: /downloads
Sonarr gebruikt: /data/downloads
Dit zorgt vaak voor importproblemen.
Gebruik liever overal dezelfde hoofdstructuur onder:
/data
Fout 2: verkeerde rechten
Als Sonarr of Radarr niets kan importeren, controleer dan eerst de rechten:
ls -lah /data
ls -lah /opt/media/config
Controleer ook of je PUID en PGID kloppen:
id moofz
Fout 3: poortconflict tussen qBittorrent en SABnzbd
qBittorrent gebruikt intern poort 8080.
SABnzbd gebruikt intern ook poort 8080.
Daarom mappen we SABnzbd op de host naar poort 8081:
sabnzbd:
ports:
- "8081:8080"
Binnen Docker blijft SABnzbd bereikbaar als:
http://sabnzbd:8080
Vanaf je browser gebruik je:
http://server-ip:8081
Fout 4: Jellyfin ziet geen media
Controleer of de bibliotheken naar de juiste paden wijzen:
/data/media/movies
/data/media/tv
Controleer ook of Jellyfin toegang heeft tot de media:
docker exec -it jellyfin ls -lah /data/media
Fout 5: downloads blijven hangen in Sonarr of Radarr
Controleer dan:
- Of de downloadclient gekoppeld is
- Of de categorie klopt
- Of het pad klopt
- Of Sonarr/Radarr schrijfrechten heeft
- Of de download nog seeding of vergrendeld is
- Of het om een rar-download gaat die Unpackerr moet uitpakken
Stack bijwerken
Je kunt de stack later bijwerken met:
cd /opt/media/compose
docker compose pull
docker compose up -d
Ruim oude images eventueel op met:
docker image prune
Stack stoppen
Wil je de stack stoppen?
cd /opt/media/compose
docker compose down
Je configuratie en media blijven behouden, omdat die buiten de containers staan:
/opt/media/config
/data
Back-upadvies
Maak minimaal back-ups van:
/opt/media/config
Hierin staan de configuraties, databases en instellingen van je containers.
Je media staat in:
/data/media
Of je die ook back-upt, hangt af van je opslagruimte en hoe belangrijk de bestanden voor je zijn.
Moet alles publiek bereikbaar zijn?
Nee.
Zet deze stack in eerste instantie alleen intern beschikbaar. Wil je later onderdelen via internet bereikbaar maken, gebruik dan liever een reverse proxy zoals Nginx Proxy Manager.
Maak vooral niet zomaar alle beheerinterfaces publiek bereikbaar.
Zet deze diensten niet zonder extra beveiliging open:
- Sonarr
- Radarr
- Prowlarr
- qBittorrent
- SABnzbd
- Bazarr
Jellyfin of Jellyseerr kun je eventueel publiek maken, maar gebruik dan HTTPS, sterke wachtwoorden en bij voorkeur extra beveiliging zoals een VPN, reverse proxy of CrowdSec.
Conclusie
Met deze Docker Compose-stack heb je een stevige basis voor een selfhosted mediaserver.
De belangrijkste onderdelen zijn:
- Sonarr voor series
- Radarr voor films
- Prowlarr voor indexers
- qBittorrent en SABnzbd voor downloads
- Bazarr voor ondertitels
- Jellyfin voor afspelen
- Jellyseerr voor verzoeken
- Unpackerr voor archieven
De belangrijkste keuze in deze handleiding is de mappenstructuur onder /data. Als je die vanaf het begin goed neerzet, voorkom je later veel problemen met imports, rechten en dubbele bestanden.