Het script zette GIT_SSH_COMMAND hard op "ssh", waarmee het de al
geconfigureerde core.sshCommand overschreef. Op Windows praat alleen de
OpenSSH van het systeem met de ssh-agent; Git's eigen ssh niet. Afhankelijk
van de PATH-volgorde faalde de controle daardoor met "Permission denied"
terwijl git zelf prima kon pushen.
Nu wordt core.sshCommand als basis gebruikt (met "ssh" als fallback) en
worden alleen BatchMode en ConnectTimeout toegevoegd.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Invoke-Cmd gooide bij een fout een exception, waardoor je een PowerShell-
stacktrace met het volledige buildx-commando kreeg en de eigenlijke oorzaak
(401 van de registry) wegviel.
- Invoke-Cmd meldt nu "Mislukt: <commando> (exitcode N)" en stopt met exit 1
- Optionele -Uitleg scriptblock per stap: de push-stap test opnieuw of je op de
registry bent ingelogd en geeft dan de docker login-instructie; de tag-push
wijst naar git ls-remote en het https-alternatief
- De preflight-meldingen zijn gewone gekleurde regels in plaats van
Write-Error, dus geen "Write-Error:" voorvoegsel meer
- Elke afbreking sluit af met "Er is niets gepubliceerd."
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
De release strandde pas na een volledige multi-arch build op
"401 Unauthorized" van de registry, en bleef daarvoor minuten hangen op een
SSH-wachtwoordprompt bij de tag-controle. Beide checks staan nu vooraan.
- Stap 1 heet nu "Controles (tags + registry-login)" en test achtereenvolgens:
bestaat de tag al lokaal, is origin bereikbaar, bestaat de tag al op origin,
bestaat het image al, en is er een geldige registry-login
- Registry-login: wanneer REGISTRY_USER en REGISTRY_TOKEN (of GITEA_TOKEN)
gezet zijn logt het script zelf in via --password-stdin, anders stopt het met
instructies. dev.ps1 push doet dezelfde controle
- Git draait met GIT_SSH_COMMAND="ssh -o BatchMode=yes -o ConnectTimeout=10",
dus geen hangende prompts meer; bij geen toegang een uitleg met het
https-alternatief
- Scripts eindigen expliciet met exit 0 (anders lekt de exitcode van het
laatste docker-commando door), en een -DryRun meldt in de slotregel dat er
niets is gepubliceerd
- BEHEER.md: registry-login met token en de REGISTRY_USER/REGISTRY_TOKEN route
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
De Express-app serveert nu zelf de gebouwde Vite-frontend op / met een
SPA-fallback naar index.html; de aparte nginx-container is vervallen.
Bedoeld voor self-hosting op een Raspberry Pi: één image, één origin,
geen interne proxy en geen CORS tussen frontend en API.
Docker
- Nieuwe multi-stage Dockerfile in de root met targets test, development
en production; frontend/Dockerfile, frontend/nginx-spa.conf en
backend/Dockerfile verwijderd
- docker-compose.yml: alleen app + postgres, app publiceert APP_PORT
(standaard 3400) naar containerpoort 3001
- docker-compose.dev.yml: dev-container draait API (node --watch) en de
Vite dev-server samen via docker/dev-entrypoint.sh, hot reload intact
- .dockerignore, .env.example, .gitignore en .gitattributes toegevoegd
Backend
- express.static + SPA-fallback op STATIC_DIR (default /app/public), met
immutable caching voor gehashte assets en no-store voor index.html
- Rate limiting alleen nog op /api — statische bestanden liepen anders na
200 requests tegen de limiet aan
- Helmet CSP toegespitst op wat de frontend laadt (Google Fonts, inline
styles, base64-avatars); upgrade-insecure-requests uit voor intern http
- Schema-init verplaatst naar initDb(), niet meer bij import van db.js
Tests en CI/CD
- backend/test/app.test.js: 11 tests (node --test) voor API-routes,
SPA-fallback, cache- en security-headers, zonder database
- test.ps1 / test.sh: backend-tests, productiebuild en smoketest op de
echte app + postgres stack
- azure-pipelines.yml: Test -> Build (incl. smoketest) -> Publish
(multi-arch amd64 + arm64, alleen op main/master of een tag)
Scripts en documentatie
- dev.ps1/dev.sh met targets app en postgres, acties logs en test;
dev.ps1 up wist de dev-database niet langer (alleen dev.ps1 down)
- release.ps1/release.sh bouwen één image voor amd64 + arm64 en draaien
de testsuite vóór het publiceren
- README.md en BEHEER.md bijgewerkt voor de nieuwe structuur
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- Donut: naadloze segmenten (donkere spleten weg), hover-tooltip per
categorie met naam, bedrag en aandeel, middenwaarde schaalt mee
- Update-check via de eigen backend (/api/update-check) i.p.v. direct
naar de Gitea API, die geen CORS-headers stuurt
- Semver-vergelijking, herhaalde check en release-notes in de melding
- release.ps1 maakt de Gitea-release aan (stap 4)
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Basislijn van de bestaande applicatie (Vite/React frontend, Express
backend, PostgreSQL) zoals die in de index stond, plus dev-, release-
en documentatiescripts.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>