Commit graph

104 commits

Author SHA1 Message Date
Ramon
b8c8e89fa0 v0.6.00-beta - 29 apps erbij, en named volumes die verdwenen
All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 1m5s
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
2026-07-27 08:23:58 +02:00
Ramon
7f0d34cb1a v0.5.50-beta - containers tonen die niet bij een beheerde stack horen
All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 1m5s
Het dashboard meldde 13 actieve containers en 17 images terwijl die nergens
terug te vinden waren. De tellers komen van `docker info` (de hele daemon), de
stacklijst toont alleen mappen in LIBRARY_DIR met een compose-bestand. Alles wat
buiten Server Up om gestart is telde dus wel mee maar was onzichtbaar.

- Nieuw /api/containers: alle containers op de host, met per container of hij
  bij een beheerde stack hoort (compose-project of werkmap onder LIBRARY_DIR).
- Blok "Overige containers" onder de stacklijst, met start/stop/herstart/logs.
- Dashboardteller "actief" vermeldt nu hoeveel daarvan via Server Up loopt.
- De eigen container is gemarkeerd en kan niet via dit blok gestopt worden;
  daarvoor blijft de herstartknop in de instellingen.
- Rollen: een viewer ziet de lijst maar mag niets bedienen.

Verholpen tijdens het bouwen: containers zonder poorten en zonder
compose-labels vielen uit de lijst als ze als laatste regel stonden, doordat
strip() de lege velden aan het eind wegnam en de regel daarna te weinig
kolommen leek te hebben.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
2026-07-27 07:57:35 +02:00
Ramon
34a48fb74a ci: deploy mag niet stranden op een .env van een andere gebruiker
All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 1m30s
De stap "Instellingen en versie klaarzetten" faalde op `touch: cannot touch
'.env': Permission denied`. Het bestand was met sudo aangemaakt en dus van
root, terwijl de runner als een gewone gebruiker draait. Daarmee brak de hele
deploy af op iets dat geen blokkade hoort te zijn.

- SU_TAG wordt nu altijd via de omgeving aan `docker compose` meegegeven
  (export SU_TAG). Het wegschrijven in .env blijft de voorkeur, omdat het een
  handmatige `docker compose up` overleeft, maar het is niet meer nodig om te
  kunnen deployen.
- Is .env niet schrijfbaar, dan meldt de log wie de eigenaar is en welk
  chown-commando dat rechtzet, en loopt de deploy gewoon door.
- Het aanmaken vanuit .env.example faalt niet meer hard.

Positief neveneffect van de vorige fix: de log toont nu "Werkmap:
/opt/docker/server-up", dus de cd landt op de juiste plek.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
2026-07-27 00:46:30 +02:00
Ramon
cb04c4a7ad v0.5.45-beta - wizard-knop toegevoegd in Instellingen
Some checks failed
Deploy server-up (dev) / deploy (push) Failing after 25s
De wizard was alleen te zien bij een verse installatie: zodra hij een keer was
afgerond, was er geen enkele manier meer om hem te openen. De vertaalsleutels
wizard_open en wizard_reset bestonden al, en /api/wizard/reset werkte ook, maar
de knop is nooit gebouwd - ook niet in v0.4.60.

- Blok "Setup Wizard" onder Instellingen met "Wizard openen" en "Opnieuw
  uitvoeren". Dat laatste zet WIZARD_DONE terug en opent hem meteen.
- openWizard() staat los van checkWizard(), zodat handmatig openen niet meer
  afhangt van of de wizard al gedraaid heeft. Stap wordt op 0 gezet.
- Sluitknop in de wizard zelf; die kon je eerder alleen verlaten door hem
  helemaal af te ronden.
- De staptitels lopen nu via t() in plaats van harde Nederlandse teksten.

De wizard-stappen zelf zijn end-to-end nagelopen tegen een draaiende instantie
(paths, git, sync, complete, reset): alle endpoints geven 200.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
2026-07-27 00:39:35 +02:00
Ramon
dea949a003 v0.5.44-beta - gedetecteerd netwerk verdween uit het formulier
Some checks failed
Deploy server-up (dev) / deploy (push) Failing after 22s
Zodra je een netwerk had toegevoegd, was het blok "gevonden op deze server" leeg
bij een volgende poging. Ik filterde subnetten eruit die al geconfigureerd
waren, met de gedachte "niet nog een keer voorstellen". Dat pakt verkeerd uit:
je kunt prima een tweede netwerk op hetzelfde subnet willen met een andere
range, en de gegevens zijn sowieso handig om te kunnen naslaan. Zonder dat blok
lijkt het formulier bovendien kapot.

- Gedetecteerde netwerken blijven altijd staan; ze krijgen een vlag
  'configured' en tonen 'al toegevoegd' in plaats van 'gebruiken'.
- Levert de detectie niets op zonder dat er een fout is, dan staat er nu een
  uitleg in plaats van een leeg blok.
- Regressietest die het blok controleert voor en na het aanmaken.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
2026-07-27 00:34:22 +02:00
Ramon
eb52c2ac41 ci: expliciete cd in plaats van working-directory, en de deploy-map loggen
All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 23s
.env verschijnt niet in de deploy-map en BIND moet nog steeds in
docker-compose.yml worden aangepast. De stappen die .env aanmaken, VERSION
schrijven en compose draaien vertrouwden alle drie op 'working-directory:'.
Wordt dat door de runner niet toegepast, dan belanden die bestanden in de
werkmap van de runner en draait de container vanaf de compose daar - terwijl
de rsync (die een expliciet pad gebruikt) wel netjes naar /opt/docker/server-up
schrijft. Dat verklaart precies wat er gemeld wordt.

- Alle stappen doen nu 'cd "$DEPLOY_DIR"' in het script zelf.
- De run-log toont de werkmap, de inhoud van .env, de compose-projectmap
  volgens de draaiende container en de daadwerkelijke poortbinding. Daarmee is
  in de log te zien waar alles landt in plaats van het te moeten raden.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
2026-07-27 00:18:55 +02:00
Ramon
8da53aba6f changelog: weggevallen tekst herstellen (backticks door de shell opgegeten)
All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 1m17s
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
2026-07-27 00:14:18 +02:00
Ramon
b30f83866f v0.5.43-beta - van-tot omrekenen naar een CIDR-blok
Some checks failed
Deploy server-up (dev) / deploy (push) Has been cancelled
"Ik wil van 10.0.20.200 tot .254" bestaat niet als CIDR-notatie: 55 adressen,
terwijl Docker alleen uitgelijnde blokken van een macht van twee accepteert.
Dat is niet iets wat een gebruiker zelf hoort uit te rekenen.

- Nieuwe range_options(): vertaalt een gewenst begin- en eindadres naar twee
  bruikbare blokken. "Ruim" is het kleinste blok dat de hele wens omvat,
  "krap" het grootste blok dat er volledig binnen valt. Met per optie hoeveel
  adressen erbij komen of ontbreken.
- Endpoint POST /api/networks/range en een uitklapbare van-tot-hulp onder het
  IP-range-veld; klikken op een optie vult het veld.
- Voor 10.0.20.200-254 levert dat 10.0.20.192/26 op: 62 adressen, .193 t/m .254.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
2026-07-27 00:13:53 +02:00
Ramon
cbb232d63f v0.5.42-beta - netwerk toevoegen: twee blokkades weg
All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 1m3s
Gemeld met twee screenshots: een foutmelding dat de IP-range buiten het subnet
lag terwijl 10.0.20.240/28 gewoon binnen 10.0.20.0/24 valt, en een geval zonder
melding waarbij aanmaken toch niet lukte. Twee losse oorzaken.

1. Verouderd beoordelingsantwoord
   De live beoordeling gaat af bij elke toetsaanslag. Tijdens het typen van
   /28 kom je langs /2, en 10.0.20.240/2 normaliseert naar 0.0.0.0/2 - buiten
   het subnet. Kwam dat antwoord na het goede binnen, dan bleef die fout staan
   en bleef de knop uit.
   - Volgnummer op de verzoeken; alleen het antwoord bij de laatste vraag telt.
   - Knop niet meer uitgeschakeld op clientstatus; de server beslist bij het
     opslaan, zodat een verouderde beoordeling nooit blokkeert.

2. CIDR met hostbits
   10.0.20.200/28 leest Python met strict=False als 10.0.20.192/28, maar Docker
   weigert het met "has host bits set". We valideerden soepel en stuurden de
   ruwe tekst door, dus de interface keurde iets goed dat bij het aanmaken
   alsnog strandde.
   - normalize() zet subnet en ip_range om naar canonieke vorm voor ze naar
     Docker gaan en voor ze worden opgeslagen.
   - Waarschuwing die toont wat er van de invoer gemaakt is.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
2026-07-27 00:06:12 +02:00
Ramon
923c8dabee ci: .env aanmaken vanuit .env.example bij de deploy
All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 39s
BIND bleef niet staan. Oorzaak: docker-compose.yml staat in Git, dus rsync zet
dat bestand bij elke deploy terug; een wijziging daarin op de server houdt het
nooit. De juiste plek is .env ernaast, maar dat bestand bevatte na een deploy
alleen een kale SU_TAG-regel en was daarmee niet vindbaar.

- Bestaat er nog geen .env, dan zet de deploy hem op vanuit .env.example, met
  alle instellingen erin en uitleg per sleutel. Een bestaande .env blijft
  ongemoeid (rsync slaat hem al over sinds 6d5453e).
- De deploy logt nu welke instellingen actief zijn, zodat je in de run-log ziet
  wat er staat.
- Waarschuwing in docker-compose.yml zelf dat je BIND daar niet moet aanpassen
  maar in .env. Dat bestand wordt toch elke deploy teruggezet, dus de tip staat
  er altijd.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
2026-07-26 23:57:34 +02:00
Ramon
4346fefe4d v0.5.41-beta - netwerk toevoegen liep vast tijdens het typen
All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 1m10s
JSON-parsefout in de browser bij het toevoegen van een netwerk.

De live beoordeling die bij elke toetsaanslag afgaat, bouwde een lijst van alle
bruikbare adressen in het bereik. Tijdens het intypen van 192.168.1.0/24 is de
tussenstand 192.168.1.0/2 een geldig netwerk met 1.073.741.824 adressen; het
verzoek liep daarop vast en de browser kreeg geen JSON terug.

- review() rekent eerste adres, laatste adres en aantal nu uit via
  num_addresses in plaats van hosts() te doorlopen. Alle prefixes van /1 tot
  /32 antwoorden binnen 0,05 seconde.
- suggest_range() had hetzelfde probleem: die somde alle /28-blokken op, bij
  een /8 ruim een miljoen. Rekent nu van achteren naar voren, hoogstens
  zestien stappen.
- Waarschuwing bij meer dan 4096 adressen in het bereik; dat is vrijwel altijd
  een typefout in het prefix.
- Tests met /1 t/m /32, inclusief een vergelijking van _bruikbaar_bereik() met
  de uitkomst van hosts() uit de stdlib, en tijdslimieten zodat een
  herintroductie meteen opvalt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
2026-07-26 23:42:56 +02:00
Ramon
866c5b8c1e .env.example toevoegen met alle instellingen erin
Some checks are pending
Deploy server-up (dev) / deploy (push) Waiting to run
Nergens stond bij elkaar welke sleutels in het .env van de deploy-map horen.
BIND kwam alleen in docs/beveiliging.md voor, SU_IMAGE en SU_TAG alleen in
docs/updates.md, en de rest nergens.

- .env.example met BIND, PORT, SU_TAG, SU_IMAGE, BASE_DIR, SU_HTTPS,
  SU_BOOT_REPOS en SU_DEBUG, elk met uitleg wanneer je ze nodig hebt.
