LANgenoten artikel

Een standaard Arr-stack installeren met Docker op Debian of Ubuntu

Lees of reageer op LANgenoten →

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.

Lees of reageer op LANgenoten →

← Terug naar het logboek