De knop Volgende deed niets. Alpine haalt een boolean-attribuut alleen weg bij
null, undefined of false; het getal 0 zet het juist AAN. Mijn
:disabled="stepMissing().length" gaf bij een ingevuld formulier 0 en zette de
knop dus permanent uit. De logica klopte, de binding niet — met losse logica
niet te vinden, dus er draait nu een test die de echte modal met Alpine in een
DOM rendert en erop klikt.
Tijdzones:
- Nieuwe instelling TIMEZONE, standaard die van de server (TZ, /etc/timezone,
/etc/localtime). In alle 77 sjablonen stond Europe/Amsterdam hard ingevuld.
- Apps zonder tijdzoneveld krijgen TZ er automatisch bij; die draaiden in UTC.
Poorten:
- _bezette_poorten() telt nu ook mee waar de host zelf op luistert, gelezen uit
/proc/net/tcp in een hulpcontainer met --network host. Een nginx buiten
Docker zag Server Up eerder niet.
- GET /api/ports/check geeft vrij/bezet plus een alternatief, en meldt of de
host echt gecontroleerd kon worden.
Netwerken:
- APP_NETWORKS: meerdere gedeelde bridge-netwerken in plaats van één waar élke
app aan hing. Per app kies je welke; aanmaken kan vanuit het invulmenu, met
eigen naam of een voorstel (su-<appnaam>).
- add_shared_network() accepteert een lijst; één naam blijft werken.
- GET /api/networks/<n>/ip-check controleert subnet, bereik, Docker-toewijzing
en de ARP-tabel van de host (vangt een fysiek apparaat met DHCP-adres) en
stelt een vrij adres voor.
Pangolin (nieuw, core/pangolin.py):
- Publieke URL per app via een tunnel, zonder poorten open te zetten.
- De API veranderde in 1.9 (resource hing onder een site, staat nu los); beide
routes worden geprobeerd en bij een fout krijg je beide meldingen.
- API-sleutel is write-only. Getest tegen een nagebouwde API, niet tegen een
echte server.
Nieuw: docs/pangolin.md; docs/netwerken.md uitgebreid. 2369 tests groen.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
- Automatische detectie van het hostnetwerk: interface, subnet, gateway en een
voorgestelde vrije IP-range worden bovenaan het formulier getoond en vullen
met een klik alles in.
- Detectie gebeurt via een kortstondige container in de netwerknamespace van de
host, die de routetabel uitleest. Dat repareert meteen een fout: de vorige
host_interfaces() las /sys/class/net binnen de container en toonde dus de
bridge-interface van de container in plaats van de netwerkkaart van de host.
- Live beoordeling terwijl je typt (nieuwe endpoint /api/networks/review): laat
zien hoeveel adressen je overhoudt en welke, en legt in gewone taal uit wat er
niet klopt. Onderscheid tussen blokkerende fouten en waarschuwingen.
- Knop die een vrij blok voorstelt op basis van het subnet, met de gateway
ontweken.
- Uitklapbare uitleg in het formulier over hoe subnet, gateway, IP-range en
host-interface samenhangen, met voorbeeld.
- docs/netwerken.md uitgebreid met een schema van de adresverdeling, een tabel
met veelgebruikte ranges, en de nadruk op het punt dat het instellen van de
range in Server Up niets aan de router doet: daar moet het DHCP-bereik zelf
verkleind worden.
- Bijgesteld tijdens het testen: een gateway binnen het subnet is de normale
situatie en gold ten onrechte als fout wanneer er geen eigen range was
opgegeven. Nu alleen een waarschuwing bij een expliciete range.
- 248 tests (21 nieuwe).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
- Beheer per container: de stackkaart klapt uit naar de losse containers, met
start/stop/herstart, logs en live CPU-/geheugengebruik per container. De
containernaam wordt getoetst aan compose_ps van díé stack, zodat de route
geen willekeurige container op de host kan raken.
- Stacks met een eigen IP-adres (macvlan/ipvlan): netwerkbeheer onder
Instellingen → Netwerken, netwerkkeuze in de installatiemodal met voorstel
voor het eerstvolgende vrije adres, en automatische omzetting van het
gerenderde compose-bestand (poortmappings eruit, ipv4_address erin). De
templates in apps/ blijven ongewijzigd.
- Toegekende IP's worden vastgehouden in .serverup.json en getoond op de
stackkaart, zodat een volgende installatie ze niet opnieuw uitdeelt.
- Vrije poort voorstellen bij installeren: next_free_port() bestond al maar
werd nergens gebruikt. Bezette poorten worden in de UI gemeld.
- Genereerknop voor velden die op een geheim wijzen (token/password/secret),
lokaal gegenereerd via crypto.getRandomValues.
- Compose valideren met `docker compose config` vóór het wegschrijven, zowel
bij de editor als na het renderen bij installatie. Ontbreekt de compose-CLI,
dan blokkeert dat een installatie niet.
- Uitloggen in de zijbalk; gebruikersbeheer en wachtwoord wijzigen onder
Instellingen → Beveiliging.
- docs/netwerken.md (incl. de shim-interface die de host nodig heeft om zijn
eigen macvlan-containers te bereiken) en docs/beveiliging.md toegevoegd.
- CHANGELOG bijgewerkt; testsuite uitgebreid naar 112 tests.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb