# VibeFinance dev script (PowerShell) # 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 # # Gebruik: # .\dev.ps1 # build + herstart containers # .\dev.ps1 build # alleen lokaal bouwen # .\dev.ps1 up # build + herstart containers # .\dev.ps1 up -Target app # alleen de app herbouwen + herstarten # .\dev.ps1 up -Target postgres # alleen de database herstarten # .\dev.ps1 down # containers stoppen en volumes verwijderen # .\dev.ps1 logs # logs van de app volgen # .\dev.ps1 test # testsuite draaien (zie ook test.ps1) # .\dev.ps1 push # multi-platform build + push naar registry # # Vereisten: # - Docker Desktop actief # - Voor 'push': ingelogd op registry via: docker login # - Voor 'push': docker buildx builder actief (docker buildx create --use) # - root package.json bevat het versienummer (bijv. "1.0.0-dev") param( [ValidateSet("build","up","down","logs","test","push")] [string]$Action = "up", [ValidateSet("all","app","postgres")] [string]$Target = "all" ) $ErrorActionPreference = "Stop" # ============================================================================= # PROJECTCONFIGURATIE - pas alleen dit blok aan voor een nieuw project # ============================================================================= $appName = "VibeFinance" $registry = "vibehoogie.duckdns.org/vibe" $appImage = "vibefinance-app" $apiUrl = "/api" # ============================================================================= # 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 # De backend doet de update-check (server-side, geen CORS) — URL doorgeven aan compose $env:UPDATE_CHECK_URL = $updateCheckUrl 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 if ($frontendPkg.version -ne $appVersion) { $frontendPkg.version = $appVersion [System.IO.File]::WriteAllText($frontendPkgPath, ($frontendPkg | ConvertTo-Json -Depth 10)) Write-Host "Versie gesynchroniseerd naar frontend: $appVersion" -ForegroundColor Green } # Registry tags (één image voor de hele app) $appBase = "$registry/$appImage" $appLatestDev = "$appBase`:latest-dev" $appVersionDev = "$appBase`:$appVersion" # Pad naar compose file $devCompose = Join-Path $PSScriptRoot "docker-compose.dev.yml" # Welke services de actie raakt $services = @(if ($Target -ne "all") { $Target }) 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 function Invoke-AppPush { Write-Host "App bouwen en pushen (amd64 + arm64)..." -ForegroundColor White docker buildx build ` --platform linux/amd64,linux/arm64 ` --target production ` --push ` -t $appLatestDev ` -t $appVersionDev ` --build-arg APP_VERSION=$appVersion ` --build-arg VITE_API_URL=$apiUrl ` --build-arg VITE_APP_VERSION=$appVersion ` $PSScriptRoot if ($LASTEXITCODE -ne 0) { throw "Build mislukt" } Write-Host "Gepusht: $appVersionDev" -ForegroundColor Green } # 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" { # --renew-anon-volumes: node_modules zitten in anonieme volumes; zonder # dit blijven ze na een dependency-upgrade op de oude versies staan. if ($Target -eq "all") { # Let op: geen -v hier, dat zou de dev-database wissen (zie actie down) docker compose -f $devCompose down docker compose --progress plain -f $devCompose up --build -d --renew-anon-volumes } else { docker compose -f $devCompose stop $Target docker compose --progress plain -f $devCompose up --build -d --renew-anon-volumes $Target } if ($LASTEXITCODE -ne 0) { throw "Opstarten mislukt" } Write-Host "" Write-Host "$appName gestart - $appVersion [$Target]" -ForegroundColor Green Write-Host " App : http://localhost/" -ForegroundColor White Write-Host " API : http://localhost:3001/api/health" -ForegroundColor White } "down" { docker compose -f $devCompose down -v Write-Host "" Write-Host "$appName gestopt" -ForegroundColor Yellow } "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" } } "push" { Invoke-AppPush Write-Host "" Write-Host "========================================" -ForegroundColor Cyan Write-Host " Dev image gepusht: $appVersion" -ForegroundColor Green Write-Host " $appVersionDev" -ForegroundColor White Write-Host " $appLatestDev" -ForegroundColor White Write-Host "========================================" -ForegroundColor Cyan } } Write-Host ""