Files
VibeFinance/dev.ps1
T

188 lines
7.3 KiB
PowerShell
Raw Normal View History

# 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 <registry>
# - 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
# 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
}
function Invoke-AppPush {
Assert-RegistryLogin
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 ""
# Expliciete 0: voorkomt dat de exitcode van het laatste docker-commando doorlekt.
exit 0