2026-09-04 09:19:14 +02:00
# VibeFinance dev script (PowerShell)
2026-09-04 11:51:29 +02:00
# Lokale development cyclus voor de 2-container opzet: bouwen, starten,
# stoppen en optioneel pushen naar de dev-registry.
#
# app API (node --watch) + Vite dev-server met hot reload
# postgres database
2026-09-04 09:19:14 +02:00
#
# Gebruik:
# .\dev.ps1 # build + herstart containers
# .\dev.ps1 build # alleen lokaal bouwen
# .\dev.ps1 up # build + herstart containers
2026-09-04 11:51:29 +02:00
# .\dev.ps1 up -Target app # alleen de app herbouwen + herstarten
# .\dev.ps1 up -Target postgres # alleen de database herstarten
2026-09-04 09:19:14 +02:00
# .\dev.ps1 down # containers stoppen en volumes verwijderen
2026-09-04 11:51:29 +02:00
# .\dev.ps1 logs # logs van de app volgen
# .\dev.ps1 test # testsuite draaien (zie ook test.ps1)
2026-09-04 09:19:14 +02:00
# .\dev.ps1 push # multi-platform build + push naar registry
#
# Vereisten:
# - Docker Desktop actief
# - Voor 'push': ingelogd op registry via: docker login <registry>
# - Voor 'push': docker buildx builder actief (docker buildx create --use)
# - root package.json bevat het versienummer (bijv. "1.0.0-dev")
param (
2026-09-04 11:51:29 +02:00
[ ValidateSet ( "build" , "up" , "down" , "logs" , "test" , "push" )]
2026-09-04 09:19:14 +02:00
[ string ] $Action = "up" ,
2026-09-04 11:51:29 +02:00
[ ValidateSet ( "all" , "app" , "postgres" )]
[ string ] $Target = "all"
2026-09-04 09:19:14 +02:00
)
$ErrorActionPreference = "Stop"
# =============================================================================
# PROJECTCONFIGURATIE - pas alleen dit blok aan voor een nieuw project
# =============================================================================
2026-09-04 11:51:29 +02:00
$appName = "VibeFinance"
$registry = "vibehoogie.duckdns.org/vibe"
$appImage = "vibefinance-app"
$apiUrl = "/api"
2026-09-04 09:19:14 +02:00
# =============================================================================
# Versie uit root package.json
$rootPkg = Get-Content ( Join-Path $PSScriptRoot "package.json" ) -Raw | ConvertFrom-Json
$appVersion = $rootPkg . version
$repoUrl = if ( $rootPkg . repository ) { $rootPkg . repository } else { "" }
$updateCheckUrl = if ( $rootPkg . updateCheckUrl ) { $rootPkg . updateCheckUrl } else { "" }
if ( -not $appVersion ) {
Write-Error "Kon versienummer niet lezen uit package.json"
exit 1
}
$env:VERSION = $appVersion
$env:VITE_APP_VERSION = $appVersion
2026-09-04 09:19:23 +02:00
# De backend doet de update-check (server-side, geen CORS) — URL doorgeven aan compose
$env:UPDATE_CHECK_URL = $updateCheckUrl
2026-09-04 09:19:14 +02:00
if ( -not $env:POSTGRES_PASSWORD ) { $env:POSTGRES_PASSWORD = "devpassword" }
# Versie synchroniseren naar frontend/package.json
$frontendPkgPath = Join-Path $PSScriptRoot "frontend/package.json"
$frontendPkg = Get-Content $frontendPkgPath -Raw | ConvertFrom-Json
2026-09-04 09:19:23 +02:00
if ( $frontendPkg . version -ne $appVersion ) {
2026-09-04 09:19:14 +02:00
$frontendPkg . version = $appVersion
[ System.IO.File ]:: WriteAllText ( $frontendPkgPath , ( $frontendPkg | ConvertTo-Json -Depth 10 ))
Write-Host "Versie gesynchroniseerd naar frontend: $appVersion " -ForegroundColor Green
}
2026-09-04 11:51:29 +02:00
# Registry tags (één image voor de hele app)
$appBase = " $registry / $appImage "
$appLatestDev = " $appBase `:latest-dev"
$appVersionDev = " $appBase `: $appVersion "
2026-09-04 09:19:14 +02:00
# Pad naar compose file
$devCompose = Join-Path $PSScriptRoot "docker-compose.dev.yml"
2026-09-04 11:51:29 +02:00
# Welke services de actie raakt
$services = @ ( if ( $Target -ne "all" ) { $Target })
2026-09-04 09:19:14 +02:00
Write-Host ""
Write-Host "========================================" -ForegroundColor Cyan
Write-Host " $appName Dev" -ForegroundColor Cyan
Write-Host " Versie : $appVersion " -ForegroundColor Green
Write-Host " Actie : $Action " -ForegroundColor Green
Write-Host " Target : $Target " -ForegroundColor Green
Write-Host " Registry: $registry " -ForegroundColor Green
Write-Host "========================================" -ForegroundColor Cyan
Write-Host ""
# Functies
2026-09-04 22:47:48 +02:00
# Zonder registry-login klapt een push pas ná de hele build met 401.
$registryHost = $registry . Split ( "/" )[ 0 ]
function Assert-RegistryLogin {
$uitvoer = ( docker buildx imagetools inspect " ${appBase} :latest-dev" 2 >& 1 | Out-String )
if ( $uitvoer -notmatch "401|[Uu]nauthorized|authentication required" ) { return }
$gebruiker = $env:REGISTRY_USER
$token = if ( $env:REGISTRY_TOKEN ) { $env:REGISTRY_TOKEN } else { $env:GITEA_TOKEN }
if ( $gebruiker -and $token ) {
Write-Host "Inloggen op $registryHost als $gebruiker ..." -ForegroundColor White
$token | docker login $registryHost -u $gebruiker - -password-stdin
if ( $LASTEXITCODE -eq 0 ) { return }
}
Write-Error "Niet ingelogd op $registryHost . Doe eerst: docker login $registryHost (Gitea-token met scope write:package), of zet REGISTRY_USER en REGISTRY_TOKEN."
exit 1
}
2026-09-04 11:51:29 +02:00
function Invoke-AppPush {
2026-09-04 22:47:48 +02:00
Assert-RegistryLogin
2026-09-04 11:51:29 +02:00
Write-Host "App bouwen en pushen (amd64 + arm64)..." -ForegroundColor White
2026-09-04 09:19:14 +02:00
docker buildx build `
- -platform linux / amd64 , linux / arm64 `
2026-09-04 11:51:29 +02:00
- -target production `
2026-09-04 09:19:14 +02:00
- -push `
2026-09-04 11:51:29 +02:00
-t $appLatestDev `
-t $appVersionDev `
2026-09-04 09:19:14 +02:00
- -build-arg APP_VERSION = $appVersion `
- -build-arg VITE_API_URL = $apiUrl `
2026-09-04 11:51:29 +02:00
- -build-arg VITE_APP_VERSION = $appVersion `
$PSScriptRoot
if ( $LASTEXITCODE -ne 0 ) { throw "Build mislukt" }
Write-Host "Gepusht: $appVersionDev " -ForegroundColor Green
2026-09-04 09:19:14 +02:00
}
# Acties
switch ( $Action ) {
"build" {
Write-Host "-- Lokaal bouwen -------------------------" -ForegroundColor Cyan
docker compose - -progress plain -f $devCompose build @services
if ( $LASTEXITCODE -ne 0 ) { throw "Build mislukt" }
Write-Host ""
Write-Host "Build klaar - $appVersion [ $Target ]" -ForegroundColor Green
}
"up" {
2026-09-04 12:21:06 +02:00
# --renew-anon-volumes: node_modules zitten in anonieme volumes; zonder
# dit blijven ze na een dependency-upgrade op de oude versies staan.
2026-09-04 11:51:29 +02:00
if ( $Target -eq "all" ) {
# Let op: geen -v hier, dat zou de dev-database wissen (zie actie down)
docker compose -f $devCompose down
2026-09-04 12:21:06 +02:00
docker compose - -progress plain -f $devCompose up - -build -d - -renew-anon-volumes
2026-09-04 09:19:14 +02:00
} else {
docker compose -f $devCompose stop $Target
2026-09-04 12:21:06 +02:00
docker compose - -progress plain -f $devCompose up - -build -d - -renew-anon-volumes $Target
2026-09-04 09:19:14 +02:00
}
if ( $LASTEXITCODE -ne 0 ) { throw "Opstarten mislukt" }
Write-Host ""
Write-Host " $appName gestart - $appVersion [ $Target ]" -ForegroundColor Green
2026-09-04 11:51:29 +02:00
Write-Host " App : http://localhost/" -ForegroundColor White
Write-Host " API : http://localhost:3001/api/health" -ForegroundColor White
2026-09-04 09:19:14 +02:00
}
"down" {
docker compose -f $devCompose down -v
Write-Host ""
Write-Host " $appName gestopt" -ForegroundColor Yellow
}
2026-09-04 11:51:29 +02:00
"logs" {
$svc = if ( $Target -eq "all" ) { "app" } else { $Target }
docker compose -f $devCompose logs -f $svc
}
"test" {
& ( Join-Path $PSScriptRoot "test.ps1" )
if ( $LASTEXITCODE -ne 0 ) { throw "Tests mislukt" }
}
2026-09-04 09:19:14 +02:00
"push" {
2026-09-04 11:51:29 +02:00
Invoke-AppPush
2026-09-04 09:19:14 +02:00
Write-Host ""
Write-Host "========================================" -ForegroundColor Cyan
2026-09-04 11:51:29 +02:00
Write-Host " Dev image gepusht: $appVersion " -ForegroundColor Green
Write-Host " $appVersionDev " -ForegroundColor White
Write-Host " $appLatestDev " -ForegroundColor White
2026-09-04 09:19:14 +02:00
Write-Host "========================================" -ForegroundColor Cyan
}
}
Write-Host ""
2026-09-04 22:47:48 +02:00
# Expliciete 0: voorkomt dat de exitcode van het laatste docker-commando doorlekt.
exit 0