- docs/beveiliging.md wijst er nu naar, met de concrete stappen om de interface
  van buiten de server bereikbaar te maken.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
2026-07-26 23:35:11 +02:00
Ramon
6d5453ed70 ci: .env van de deploy-map niet meer wissen bij elke deploy
All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 22s
.env staat in .gitignore, dus de checkout bevat er geen. De rsync-stap draait
met --delete, waardoor /opt/docker/server-up/.env bij elke deploy verdween --
inclusief BIND, PORT en SU_IMAGE die de beheerder daar had gezet.

SU_TAG werd daarna wel opnieuw geschreven, dus dat viel niet op, maar een
BIND=0.0.0.0 raakte je elke run kwijt en daarmee de bereikbaarheid van de
interface van buiten de server.

--exclude='.env' toegevoegd in deploy.yml en deploy-prod.yml.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
2026-07-26 23:27:49 +02:00
Ramon
576ee17a61 Duidelijker maken waarom de updateknop uit staat bij een zelfgebouwd image
All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 41s
Op een server die zelf bouwt (SU_IMAGE leeg, zoals de dev-server na een
deploy-run) draait het image als 'server-up:<versie>'. Zonder registry-pad valt
er niets op te halen, dus de knop staat uit. De melding verwees alleen naar
UPDATE_IMAGE, terwijl het juiste antwoord daar is: die server werkt al bij via
Git.

- status() geeft nu een 'mode' terug (registry / local-build / no-compose /
  no-container) en de melding bij local-build noemt beide routes: pushen naar
  de branch of de deploy-workflow starten, en als alternatief SU_IMAGE.
- De UI toont dat geval als informatie in plaats van als waarschuwing; het is
  de normale opzet, geen storing.
- docs/updates.md: tabel met de twee manieren van bijwerken en de waarschuwing
  om ze niet door elkaar te gebruiken op dezelfde server, omdat de
  deploy-workflow en de updateknop allebei SU_TAG in .env schrijven.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
2026-07-26 23:23:30 +02:00
Ramon
a1fb5f5a8f v0.5.40-beta - netwerken instellen zonder uitzoekwerk
All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 1m11s
- 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
2026-07-26 23:16:52 +02:00
Ramon
342b2ee9e5 ci: tests in een container draaien in plaats van een venv op de runner
All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 1m38s
De testsstap die ik in v0.5.00 toevoegde blokkeerde de deploy: de runner heeft
geen python3-venv, dus `python3 -m venv` faalde en alle volgende stappen werden
overgeslagen.

- Tests draaien nu in python:3.12-slim via docker, dat de runner sowieso heeft.
  Bijkomend voordeel: dezelfde Python-versie als waarop de app in productie
  draait, in plaats van wat er toevallig op de runner staat.
- PYTHONDONTWRITEBYTECODE en -p no:cacheprovider voorkomen dat de container
  root-eigen __pycache__/.pytest_cache in de werkmap achterlaat, wat de
  rsync-stap en volgende checkouts zou kunnen hinderen.
- Pip-cache in een named volume, zodat een herhaalde run niet opnieuw downloadt.

Toegepast in deploy.yml, deploy-prod.yml en build.yml.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
2026-07-26 22:34:14 +02:00
Ramon
f40fd39ed9 v0.5.30-beta - rollen, app-store-filter en twee planningsfouten
Some checks failed
Deploy server-up (dev) / deploy (push) Failing after 2s
Rollen per gebruiker:
- Drie rollen: beheerder (alles), operator (stacks, containers en backups) en
  alleen lezen. Afgedwongen in de before_request-guard, niet alleen in de UI.
- Eigen wachtwoord wijzigen mag iedereen; de laatste beheerder kan niet
  gedegradeerd of verwijderd worden.
- Proxy-gebruikers zonder eigen account krijgen AUTH.proxy_role; bestaat er wel
  een lokaal account met die naam, dan wint dat account.
- Accounts van voor deze versie hebben geen rol en gelden als beheerder.

Rechtenescalatie verholpen:
- set_password verving het hele gebruikersrecord, waardoor het role-veld
  wegviel. Een ontbrekende rol geldt als beheerder (nodig voor bestaande
  accounts), dus elke operator of viewer kon zichzelf tot beheerder promoveren
  door zijn eigen wachtwoord te wijzigen. Gevonden bij het naspelen van de
  rollenflow tegen een draaiende instantie.

Geplande backups draaiden nooit:
- De scheduler stempelde ook taken af die zichzelf hadden overgeslagen. De
  backup-taak bewaakt zelf het ingestelde uur, dus die werd afgestempeld op het
  moment van de eerste tick; 24 uur later viel het volgende moment op precies
  dat verkeerde tijdstip. Een taak stempelt nu alleen af bij True. De
  backup-taak draait op een kort interval en beslist zelf, zodat een gewijzigde
  planning meteen werkt. BACKUP_SCHEDULE_DAY toegevoegd voor wekelijks.

Verder:
- Zoekveld en tagfilters in de app store; repo's zonder treffers vallen weg.
- Opstartcontrole op de meegeleverde front-end-bestanden: mislukt het downloaden
  tijdens de image-build, dan laadde de UI zonder opmaak terwijl de server prima
  leek te draaien. Nu een duidelijke melding in het log.
- 227 tests (15 nieuwe voor rollen, 15 voor de scheduler).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
2026-07-26 22:04:08 +02:00
Ramon
ae99df2fc7 v0.5.20-beta - complete backups en updates per app
Some checks failed
Deploy server-up (dev) / deploy (push) Failing after 6s
Backups (core/backups.py, core/scheduler.py):
- Terugzetten met een klik: stack stoppen, huidige map opzij, uitpakken,
  starten. Mislukt het uitpakken, dan wordt de oude situatie teruggeplaatst.
- Bewaarbeleid: aantal per stack en/of maximale leeftijd; de nieuwste backup
  van een stack blijft altijd staan.
- Geplande backups (dagelijks/wekelijks) via een eigen planner in de app, geen
  cron. Een gemiste ronde loopt bij de eerstvolgende gelegenheid alsnog.
- Automatisch een backup voor het bijwerken of verwijderen van een stack.
  Mislukt die, dan gaat de actie door - anders kun je een kapotte stack niet
  meer opruimen.
- Uitpakken met tarfile + filter="data": absolute paden en ..-ingangen worden
  geweigerd. Met een kaal `tar xzf` kon een geprepareerd archief buiten de
  stackmap schrijven.
- Twee bugs in de oude implementatie: de returncode van tar werd genegeerd
  (mislukte backup gold als succes) en backups binnen dezelfde seconde
  overschreven elkaar.

Updates per app (core/stackupdates.py, core/registry.py):
- Badge op de stackkaart als er een nieuwer image is; bijwerken doet de
  bestaande update-knop.
- Vergelijking via de Registry API v2 (Docker-Content-Digest) in plaats van
  `docker manifest inspect`: dat laatste geeft per platform een aparte digest
  terwijl RepoDigests de manifest-list-digest bevat, wat bij elk multi-arch
  image permanent "update beschikbaar" zou opleveren.
- Drie statussen: update / current / unknown. Lokaal gebouwd, nog niet gepulld
  of registry onbereikbaar geeft unknown en dus geen badge.
- Dagelijkse achtergrondcheck, resultaten 6 uur gecached.

Verder:
- docs/backups.md, met nadruk op wat er niet in een backup zit: de
  Docker-volumes met de eigenlijke appdata.
- Backup-instellingen onder Instellingen; backup-geschiedenis per stack.
- 197 tests groen (40 nieuwe).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
2026-07-26 19:54:51 +02:00
Ramon
fe7abce95b Vertalingen voor de nieuwe schermen + SSO-instelscherm
- De schermen die in v0.5.x zijn toegevoegd (login/setup, Beveiliging,
  Netwerken, Updates, containerpaneel, netwerkkeuze bij installeren) gebruikten
  harde Nederlandse teksten terwijl de rest van de UI via t() loopt. Op Engels
  gaf dat een mengelmoes. 80 nieuwe sleutels toegevoegd aan nl.json en en.json
  en alle literals vervangen.
- t() ondersteunt nu plaatshouders: t('port_taken', {port: 8080, suggested:
  8081}). Zo blijven zinnen heel in plaats van in losse stukjes geknipt.
- Nieuw instelscherm voor reverse-proxy-SSO onder Instellingen -> Beveiliging:
  modus lokaal/proxy/beide, identiteitsheader en de lijst met vertrouwde
  proxy-adressen. De backend (PUT /api/auth/mode) bestond al maar was alleen
  met curl te bereiken. Bij het omschakelen naar 'proxy' vraagt de UI om
  bevestiging, want die modus schakelt de lokale login uit.
- Nieuw tests/test_i18n.py: sleutelpariteit tussen nl en en, geen lege
  waarden, gelijke plaatshouders in beide talen, en een controle dat de UI
  geen t()-sleutels gebruikt die nergens gedefinieerd zijn. Die laatste vond
  meteen een fout in de eerste opzet.
- 157 tests groen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
2026-07-26 19:43:30 +02:00
Ramon
8ff5f4b1d3 v0.5.10-beta - update-systeem met kanalen en een-klik bijwerken
Some checks failed
Deploy server-up (dev) / deploy (push) Failing after 4s
- Update-kanalen stable/beta in plaats van het vinkje "pre-releases meenemen".
  Stable ziet alleen releases, beta ook pre-releases; een release telt hoger
  dan zijn eigen beta (0.5.10-beta1 < 0.5.10). UPDATE_INCLUDE_PRERELEASE
  migreert automatisch naar het beta-kanaal.
- Nieuw core/selfupdate.py: image uit de registry ophalen, SU_TAG wegschrijven
  en de eigen container laten hercreeren door een korte helper-container die op
  het nieuwe image draait (bevat de docker- en compose-CLI al). Een container
  kan zichzelf niet hercreeren, vandaar de helper.
- Deploy-map wordt uitgelezen uit de compose-labels van de eigen container.
  Ontbreken die, draait de container niet vanaf een registry-image of is de
  docker-socket er niet, dan meldt de UI waarom bijwerken niet kan.
- Vorige tag wordt onthouden; terugrolknop in de instellingen.
- Update-check een uur gecached, met geforceerde check via de knop; eerder deed
  elke paginalading een netwerkverzoek. Laatst-gecontroleerd zichtbaar.
- Registry-inloggegevens instelbaar; het token komt net als de git-tokens nooit
  terug via de API en leeg laten betekent ongewijzigd.
- docker-compose.yml gebruikt ${SU_IMAGE:-server-up}:${SU_TAG:-latest}; zonder
  SU_IMAGE blijft lokaal bouwen werken zoals voorheen.
- deploy-prod.yml bouwt en pusht het image in dezelfde job wanneer SU_IMAGE
  ingesteld is; build.yml is nu alleen handmatig. Bewust geen aparte
  build-workflow op dezelfde tag: bij een runner met een job tegelijk zou de
  deploy wachten op een build die zelf nog in de wachtrij staat.
- docs/updates.md: werking, complete Forgejo-instelling (registry, tokens,
  variables, secrets, runners), release-procedure voor stable en beta,
  terugrollen en probleemoplossing.
- Tests uitgebreid naar 148 (kanaallogica, cache, image-afleiding incl.
  registry-poortnummers, tag-validatie, .env-schrijven, tokenlek).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
