server-up/apps/arr-stack/files/compose.yaml
Ramon 7ae62fe78c
All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 1m32s
v0.6.10-beta - ARR-stack met een schakelaar per onderdeel
De ARR-stack installeerde altijd dezelfde zeven containers. Nu kies je per
onderdeel uit twintig:

- Media: sonarr, radarr, lidarr, readarr, whisparr
- Indexers: prowlarr, jackett, flaresolverr, bazarr
- Downloaden: qbittorrent, sabnzbd, nzbget, gluetun (VPN)
- Aanvullend: jellyseerr, recyclarr, unpackerr, tdarr, autobrr, maintainerr,
  huntarr

Standaard aan: sonarr, radarr, prowlarr, bazarr, qbittorrent, jellyseerr.

Gluetun:
- Staat die aan, dan draaien de downloadclients in diens netwerknamespace
  zonder eigen poortmapping; anders lekt hun verkeer om de VPN heen. Hun
  webinterfaces komen op de poorten van de Gluetun-container.
- qBittorrent en SABnzbd luisteren allebei standaard op 8080 en botsten
  daardoor achter een gedeelde namespace. qBittorrent draait nu intern op 8090.

Groepsschakelaars werkten niet:
- Een `toggle` op een groep in template.json was zelf geen variabele en kreeg
  dus nooit een startwaarde, waardoor elk schakelbaar onderdeel standaard uit
  stond en een stack met schakelaars leeg binnenkwam. fields() geeft de
  schakelaar nu mee als synthetisch bool-veld met een instelbare
  standaardstand (toggle_default), en de UI toont hem alleen in de kop van de
  groep in plaats van er ook nog eens onder.

Tests: elk onderdeel levert precies een service op als het aan staat en geen
spoor als het uit staat, de downloadclients zitten achter de VPN zonder eigen
poorten, en de interne poorten achter Gluetun botsen niet. Poortbotsingen met
bestaande apps rechtgezet (8090 -> 8097, 8095 -> 8098); 6881 en 5055 blijven
gedeeld met de losse variant van dezelfde app.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
2026-07-27 09:46:01 +02:00

362 lines
10 KiB
YAML

