- 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>
6.7 KiB
VibeFinance — Beheer
Ontwikkeling
.\dev.ps1 # build + start (standaard)
.\dev.ps1 build # alleen bouwen
.\dev.ps1 build -Target backend # alleen backend bouwen
.\dev.ps1 build -Target frontend # alleen frontend bouwen
.\dev.ps1 up -Target backend # alleen backend herbouwen + herstarten
.\dev.ps1 up -Target frontend # alleen frontend herbouwen + herstarten
.\dev.ps1 push # dev-images naar registry pushen
.\dev.ps1 push -Target backend # alleen backend pushen
.\dev.ps1 push -Target frontend # alleen frontend pushen
Op macOS/Linux: gebruik
./dev.shmet dezelfde argumenten.
⚠️
.\dev.ps1 up(beide services) en.\dev.ps1 downvoeren interndocker compose down -vuit — dit wist de development-database. Gebruik voor een herstart zonder dataverlies:
docker compose -f docker-compose.dev.yml down
docker compose -f docker-compose.dev.yml up -d --build
Release workflow
# 1. Versienummer in package.json van "x.x.x-dev" naar "x.x.x"
# 2.
.\release.ps1 # bouw, push naar registry, maak Git-tag aan
.\release.ps1 -DryRun # droogloop — toont alle stappen zonder uit te voeren
.\release.ps1 -NoBuild # sla docker build over, push bestaande images
# 3. Versienummer in package.json naar "x.x.(x+1)-dev" voor volgende cyclus
Docker
# Update via pre-built images
docker compose pull && docker compose up -d
# Reset inclusief database ⚠️ wist alle data
docker compose down -v && docker compose up -d
PostgreSQL versie-upgrade
Bij een upgrade van PostgreSQL (bijv. 16 → 18) is de bestaande data niet compatibel. Stappen:
# 1. Backup maken
docker exec vibefinance_postgres pg_dump -U vibefinance vibefinance > backup-$(date +%F).sql
# 2. Oude containers en volumes verwijderen
docker compose down -v
# 3. Nieuwe versie starten
docker compose up -d
# 4. Backup terugzetten
docker exec -i vibefinance_postgres psql -U vibefinance -d vibefinance < backup-YYYY-MM-DD.sql
Architectuur — nginx proxy
De frontend-container (nginx) serveert de React-app en proxyt /api/-verzoeken intern door naar de backend-container op poort 3001. Dit is geconfigureerd in frontend/nginx-spa.conf:
location /api/ {
proxy_pass http://backend:3001;
}
Ontbreekt dit blok, dan krijgen gebruikers "Kan geen verbinding maken met de server" bij het inloggen — ook al draaien alle containers.
Logs en diagnose
# Live logs (dev)
docker compose -f docker-compose.dev.yml logs -f
# Live logs (productie)
docker compose logs -f
# Status containers
docker compose ps
# Database inspecteren (dev)
docker exec -it vibefinance-postgres-dev psql -U vibefinance -d vibefinance
# Database inspecteren (productie)
docker exec -it vibefinance_postgres psql -U vibefinance -d vibefinance
Data persistentie
De backend slaat alle data op in PostgreSQL.
| Omgeving | Volume | Mount pad |
|---|---|---|
| Productie | vibefinance_pgdata |
/var/lib/postgresql |
| Development | postgres_dev_data |
/var/lib/postgresql |
PostgreSQL 18 gebruikt
PGDATA=/var/lib/postgresql/18/docker. Het volume is gemount op/var/lib/postgresqlzodat data bewaard blijft na een container restart.
Backup maken:
# Dev
docker exec vibefinance-postgres-dev pg_dump -U vibefinance vibefinance > backup-$(date +%F).sql
# Productie
docker exec vibefinance_postgres pg_dump -U vibefinance vibefinance > backup-$(date +%F).sql
Backup terugzetten:
# Dev
docker exec -i vibefinance-postgres-dev psql -U vibefinance -d vibefinance < backup-2026-04-08.sql
# Productie
docker exec -i vibefinance_postgres psql -U vibefinance -d vibefinance < backup-2026-04-08.sql
Gebruikersbeheer
De eerste geregistreerde gebruiker krijgt automatisch de Admin-rol. Verdere accounts kunnen via de app aangemaakt worden (Gebruikersbeheer, Admin vereist) of via de API.
Rollen:
| Rol | Rechten |
|---|---|
Admin |
Alles, inclusief gebruikersbeheer |
Bewerker |
Data lezen en bewerken |
Viewer |
Alleen lezen |
Productie checklist
POSTGRES_PASSWORDinstellen op een sterk wachtwoordJWT_SECRETaanpassen (genereer metopenssl rand -hex 64)CORS_ORIGINinstellen op je domeinnaamFRONTEND_PORTaanpassen indien poort 3300 al in gebruik is- TLS afhandelen via een externe reverse proxy (bijv. Nginx Proxy Manager, Caddy, Traefik)
Registry
vibehoogie.duckdns.org:3000/vibe/vibefinance-backend
vibehoogie.duckdns.org:3000/vibe/vibefinance-frontend
Tags:
latest productie — meest recente release
x.x.x productie — specifieke versie
latest-dev development — meest recente dev build
x.x.x-dev development — specifieke dev versie
Inloggen op registry:
docker login vibehoogie.duckdns.org:3000
Update-notificaties
De app vergelijkt de draaiende versie met de laatste release op Gitea en toont dat op het belletje in de topbalk en onder "Over VibeFinance".
Hoe de check loopt
- De frontend vraagt
/api/update-checkop de eigen backend — de Gitea API stuurt geen CORS-headers, dus de browser mag die niet direct bevragen. - De backend haalt
releases/latestbij Gitea op en cachet het antwoord 15 minuten. - De frontend kijkt bij het openen, daarna elk half uur en bij het terugkeren naar het tabblad. Alleen een écht hoger versienummer geeft een melding.
Builds met een -dev suffix melden nooit (die lopen voor op de laatste release).
Wil je de melding tijdens ontwikkeling toch testen: open de app met ?updatecheck
in de URL.
Configuratie
De bron staat in de root package.json:
"repository": "https://vibehoogie.duckdns.org/vibe/VibeFinance",
"updateCheckUrl": "https://vibehoogie.duckdns.org/api/v1/repos/vibe/VibeFinance/releases/latest"
dev.ps1 zet die URL als UPDATE_CHECK_URL in de omgeving; in productie komt hij
uit .env (of de default in docker-compose.yml). Beschikbare backend-variabelen:
| Variabele | Betekenis |
|---|---|
UPDATE_CHECK_URL |
Release-API die gepolld wordt. Leeg = melding uit. |
UPDATE_CHECK_TOKEN |
Alleen nodig als de repo in Gitea niet publiek leesbaar is. |
Een release publiceren
Een kale Git-tag is niet genoeg: releases/latest geeft alleen echte releases terug.
release.ps1 maakt die aan (stap 4) met de changelog-sectie van die versie als
release-notes. Daarvoor is een Gitea-token met release-rechten nodig:
$env:GITEA_TOKEN = "<token>"
.\release.ps1
Zonder token slaat het script die stap over met een waarschuwing — images en tag staan dan wel klaar, maar gebruikers zien geen melding tot de release bestaat.