2026-07-26 15:13:18 +02:00
Ramon
8b29553a71 v0.5.00-beta - containerbeheer, eigen IP-adressen, veiliger installeren
Some checks failed
Deploy server-up (dev) / deploy (push) Failing after 3s
- 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
2026-07-26 14:51:32 +02:00
Ramon
916e54a229 v0.5.00-beta - authenticatie + beveiligingsfixes
Server Up beheerde de Docker-daemon als root zonder enige vorm van
authenticatie: elke /api/*-route was gelijk aan root-toegang op de host.

- Authenticatie toegevoegd (core/auth.py): lokale accounts met scrypt-hash,
  sessiecookie (HttpOnly, SameSite=Strict) en optionele trusted-proxy-header
  SSO die alleen vanaf geconfigureerde proxy-IP's wordt vertrouwd.
- before_request-guard schermt alle API-routes af; loginscherm en
  eerste-account-setup in de UI.
- CSRF-token verplicht op elke mutatie; GET-varianten van state-wijzigende
  routes verwijderd (o.a. /api/docker/restart was via <img> te triggeren).
- Path traversal in /api/store/install gedicht; gedeelde safe_name()-validatie
  voor stack-, instantie- en repo-namen.
- Git-tokens worden niet meer teruggegeven via /api/repos en /api/settings
  (has_token-vlag); settings-PUT wist een bestaand token niet meer en kan AUTH
  niet overschrijven.
- Git-URL's beperkt tot http(s)/ssh/scp-syntax; ext::-transport (voert een
  shell-commando uit) en file:// worden geweigerd.
- Boilerplate-templates renderen in een SandboxedEnvironment (SSTI).
- Automatisch syncen van repo's bij boot standaard uit (AUTO_SYNC_ON_BOOT),
  optionele commit-pinning per repo.
- Waitress in plaats van de Flask-ontwikkelserver, MAX_CONTENT_LENGTH,
  ProxyFix, en CSP/X-Frame-Options/nosniff/Referrer-Policy headers.
- Front-end libraries (Tailwind, Alpine, htmx) lokaal meegeleverd i.p.v. CDN;
  Google Fonts verwijderd. Werkt nu ook offline.
- SSH host-key-verificatie aan (accept-new + /data/known_hosts).
- Lichte /healthz voor de healthcheck i.p.v. `docker info`.
- config.json en secret.key met 0600-rechten.
- Poort standaard op 127.0.0.1 gebonden.
- Audit-log gebruikt één gedeelde SQLite-verbinding (fd-lek per job verholpen);
  joblogs afgekapt op 2000 regels.
- VERSION-bestand is de enige bron voor het versienummer.
- pytest-suite toegevoegd (74 tests) en als stap in beide deploy-workflows.
- fix-config.sh verwijderd (hardgecodeerd intern IP, overschreef config).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7oLCRYzY5ixJ5Sv8Y8EFb
2026-07-26 14:40:05 +02:00
bes-r
7eee8ba8ca v0.4.60 - VERSION leesfix (LF)
All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 45s
Deploy server-up (prod) / deploy (push) Successful in 3s
Release / release (push) Successful in 3s
2026-06-06 22:26:22 +02:00
bes-r
82f68278f6 v0.4.60 - tweecijferig patch-nummer 2026-06-06 22:16:10 +02:00
bes-r
fd9b6ff53d v0.4.6 - kaal versienummer, geen -dev/-rc suffix 2026-06-06 22:12:15 +02:00
bes-r
7dd83f0a88 v0.4.5 - releases + update-check
All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 1m2s
Deploy server-up (prod) / deploy (push) Successful in 41s
Release / release (push) Successful in 5s
2026-06-06 22:04:04 +02:00
bes-r
7dfb6a0abb v0.4.4 - versienummer uit centraal VERSION-bestand
All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 46s
2026-06-06 21:36:32 +02:00
bes-r
1eab7c07df v0.4.3 - auto-logo's legacy-apps + fix lege Docker Images
All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 53s
2026-06-06 21:13:32 +02:00
bes-r
9b388af0cc v0.4.1 - fix: @apply anim brak alle Tailwind-styling
All checks were successful
Deploy server-up (prod) / deploy (push) Successful in 51s
Deploy server-up (dev) / deploy (push) Successful in 4s
2026-06-06 20:53:14 +02:00
bes-r
79ab901d9e v0.4.0 - nieuw UI-ontwerp + SU_VERSION via build-arg/env (fix vdev)
All checks were successful
Deploy server-up (prod) / deploy (push) Successful in 6s
2026-06-06 14:00:15 +02:00
bes-r
49d3d82344 ci: build.yml alleen handmatig (server bouwt zelf)
All checks were successful
Deploy server-up (prod) / deploy (push) Successful in 44s
2026-06-02 23:57:57 +02:00
9798c938cb Merge pull request 'Update boilerplates' (#1) from dev into main
All checks were successful
Deploy server-up (prod) / deploy (push) Successful in 8s
Reviewed-on: http://localhost:3000/bes-r/server-up/pulls/1
2026-06-02 23:35:17 +02:00
daeb159ad6 Merge branch 'main' into dev
All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 22s
2026-06-02 23:29:54 +02:00
bes-r
34edd95c9b v0.3.1 - UI restyle, inklapbaar menu, taalmodule
Some checks failed
Deploy server-up (prod) / deploy (push) Successful in 6s
Build and push image / build (push) Has been cancelled
2026-06-02 23:25:30 +02:00
bes-r
d866a13c20 UI: grotere/mobielvriendelijke restyle, inklapbaar menu, taalmodule add-on
Some checks failed
Deploy server-up (prod) / deploy (push) Failing after 5s
2026-06-02 23:07:27 +02:00
bes-r
f96a9407d5 fix: voorkom duplicate repo-IDs bij toevoegen via UI 2026-05-30 00:55:16 +02:00
bes-r
e5ef3b02b7 Merge branch 'dev'
Some checks failed
Deploy server-up (prod) / deploy (push) Failing after 10s
2026-05-30 00:40:06 +02:00
bes-r
d94d38a314 feat: MCP-server boilerplates voor Forgejo en Home Assistant
All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 23s
2026-05-29 21:57:32 +02:00
bes-r
5c174cecbc Merge branch 'dev'
Some checks failed
Deploy server-up (prod) / deploy (push) Has been cancelled
2026-05-27 00:31:01 +02:00
bes-r
e5effe4089 feat: nieuwe boilerplates + hardcoded waarden variabel gemaakt
All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 8s
2026-05-27 00:08:55 +02:00
bes-r
31aa2a3430 feat: boilerplates voor Unifi, ARR-stack, qBittorrent en SABnzbd
All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 14s
2026-05-27 00:01:28 +02:00
bes-r
99128a5fd9 fix: docker tag van latest naar versie, niet andersom
All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 21s
2026-05-26 23:36:13 +02:00
bes-r
0f3bf8527f fix: rsync --no-group + chown op server gedaan 2026-05-26 23:30:57 +02:00
bes-r
955f8d1a91 ci: retrigger na rsync installatie
Some checks failed
Deploy server-up (dev) / deploy (push) Failing after 2s
2026-05-26 23:29:30 +02:00
bes-r
0da06d1d06 ci: retrigger na node installatie
Some checks failed
Deploy server-up (dev) / deploy (push) Failing after 6s
2026-05-26 23:27:37 +02:00
bes-r
590760813d fix: DEPLOY_DIR naar /opt/docker/server-up
Some checks failed
Deploy server-up (dev) / deploy (push) Failing after 1s
2026-05-26 23:24:28 +02:00
bes-r
6b1e9c8faf ci: dev/prod workflow splitsing
Some checks failed
Deploy server-up (dev) / deploy (push) Failing after 0s
2026-05-26 22:51:46 +02:00
bes-r
9fb96fe1bc v0.3.02 - Boilerplate fixes
Some checks failed
Deploy server-up / deploy (push) Has been cancelled
2026-05-20 20:40:06 +02:00
bes-r
0b8e3dffb8 v0.3.01 — boilerplate fixes + git-driven versioning
Some checks failed
Deploy server-up / deploy (push) Has been cancelled
2026-05-19 23:44:56 +02:00
bes-r
e34c5ebff6 Renamed app to server-up
Some checks failed
Deploy server-up / deploy (push) Has been cancelled
2026-05-16 15:26:11 +02:00