# ARR-stack — kies per onderdeel of je het wilt.
#
# Aandachtspunten:
# * Zet de download- en mediamap op hetzelfde bestandssysteem, anders kopieert
# elke voltooide download in plaats van te verplaatsen (traag, dubbele opslag).
# * Draai je met Gluetun, dan zitten de downloadclients in het netwerk van die
# container en bereik je hun webinterface via de Gluetun-poorten.
services:
<%- if enable_sonarr %>
<< service_name >>-sonarr:
image: lscr.io/linuxserver/sonarr:latest
container_name: << service_name >>-sonarr
environment:
- PUID=<< puid >>
- PGID=<< pgid >>
- TZ=<< timezone >>
volumes:
- << data_dir >>/<< service_name >>/sonarr:/config
- << media_dir >>/series:/tv
- << downloads_dir >>:/downloads
ports:
- "<< port_sonarr >>:8989"
restart: unless-stopped
<%- endif %>
<%- if enable_radarr %>
<< service_name >>-radarr:
image: lscr.io/linuxserver/radarr:latest
container_name: << service_name >>-radarr
environment:
- PUID=<< puid >>
- PGID=<< pgid >>
- TZ=<< timezone >>
volumes:
- << data_dir >>/<< service_name >>/radarr:/config
- << media_dir >>/films:/movies
- << downloads_dir >>:/downloads
ports:
- "<< port_radarr >>:7878"
restart: unless-stopped
<%- endif %>
<%- if enable_lidarr %>
<< service_name >>-lidarr:
image: lscr.io/linuxserver/lidarr:latest
container_name: << service_name >>-lidarr
environment:
- PUID=<< puid >>
- PGID=<< pgid >>
- TZ=<< timezone >>
volumes:
- << data_dir >>/<< service_name >>/lidarr:/config
- << media_dir >>/muziek:/music
- << downloads_dir >>:/downloads
ports:
- "<< port_lidarr >>:8686"
restart: unless-stopped
<%- endif %>
<%- if enable_readarr %>
<< service_name >>-readarr:
image: lscr.io/linuxserver/readarr:develop
container_name: << service_name >>-readarr
environment:
- PUID=<< puid >>
- PGID=<< pgid >>
- TZ=<< timezone >>
volumes:
- << data_dir >>/<< service_name >>/readarr:/config
- << media_dir >>/boeken:/books
- << downloads_dir >>:/downloads
ports:
- "<< port_readarr >>:8787"
restart: unless-stopped
<%- endif %>
<%- if enable_whisparr %>
<< service_name >>-whisparr:
image: ghcr.io/hotio/whisparr:latest
container_name: << service_name >>-whisparr
environment:
- PUID=<< puid >>
- PGID=<< pgid >>
- TZ=<< timezone >>
volumes:
- << data_dir >>/<< service_name >>/whisparr:/config
- << media_dir >>/volwassen:/adult
- << downloads_dir >>:/downloads
ports:
- "<< port_whisparr >>:6969"
restart: unless-stopped
<%- endif %>
<%- if enable_prowlarr %>
<< service_name >>-prowlarr:
image: lscr.io/linuxserver/prowlarr:latest
container_name: << service_name >>-prowlarr
environment:
- PUID=<< puid >>
- PGID=<< pgid >>
- TZ=<< timezone >>
volumes:
- << data_dir >>/<< service_name >>/prowlarr:/config
ports:
- "<< port_prowlarr >>:9696"
restart: unless-stopped
<%- endif %>
<%- if enable_jackett %>
<< service_name >>-jackett:
image: lscr.io/linuxserver/jackett:latest
container_name: << service_name >>-jackett
environment:
- PUID=<< puid >>
- PGID=<< pgid >>
- TZ=<< timezone >>
volumes:
- << data_dir >>/<< service_name >>/jackett:/config
ports:
- "<< port_jackett >>:9117"
restart: unless-stopped
<%- endif %>
<%- if enable_bazarr %>
<< service_name >>-bazarr:
image: lscr.io/linuxserver/bazarr:latest
container_name: << service_name >>-bazarr
environment:
- PUID=<< puid >>
- PGID=<< pgid >>
- TZ=<< timezone >>
volumes:
- << data_dir >>/<< service_name >>/bazarr:/config
- << media_dir >>/films:/movies
- << media_dir >>/series:/tv
ports:
- "<< port_bazarr >>:6767"
restart: unless-stopped
<%- endif %>
<%- if enable_flaresolverr %>
<< service_name >>-flaresolverr:
image: ghcr.io/flaresolverr/flaresolverr:latest
container_name: << service_name >>-flaresolverr
environment:
- TZ=<< timezone >>
- LOG_LEVEL=info
ports:
- "<< port_flaresolverr >>:8191"
restart: unless-stopped
<%- endif %>
<%- if enable_gluetun %>
<< service_name >>-gluetun:
image: qmcgaw/gluetun:latest
container_name: << service_name >>-gluetun
cap_add:
- NET_ADMIN
devices:
- /dev/net/tun:/dev/net/tun
environment:
- TZ=<< timezone >>
- VPN_SERVICE_PROVIDER=<< vpn_provider >>
- VPN_TYPE=<< vpn_type >>
- WIREGUARD_PRIVATE_KEY=<< wireguard_private_key >>
- WIREGUARD_ADDRESSES=<< wireguard_addresses >>
- OPENVPN_USER=<< openvpn_user >>
- OPENVPN_PASSWORD=<< openvpn_password >>
ports:
# De downloadclients delen dit netwerk, dus hun poorten staan hier.
<%- if enable_qbittorrent %>
- "<< port_qbittorrent >>:8090"
- "<< port_qbittorrent_tcp >>:6881"
- "<< port_qbittorrent_tcp >>:6881/udp"
<%- endif %>
<%- if enable_sabnzbd %>
- "<< port_sabnzbd >>:8080"
<%- endif %>
<%- if enable_nzbget %>
- "<< port_nzbget >>:6789"
<%- endif %>
volumes:
- << data_dir >>/<< service_name >>/gluetun:/gluetun
restart: unless-stopped
<%- endif %>
<%- if enable_qbittorrent %>
<< service_name >>-qbittorrent:
image: lscr.io/linuxserver/qbittorrent:latest
container_name: << service_name >>-qbittorrent
environment:
- PUID=<< puid >>
- PGID=<< pgid >>
- TZ=<< timezone >>
- WEBUI_PORT=8090
volumes:
- << data_dir >>/<< service_name >>/qbittorrent:/config
- << downloads_dir >>:/downloads
<%- if enable_gluetun %>
network_mode: "service:<< service_name >>-gluetun"
depends_on:
- << service_name >>-gluetun
<%- endif %>
<%- if not enable_gluetun %>
ports:
- "<< port_qbittorrent >>:8090"
- "<< port_qbittorrent_tcp >>:6881"
- "<< port_qbittorrent_tcp >>:6881/udp"
<%- endif %>
restart: unless-stopped
<%- endif %>
<%- if enable_sabnzbd %>
<< service_name >>-sabnzbd:
image: lscr.io/linuxserver/sabnzbd:latest
container_name: << service_name >>-sabnzbd
environment:
- PUID=<< puid >>
- PGID=<< pgid >>
- TZ=<< timezone >>
volumes:
- << data_dir >>/<< service_name >>/sabnzbd:/config
- << downloads_dir >>:/downloads
<%- if enable_gluetun %>
network_mode: "service:<< service_name >>-gluetun"
depends_on:
- << service_name >>-gluetun
<%- endif %>
<%- if not enable_gluetun %>
ports:
- "<< port_sabnzbd >>:8080"
<%- endif %>
restart: unless-stopped
<%- endif %>
<%- if enable_nzbget %>
<< service_name >>-nzbget:
image: lscr.io/linuxserver/nzbget:latest
container_name: << service_name >>-nzbget
environment:
- PUID=<< puid >>
- PGID=<< pgid >>
- TZ=<< timezone >>
volumes:
- << data_dir >>/<< service_name >>/nzbget:/config
- << downloads_dir >>:/downloads
<%- if enable_gluetun %>
network_mode: "service:<< service_name >>-gluetun"
depends_on:
- << service_name >>-gluetun
<%- endif %>
<%- if not enable_gluetun %>
ports:
- "<< port_nzbget >>:6789"
<%- endif %>
restart: unless-stopped
<%- endif %>
<%- if enable_jellyseerr %>
<< service_name >>-jellyseerr:
image: fallenbagel/jellyseerr:latest
container_name: << service_name >>-jellyseerr
environment:
- TZ=<< timezone >>
- LOG_LEVEL=info
volumes:
- << data_dir >>/<< service_name >>/jellyseerr:/app/config
ports:
- "<< port_jellyseerr >>:5055"
restart: unless-stopped
<%- endif %>
<%- if enable_recyclarr %>
<< service_name >>-recyclarr:
image: ghcr.io/recyclarr/recyclarr:latest
container_name: << service_name >>-recyclarr
user: << puid >>:<< pgid >>
environment:
- TZ=<< timezone >>
volumes:
- << data_dir >>/<< service_name >>/recyclarr:/config
restart: unless-stopped
<%- endif %>
<%- if enable_unpackerr %>
<< service_name >>-unpackerr:
image: ghcr.io/unpackerr/unpackerr:latest
container_name: << service_name >>-unpackerr
user: << puid >>:<< pgid >>
environment:
- TZ=<< timezone >>
- UN_SONARR_0_URL=http://<< service_name >>-sonarr:8989
- UN_RADARR_0_URL=http://<< service_name >>-radarr:7878
volumes:
- << data_dir >>/<< service_name >>/unpackerr:/config
- << downloads_dir >>:/downloads
restart: unless-stopped
<%- endif %>
<%- if enable_tdarr %>
<< service_name >>-tdarr:
image: ghcr.io/haveagitgat/tdarr:latest
container_name: << service_name >>-tdarr
environment:
- PUID=<< puid >>
- PGID=<< pgid >>
- TZ=<< timezone >>
- serverIP=0.0.0.0
- serverPort=8266
- webUIPort=8265
- internalNode=true
volumes:
- << data_dir >>/<< service_name >>/tdarr/server:/app/server
- << data_dir >>/<< service_name >>/tdarr/configs:/app/configs
- << media_dir >>:/media
- << downloads_dir >>/tdarr-cache:/temp
ports:
- "<< port_tdarr >>:8265"
- "<< port_tdarr_server >>:8266"
restart: unless-stopped
<%- endif %>
<%- if enable_autobrr %>
<< service_name >>-autobrr:
image: ghcr.io/autobrr/autobrr:latest
container_name: << service_name >>-autobrr
environment:
- TZ=<< timezone >>
volumes:
- << data_dir >>/<< service_name >>/autobrr:/config
ports:
- "<< port_autobrr >>:7474"
restart: unless-stopped
<%- endif %>
<%- if enable_maintainerr %>
<< service_name >>-maintainerr:
image: ghcr.io/jorenn92/maintainerr:latest
container_name: << service_name >>-maintainerr
user: << puid >>:<< pgid >>
environment:
- TZ=<< timezone >>
volumes:
- << data_dir >>/<< service_name >>/maintainerr:/opt/data
ports:
- "<< port_maintainerr >>:6246"
restart: unless-stopped
<%- endif %>
<%- if enable_huntarr %>
<< service_name >>-huntarr:
image: ghcr.io/plexguide/huntarr:latest
container_name: << service_name >>-huntarr
environment:
- TZ=<< timezone >>
volumes:
- << data_dir >>/<< service_name >>/huntarr:/config
ports:
- "<< port_huntarr >>:9705"
restart: unless-stopped
<%- endif %>