server-up/docs/arr-stack.md
Ramon 58d9be1f48
All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 2m1s
v0.7.90-beta - ARR-stack opgesplitst, /data-mount, netwerkopties per container
- Elk *arr-onderdeel is nu ook een losse app in de store (46 nieuwe sjablonen);
  los en gebundeld komen uit één bron (tools/arr_sjablonen.py) met een test die
  bewaakt dat ze niet uiteen lopen
- Alles deelt één /data-map, zodat hardlinks werken; losse /tv-, /movies- en
  /downloads-mounts zijn eruit, UMASK=002 erbij
- Nieuwe eerste stap "Onderdelen" in het invulmenu, met kopjes per soort; de
  dubbele groepsschakelaar en de lege kaarten in Instellingen zijn weg
- Eigen IP-adres per container in plaats van per stack; containers zonder adres
  houden hun poortmapping. Ook Pangolin publiceert nu per container
- Huntarr vervangen door NeutArr (project offline na lekken, image bestaat niet
  meer), Maintainerr naar zijn nieuwe organisatie
- 31 apps toegevoegd uit het *arr-ecosysteem, alle images tegen hun registry
  gecontroleerd
- data_dir hernoemd naar appdata_dir in de hele catalogus, naast de nieuwe
  data_root; qBittorrent van poort 8080 naar 8097

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9eqpADJSRs49SoGGr4NAy
2026-07-31 22:21:04 +02:00

106 lines
4.4 KiB
Markdown

# De ARR-stack
Media-automatisering bestaat uit een stuk of tien tot vijftig losse programma's
die elkaar aanvullen: Sonarr houdt series bij, Radarr films, Prowlarr regelt de
indexers, een downloadclient haalt het binnen, Bazarr zoekt ondertitels. In de
store staat elk van die programma's als losse app, én gebundeld als **ARR-stack**
waarin je per onderdeel een schakelaar omzet.
## Los of gebundeld?
Het zijn dezelfde containers. De stack is één compose-project met één
instellingenscherm; los installeren geeft je per app een eigen stack die je apart
kunt bijwerken, herstarten en backuppen.
| | Los | ARR-stack |
|---|---|---|
| Iets bijzetten | opnieuw installeren uit de store | schakelaar aan, opnieuw instellen |
| Bijwerken | per app | de hele stack in één keer |
| Backup | per app | alles samen |
| Overzicht | een tegel per app | één tegel met alle containers |
Weet je nog niet wat je nodig hebt, begin dan met de stack: je zet er later
onderdelen bij zonder opnieuw te beginnen. Draai je er al een paar en wil je er
één bij, installeer die dan los.
## Eén map: /data
Alles deelt één map, die als `/data` in elke container komt:
```
/mnt/data/
├── media/
│ ├── films/
│ ├── series/
│ ├── muziek/
│ └── boeken/
├── torrents/ # blijven seeden na afloop
└── usenet/
```
**Dit is geen smaakkwestie.** Staan je downloads en je bibliotheek op
verschillende mounts — `/downloads` en `/tv` bijvoorbeeld — dan ziet Sonarr twee
verschillende bestandssystemen, ook al staat het op dezelfde schijf. Er kan dan
geen hardlink gemaakt worden en elke voltooide download wordt **gekopieerd** naar
je bibliotheek. Dat is traag, en je hebt de aflevering tijdelijk twee keer op je
schijf staan. Verwijder je daarna de download, dan stopt het seeden.
Met één gedeelde `/data`-mount is het verplaatsen een hardlink: klaar in een
oogwenk, geen extra ruimte, en je torrent blijft doordraaien.
Alle containers draaien met `UMASK=002`, zodat wat de één aanmaakt door de ander
gelezen en geschreven kan worden. Zorg dat de map van de PUID/PGID is die je bij
het installeren opgeeft (`id -u` en `id -g` op je server).
## Downloaden via een VPN
Zet je **Gluetun** aan, dan gaan de downloadclients in de netwerknamespace van
die container zitten: al hun verkeer loopt door de VPN, en hun webinterfaces
bereik je via de poorten van Gluetun. Dat gebeurt automatisch zodra je de
schakelaar omzet.
Wat er bewust *niet* gebeurt: de inkomende torrentpoort op de host publiceren.
Achter een VPN regel je dat met de port forwarding van je aanbieder — zou je hem
op de host zetten, dan komt dat verkeer langs de tunnel binnen en botsen twee
torrentclients bovendien meteen op poort 6881.
Je hebt gegevens van je VPN-aanbieder nodig: bij WireGuard een privésleutel en
een adres, bij OpenVPN een gebruikersnaam en wachtwoord. Die vul je in bij de
stap *Toegang* en ze komen in `.env` terecht, niet in het compose-bestand.
## Het invulmenu
De stack heeft negenenveertig schakelbare onderdelen, dus het formulier begint
met **Onderdelen**: alle schakelaars bij elkaar, gegroepeerd per soort. Wat je
daar aanzet, bepaalt wat je in de volgende stappen te zien krijgt.
1. **Onderdelen** — wat wil je draaien
2. **Basis** — mappen, tijdzone, PUID/PGID
3. **Verbinden** — gedeelde netwerken, en eventueel een eigen IP-adres per container
4. **Instellingen** — de poorten (staan al goed) en de VPN-instellingen
5. **Toegang** — sleutels en wachtwoorden
6. **Controleren** — het compose-bestand zoals het straks op schijf komt
## Een eigen adres per container
Bij *Verbinden* kun je containers een eigen IP-adres in je LAN geven in plaats
van een poort op de host. Dat gaat **per container**: geef Sonarr en Radarr elk
een adres en laat de rest op zijn hostpoort staan. Containers zonder adres houden
hun poortmapping gewoon.
Zie [netwerken.md](netwerken.md) voor het aanmaken van zo'n netwerk en voor de
valkuil dat de host zijn eigen macvlan-containers niet kan bereiken.
## De sjablonen worden gegenereerd
Elk onderdeel bestaat twee keer: als losse app in `apps/<naam>/` en als
schakelaar in `apps/arr-stack/`. Dat soort verdubbeling loopt uit elkaar, dus
beide komen uit één bron:
```bash
python3 tools/arr_sjablonen.py
```
`tests/test_arr_sjablonen.py` draait dat opnieuw en vergelijkt het met wat er in
`apps/` staat. Pas je een sjabloon met de hand aan, dan faalt die test — bewerk
`tools/arr_sjablonen.py` en draai het script.