All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 2m1s
- 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
106 lines
4.4 KiB
Markdown
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.
|