De catalogus had niets om een machine elders bij je eigen netwerk te laten
komen, en niets om Proton Mail bruikbaar te maken voor apps die geen Proton
spreken.
- wireguard: client (eigen wg0.conf in wg_confs) of server, met NET_ADMIN,
SYS_MODULE, de kernelmodules van de host en src_valid_mark.
- tailscale: network_mode host zodat de tunnel voor de hele machine geldt,
met bewaarde staat en optionele subnetroutes.
- cloudflared: publiceert zelf geen poorten en werkt zichzelf niet bij.
- protonmail-bridge: SMTP op 1026 zodat hij naast Mailpit past; het sjabloon
legt de eenmalige aanmelding via de CLI uit.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H9Vcwu7owJZ3nj5dCf4VFT
Het sjabloon pinde 4.4.29, maar vanaf 4.4.19 eist MongoDB ARMv8.2-A. Op een
Pi 4 (ARMv8.0-A) stopt mongod met 'Illegal instruction', wordt de container
nooit healthy en start UniFi niet.
- Standaard mongo:4.4.18, instelbaar via een geavanceerd veld.
- De reparatiecontainer draait dezelfde versie.
- Healthcheck ruimer: timeout 20s, start_period 90s, tien pogingen.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H9Vcwu7owJZ3nj5dCf4VFT
Het linuxserver-image schrijft /config/data/system.properties alleen bij de
allereerste start. De authSource en het wachtwoord die daarna in Compose
veranderden kwamen er nooit in, dus UniFi bleef verbinden met de gegevens van
de eerste installatie — MongoDB antwoordde met UserNotFound: unifi@unifi.
- De reparatiecontainer zet db.mongo.uri, statdb.mongo.uri, db.mongo.local en
unifi.db.name opnieuw uit de actuele omgeving; overige instellingen blijven.
- Gebruikersnaam en wachtwoord worden url-gecodeerd in de URI gezet.
- Het bestand wordt op zijn plaats overschreven, dus eigenaar en rechten
blijven van UniFi zelf.
- Het wachtwoord uit system.properties telt mee als inlogpoging, zodat een
afgeweken .env de stack niet onherstelbaar maakt.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H9Vcwu7owJZ3nj5dCf4VFT
Het audit-logboek las request.remote_addr uit in de achtergrondthread van de
job. De RuntimeError die daarop volgde belandde in de foutafhandeling, die de
zojuist gemaakte backup terugzette — inclusief het oude compose-bestand.
- Adres vóór de threadstart vastleggen bij herconfigureren, koppelen, backup
maken en terugrollen.
- UniFi: init-script probeert de beheerders 'unifi' en 'root' en herkent een
server zonder authenticatie, zodat ook een oud Mongo-volume gerepareerd
wordt; bestaande rollen blijven staan en 'backup'/'restore' worden aangevuld.
- UniFi: healthcheck van Mongo zonder inloggegevens, anders bleef de container
ongezond en startte de reparatiecontainer nooit.
- Backups: mongodump/mongorestore gebruiken de beheerder uit compose in plaats
van de verzonnen gebruiker 'app'.
- Appkaart: knop die de webinterface opent, met het adres uit /api/stacks.
- Joblog: geen dubbele regels meer doordat polls elkaar konden overlappen.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H9Vcwu7owJZ3nj5dCf4VFT
- filteredStore() werd per repo drie keer per reactieve tick aangeroepen (in de
x-show, de x-for en de teller in het filtermenu) en liep elke keer alle apps
langs met een toLowerCase() per veld. Bij elke toetsaanslag. De catalogus ging
deze reeks van 142 naar 286 apps en dat begon te merken; het filteren gebeurt
nu een keer per filterstand
- Nog maar zestig kaarten tegelijk in de DOM, met een knop Nog N tonen eronder.
De limiet valt terug zodra je het filter of de zoekterm wijzigt
- Het zoekveld wacht 200 ms voordat het filtert
- 28 apps in de dunste hoeken: 2FAuth, Passbolt, OpenBao, Trivy, Verdaccio,
Docker Registry, MkDocs Material, LiteLLM, Flowise, Speaches, Pelican Panel,
Gameyfin, EmulatorJS, Mainsail, Fluidd, Kanboard, Wekan, Filestash,
Linkwarden, Slash, RSSHub, Apprise, Mailpit, Dashy, Plausible, NetBird,
LibreSpeed en PinePods
- Alle 318 images opnieuw tegen hun registry gecontroleerd
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9eqpADJSRs49SoGGr4NAy
- Een backup bevatte alleen de stackmap: compose, .env en metadata.
LIBRARY_DIR en de appdata-map staan naast elkaar, geen genestelde mappen, dus
je maakte een backup, kreeg een groen vinkje en hield bij terugzetten een lege
app over. Een archief heeft nu drie takken: de stackmap, de appdata van die
stack, en een dump per database
- De dump is geen dubbelop: een tar van een draaiende PostgreSQL is een
momentopname van bestanden die tijdens het inpakken veranderden. Bij
terugzetten komt de dump erin nadat de container draait, met een wachtlus.
Stond de container tijdens de backup uit, dan is dat een waarschuwing in het
log en geen stille overslag
- Nieuwe instelling BACKUP_APPDATA (standaard aan), uit te zetten bij een
mediabibliotheek waar dit in de honderden gigabytes loopt
- apps/newt en apps/pangolin. Server Up had al een Pangolin-integratie met een
publiceerknop per stack, maar je moest Pangolin zelf elders vandaan halen
- Nieuwe stap in de setup-wizard na git: koppelen aan een bestaande Pangolin,
hier installeren, of overslaan. De wizard hing zijn afhandeling aan
stapnummers, dus met een stap ertussen ging de git-stap mis; dat gaat nu op de
naam van de stap
- depends_on waarschuwt nu ook op de stackpagina. Haal je Mosquitto later weg,
dan viel Zigbee2MQTT stil zonder dat iets zei waarom
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9eqpADJSRs49SoGGr4NAy
- Nieuwe metadata-sleutel depends_on: een sjabloon kan zeggen welke andere app
het nodig heeft en waarom. Het installatiescherm toont dat voor het invullen,
met een knop naar dat sjabloon. Advies, geen blokkade -- de broker of Home
Assistant kan net zo goed op een andere machine staan
- De reden is verplicht; een waarschuwing zonder uitleg klik je weg. De korte
vorm ["mosquitto"] werkt ook, voor sjablonen uit externe repo's
- Toegepast op acht sjablonen waar het gemis onzichtbaar was: zigbee2mqtt,
alloy, alertmanager, node-exporter, cadvisor, collabora, double-take, soularr.
Niet op element, open-webui, exportarr, unpackerr en onlyoffice: die werken
met meerdere alternatieven, en depends_on kent geen "een van deze"
- Vijftien domotica-apps, van 12 naar 27 in die categorie: Piper, Whisper en
openWakeWord (spraakbediening van Home Assistant, tot nu toe volledig
afwezig), Matter Server, Matter Hub, AppDaemon, go2rtc, Double Take,
Domoticz, openHAB, DSMR-reader (P1-poort slimme meter), rtl_433 (433 MHz
sensoren naar MQTT), Traccar, Snapcast en EMQX
- Catalogus van 241 naar 256 apps; alle 285 images gecontroleerd
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9eqpADJSRs49SoGGr4NAy
- apps/prometheus was kapot: het koppelde een lege map op /etc/prometheus en
startte met --config.file naar een bestand dat er nooit kwam. Er zit nu een
startconfiguratie bij, met koppelvelden naar node-exporter en cAdvisor
- De meeste apps van deze ronde zijn de ontbrekende helft van wat er al stond:
node-exporter, cAdvisor en Alertmanager maken Prometheus bruikbaar; Loki en
Alloy bewaren logs waar Dozzle alleen live meekijkt; Unbound zoekt DNS zelf op
in plaats van door te vragen aan Google of Cloudflare
- Domeinen die ontbraken: evcc (energie), Healthchecks (cronbewaking),
Infisical (geheimen voor applicaties), Music Assistant, pgAdmin
- Verder Crafty, Manyfold, ErsatzTV, FitTrackee, ComfyUI, Omada, en de zwaardere
Zabbix, Graylog, Wazuh, NetBox, Seafile en OpenCloud. Van 218 naar 241 apps
- Nieuw tools/controleer_images.py: controleert of elk image echt bestaat. De
ad-hoc versie draaide met zestien verzoeken tegelijk en meldde negen
ontbrekende images die alle negen wel bestonden -- registries knijpen af, en
dat is niet te onderscheiden van een ontbrekend image. Nu vier tegelijk met
opnieuw proberen, en als stap in de drie workflows
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9eqpADJSRs49SoGGr4NAy
- Sjablonen kunnen nu secret_format ("hex" of "laravel") en secret_bytes
opgeven. De generator maakte altijd url-veilige base64, en dat is precies wat
Laravel, Homarr en LibreChat weigeren
- Daarmee kwamen twee fouten uit v0.8.00 aan het licht: Homarr en LibreChat
kregen sleutels die hun containers niet accepteren. Rechtgezet
- Snipe-IT en Invoice Ninja alsnog toegevoegd; die vielen vorige ronde af omdat
hun APP_KEY niet te genereren was
- 19 vervangers voor big tech erbij, van 197 naar 218 apps:
Baikal en Radicale (Google Agenda/Contacten), LibreTranslate (Translate),
CryptPad, Collabora en ONLYOFFICE (Google Docs), Formbricks (Forms),
Jitsi Meet (Meet/Zoom), PeerTube, Invidious en Tube Archivist (YouTube),
Owncast (Twitch), Mastodon (X), Pixelfed (Instagram), Lemmy (Reddit),
Cal.com (Calendly), Rallly (Doodle), DocuSeal (DocuSign), Penpot (Figma)
- Communicatie van 12 naar 16 apps, productiviteit van 21 naar 31
- Nieuwe JS-test voor de sleutelformaten; alle 242 images in de catalogus
opnieuw tegen hun registry gecontroleerd
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9eqpADJSRs49SoGGr4NAy
- Catalogus van 142 naar 197 apps. Het zwaartepunt lag na het ARR-werk op media
(42 apps) terwijl communicatie er 4 had, AI 4, financien 3 en foto's 2
- Drie nieuwe categorieen: Statistiek, Zakelijk en Spellen
- Homelab-gereedschap: Dockge, Komodo, Glance, Gatus, Scrutiny, Backrest,
Headscale, Zoraxy, CrowdSec, NetAlertX, Pocket ID, Authentik
- Communicatie van 4 naar 12: Mattermost, Synapse, Element, Listmonk, Mumble,
Roundcube, Stalwart
- Notities: Outline, Trilium, SilverBullet, Readeck, Docmost, Kiwix
- Verder LibreChat, AnythingLLM, LocalAI, Ghostfolio, Wallos, Maybe, Lychee,
Piwigo, Homebox, wger, Donetick, Dawarich, Gitea, Adminer, code-server,
Woodpecker, Semaphore, Opengist, MinIO, Pingvin Share, Umami, Matomo, Odoo,
FreeScout, EspoCRM, RomM, Minecraft, Leantime, PrivateBin, Emby, ConvertX
- Drie bestaande apps waren niet installeerbaar: Forgejo wees naar een
latest-tag die dat project niet publiceert, Planka naar een tag 1 die niet
bestaat, en Baby Buddy naar een ghcr-pad dat er niet is. Gevonden door alle
213 images in de catalogus langs de registries te halen
- Twee testregels waren te krap: een config.yaml in files/ die geen compose is
telde niet mee voor "veld wordt gebruikt", en geheimen die de gebruiker zelf
aanlevert stonden in een handmatige namenlijst. Dat laatste is nu een vlag in
het sjabloon: "eigen_invoer": true
- Nieuwe controles voor de 36 apps met een eigen database: elke extra container
draagt de servicenaam als voorvoegsel, geen vaste databasewachtwoorden, en er
wacht altijd iemand met depends_on op de database
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9eqpADJSRs49SoGGr4NAy
- 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
Invulmenu:
- Vaste stappen (Basis, Verbinden, Instellingen, Toegang, Controleren) in
plaats van één lange lijst. Eén stap per groep werkt niet: de mediane app
heeft één groep, arr-stack eenentwintig. Lege stappen worden overgeslagen.
- Volgende controleert de verplichte velden van die stap; die melding kwam
eerder pas bij het installeren.
- Geavanceerde opties achter één schakelaar die op elke stap zichtbaar is,
plus 'Alles op één pagina' voor het oude gedrag. Beide onthouden.
Geheimen naar .env:
- compose_transform.geheimen_naar_env() vervangt geheime waarden door
${NAAM} en schrijft ze naar .env met rechten 0600. Werkt ook midden in
een database-URL. Poorten en paden blijven leesbaar in compose.
- .serverup.json bevat geen geheimen meer en krijgt ook 0600; daar stonden
ze wereldleesbaar in. Het herconfiguratieformulier leest ze terug uit
.env via een bewaarde veld-naar-sleutel-koppeling.
- docs/beveiliging.md legt uit wat dit niet oplost: docker inspect toont de
waarde nog steeds.
Bewerken:
- Laatste stap toont het gerenderde resultaat met jouw waarden en is
bewerkbaar; compose_override/env_override gaan mee bij het installeren.
Ongeldige YAML wordt geweigerd voordat er een map bestaat.
- De bestaande editor heeft tabbladen (compose/.env) en biedt herstarten na
opslaan. De .env-PUT weigert een regel zonder '=' en logt in audit.
Inloggegevens:
- /api/stacks/<n>/credentials plus paneel op de stackkaart: adres,
gebruikersnaam, wachtwoord achter een oog-knop, kopieerknop. Alleen voor
beheerders, elk bekijken komt in het auditlog.
- Nieuw 'credential'-kenmerk in template.json met naamherkenning als
terugval, zodat de bestaande 96 sjablonen meteen werken.
Herstel van een regressie uit v0.7.60: acht inlogwachtwoorden hadden hun
genereerknop verloren toen die aan 'generate' werd gehangen. Terug, behalve
waar een verzonnen waarde fout is (WireGuard-sleutel, externe tokens).
De menulogica wordt getest door de echte component uit index.html in Node uit
te voeren; slaat zichzelf over waar node ontbreekt. 2295 tests groen.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
Aanleiding: Homepage weigerde met "Host validation failed" omdat de
standaardwaarde van allowed_hosts poort 3001 noemde terwijl het poortveld op
3002 stond. Alle 96 sjablonen zijn daarop nagelopen.
Systemisch:
- De dobbelsteenknop, waar zeventien apps in hun uitleg naar verwijzen,
verscheen nooit: hij hing af van een veld 'secret' dat fields() niet
meestuurde. Wachtwoorden stonden daardoor leesbaar in het formulier.
- 27 velden die je toch nooit zelf typt (databasewachtwoorden, JWT- en
versleutelingssleutels) worden nu voorgevuld met een willekeurige waarde.
Inlogwachtwoorden krijgen alleen een knop, want die moet je noteren.
- De knop hangt nu aan 'generate' in plaats van aan 'secret': voor een
WireGuard-privésleutel of een token uit een andere app is een verzonnen
waarde juist fout.
- required werd nergens gecontroleerd. Je kon installeren met een leeg
databasewachtwoord of een lege sleutel. Nu geweigerd bij installeren en bij
herconfigureren, met vermelding van de lege velden. Velden achter een
uitgeschakelde groepsschakelaar tellen niet mee.
- Wachtwoorden werden uitgeschreven in het installatielog; nu gemaskeerd.
Losse fouten:
- homepage: allowed_hosts stond op localhost:3001, nu * met uitleg.
- baserow, hedgedoc, ntfy: URL in de standaardwaarde wees naar een poort waar
niets luistert.
- Vast wachtwoord in acht sjablonen weggehaald: ghost, immich, miniflux,
paperless-ngx, unifi-network en vikunja kregen allemaal dezelfde
database-wachtwoorden; grafana en gotify stonden op 'admin'.
- data_dir bij keycloak, metube, miniflux en teslamate stond in het formulier
maar kwam nergens terecht (die apps gebruiken een Docker-volume).
- puid/pgid bij freshrss: het image kent ze niet.
- prometheus gaf de gevraagde tijdzone niet door.
Nieuw tests/test_app_templates.py: rendert elke app met zijn standaardwaarden
en controleert ongedefinieerde variabelen, velden zonder werking,
niet-gedeclareerde volumes, depends_on, dubbele containernamen,
poortconflicten, poortnummers in standaardwaarden en vaste wachtwoorden.
2236 tests groen.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
- Nieuw core/categories.py: zeventien categorieen, elk met naam (nl/en), kleur
en pictogram. Kleuren zijn middentonen die in licht en donker leesbaar zijn;
de interface gebruikt ze als tekstkleur op een doorzichtige variant.
- Alle 96 apps ingedeeld via metadata.categories. Een app mag in meerdere
categorieen zitten; 39 apps doen dat (Frigate onder domotica en media,
Immich onder fotos en opslag, Kavita onder media en documenten).
- Apps uit externe repos geven geen categorieen op; die worden afgeleid uit
tags en omschrijving, zodat ook zij een kleur en een plek in het filter
krijgen.
- App store: gekleurde categoriebalk met aantallen, klikbare badges per app,
werkt naast het bestaande zoekveld en de tagfilters.
- Stackslijst: dezelfde balk met alleen de categorieen die je draait, gekleurde
rand per kaart en klikbare badges.
- Nieuw /api/categories geeft de definities met kleur, zodat interface en
backend dezelfde kleur voor dezelfde categorie gebruiken. /api/stacks geeft
de categorieen mee; een stack van voor deze versie valt terug op "overig"
in plaats van kleurloos te blijven.
- Tests: elke app heeft geldige categorieen, kleuren zijn uniek, en er staat
geen categorie in het filter zonder apps.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
Apps onderling verbinden:
- Elke stack draaide als eigen compose-project met een eigen netwerk, waardoor
stacks elkaar niet op naam konden bereiken. Bij installeren staat nu
"Verbinden met andere apps" aan: de stack komt op een gedeeld bridge-netwerk
(SHARED_NETWORK, standaard "serverup") dat op aanvraag wordt aangemaakt.
- compose_transform.add_shared_network() hangt elke service eraan en laat
bestaande netwerken staan, dus het werkt samen met een macvlan-adres.
- Nieuw /api/apps/connectable geeft de geinstalleerde apps met hun
containernamen, zodat de installatiemodal kan laten kiezen.
Kiezen in plaats van typen:
- Een veld met "connect": {"app": "mosquitto", "scheme": "mqtt", "port": 1883}
toont een keuzelijst met wat er al draait, met handmatig invullen als
terugval. Toegepast op zigbee2mqtt -> mosquitto en open-webui -> ollama.
- Is de doel-app nog niet geinstalleerd, dan zegt het veld dat.
Uitleg per instelling:
- Info-icoon per veld opent een blok met de volledige uitleg plus de
standaardwaarde. Uitgeschreven voor de instellingen die de meeste vragen
oproepen (downloadmap vs mediamap, shm_size bij frigate, poort 80 bij caddy,
PUID bij de arr-stack, GPU bij ollama, publiek adres bij wg-easy).
Geavanceerde opties:
- advanced: true op een veld of groep zet het achter een uitklapblok met
teller. Toegepast op wachtwoorden, PUID/PGID, USB-paden en bewaartermijnen
van 28 apps.
- Test bewaakt dat elke app zichtbare velden overhoudt en dat koppelvelden naar
een bestaande app verwijzen.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
Van 65 naar 96 apps. Selectie op basis van awesome-selfhosted, selfh.st,
Perfect Media Server en een paar overzichtslijsten van 2026, aangevuld met de
gaten in de bestaande collectie.
- Monitoring: prometheus, influxdb, netdata, beszel
- Proxy: caddy
- Notities/kennis: memos, hedgedoc, wikijs, excalidraw, karakeep
- Data: nocodb, baserow, metabase
- Identiteit: authelia, keycloak
- Media: komga, photoprism, metube, pinchflat
- Meldingen: ntfy
- Productiviteit: planka, focalboard, kimai
- Locatie/voertuig: owntracks, teslamate
- Hulpmiddelen: shlink, cyberchef, languagetool, kopia
- AI: ollama, open-webui
Prometheus ontbrak terwijl Grafana er al stond; Authelia en Keycloak sluiten
aan op de reverse-proxy-SSO die Server Up zelf ondersteunt.
De images van de nieuwere apps (beszel, karakeep, pinchflat) zijn nagetrokken
bij de bron in plaats van uit het hoofd opgeschreven. Van karakeep is de
officiele compose overgenomen inclusief de meilisearch- en chrome-containers.
Vijftien poortbotsingen met bestaande apps automatisch rechtgezet. Caddy deelt
80/443 met traefik en nginx-proxy-manager (alternatieven voor dezelfde taak) en
staat daarvoor in de allowlist.
705 tests groen; elke app rendert naar geldige compose-YAML met gedeclareerde
volumes en zonder onvervangen variabelen.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
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
Bij het toevoegen van de apps kwam een bestaande fout boven water.
_drop_empty_mappings ruimt sleutels op die een <% if %>-blok leeg achterlaat,
maar een named volume wordt gedeclareerd als een kale sleutel zonder waarde
(` immich_pgdata:`). Die werd opgeruimd, waarna ook het bovenliggende
`volumes:` wegviel en de services verwezen naar een volume dat nergens meer
gedeclareerd stond. Immich, Ghost, Miniflux, Paperless-ngx, Unifi Network en
Vikunja waren daardoor niet installeerbaar: docker compose weigert met "refers
to undefined volume". Alleen bekende compose-sleutels worden nu opgeruimd.
29 nieuwe apps (teller op 65):
- Domotica: zigbee2mqtt, mosquitto, esphome, node-red, zwave-js-ui,
homebridge, scrypted, frigate
- 3D-printen: bambuddy, octoprint, spoolman
- Gezin/huishouden: baby-buddy, grocy, tandoor, firefly-iii
- Media: audiobookshelf, navidrome, kavita, calibre-web, jellyseerr
- Kennis: bookstack, freshrss, wallabag
- Netwerk/beheer: wg-easy, homepage, searxng, duplicati, watchtower,
technitium-dns
Nieuwe tests/test_apps.py rendert elke app met de echte engine en controleert
geldige YAML, image of build per service, gedeclareerde named volumes, geen
onvervangen variabelen en geen onbedoeld dubbele standaardpoorten. Die laatste
vond zeven botsingen tussen nieuwe en bestaande apps; rechtgezet. Logische
botsingen (reverse proxies op 80/443, dns-blokkers op 53) staan met uitleg in
een allowlist.
Het image van Bambuddy is nagetrokken op de bron
(github.com/maziggy/bambuddy): ghcr.io/maziggy/bambuddy, poort 8000.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb