Migratie naar 2-container opzet (app + database)
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>
This commit is contained in:
co-authored by
Claude Opus 5
parent
3c67381de9
commit
bfec3a25f3
@@ -1,19 +1,20 @@
|
||||
# VibeFinance dev script (PowerShell)
|
||||
# Lokale development cyclus: bouwen, starten, stoppen en optioneel pushen
|
||||
# naar de dev-registry. Gebruikt altijd de -dev images en tags.
|
||||
# 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 build -Target backend # alleen backend bouwen
|
||||
# .\dev.ps1 build -Target frontend # alleen frontend bouwen
|
||||
# .\dev.ps1 up # build + herstart containers
|
||||
# .\dev.ps1 up -Target backend # alleen backend bouwen + herstart
|
||||
# .\dev.ps1 up -Target frontend # alleen frontend bouwen + herstart
|
||||
# .\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
|
||||
# .\dev.ps1 push -Target backend # alleen backend multi-platform pushen
|
||||
# .\dev.ps1 push -Target frontend # alleen frontend multi-platform pushen
|
||||
#
|
||||
# Vereisten:
|
||||
# - Docker Desktop actief
|
||||
@@ -22,11 +23,11 @@
|
||||
# - root package.json bevat het versienummer (bijv. "1.0.0-dev")
|
||||
|
||||
param(
|
||||
[ValidateSet("build","up","down","push")]
|
||||
[ValidateSet("build","up","down","logs","test","push")]
|
||||
[string]$Action = "up",
|
||||
|
||||
[ValidateSet("both","frontend","backend")]
|
||||
[string]$Target = "both"
|
||||
[ValidateSet("all","app","postgres")]
|
||||
[string]$Target = "all"
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
@@ -34,11 +35,10 @@ $ErrorActionPreference = "Stop"
|
||||
# =============================================================================
|
||||
# PROJECTCONFIGURATIE - pas alleen dit blok aan voor een nieuw project
|
||||
# =============================================================================
|
||||
$appName = "VibeFinance"
|
||||
$registry = "vibehoogie.duckdns.org/vibe"
|
||||
$backendImage = "vibefinance-backend"
|
||||
$frontendImage = "vibefinance-frontend"
|
||||
$apiUrl = "/api"
|
||||
$appName = "VibeFinance"
|
||||
$registry = "vibehoogie.duckdns.org/vibe"
|
||||
$appImage = "vibefinance-app"
|
||||
$apiUrl = "/api"
|
||||
# =============================================================================
|
||||
|
||||
# Versie uit root package.json
|
||||
@@ -67,18 +67,17 @@ if ($frontendPkg.version -ne $appVersion) {
|
||||
Write-Host "Versie gesynchroniseerd naar frontend: $appVersion" -ForegroundColor Green
|
||||
}
|
||||
|
||||
# Registry tags
|
||||
$backendBase = "$registry/$backendImage"
|
||||
$frontendBase = "$registry/$frontendImage"
|
||||
|
||||
$backendLatestDev = "$backendBase`:latest-dev"
|
||||
$frontendLatestDev = "$frontendBase`:latest-dev"
|
||||
$backendVersionDev = "$backendBase`:$appVersion"
|
||||
$frontendVersionDev= "$frontendBase`:$appVersion"
|
||||
# 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
|
||||
@@ -90,38 +89,20 @@ Write-Host "========================================" -ForegroundColor Cyan
|
||||
Write-Host ""
|
||||
|
||||
# Functies
|
||||
function Invoke-BackendPush {
|
||||
Write-Host "Backend bouwen en pushen..." -ForegroundColor White
|
||||
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 $backendLatestDev `
|
||||
-t $backendVersionDev `
|
||||
--build-arg APP_VERSION=$appVersion `
|
||||
(Join-Path $PSScriptRoot "backend")
|
||||
if ($LASTEXITCODE -ne 0) { throw "Backend build mislukt" }
|
||||
Write-Host "Gepusht: $backendVersionDev" -ForegroundColor Green
|
||||
}
|
||||
|
||||
function Invoke-FrontendPush {
|
||||
Write-Host "Frontend bouwen en pushen..." -ForegroundColor White
|
||||
docker buildx build `
|
||||
--platform linux/amd64,linux/arm64 `
|
||||
--push `
|
||||
-t $frontendLatestDev `
|
||||
-t $frontendVersionDev `
|
||||
-t $appLatestDev `
|
||||
-t $appVersionDev `
|
||||
--build-arg APP_VERSION=$appVersion `
|
||||
--build-arg VITE_API_URL=$apiUrl `
|
||||
--build-arg VITE_REPO_URL=$repoUrl `
|
||||
(Join-Path $PSScriptRoot "frontend")
|
||||
if ($LASTEXITCODE -ne 0) { throw "Frontend build mislukt" }
|
||||
Write-Host "Gepusht: $frontendVersionDev" -ForegroundColor Green
|
||||
}
|
||||
|
||||
function Invoke-Push {
|
||||
Write-Host "-- Multi-platform bouwen en pushen -------" -ForegroundColor Cyan
|
||||
if ($Target -eq "both" -or $Target -eq "backend") { Invoke-BackendPush }
|
||||
if ($Target -eq "both" -or $Target -eq "frontend") { Invoke-FrontendPush }
|
||||
--build-arg VITE_APP_VERSION=$appVersion `
|
||||
$PSScriptRoot
|
||||
if ($LASTEXITCODE -ne 0) { throw "Build mislukt" }
|
||||
Write-Host "Gepusht: $appVersionDev" -ForegroundColor Green
|
||||
}
|
||||
|
||||
# Acties
|
||||
@@ -129,7 +110,6 @@ switch ($Action) {
|
||||
|
||||
"build" {
|
||||
Write-Host "-- Lokaal bouwen -------------------------" -ForegroundColor Cyan
|
||||
$services = @(if ($Target -ne "both") { $Target })
|
||||
docker compose --progress plain -f $devCompose build @services
|
||||
if ($LASTEXITCODE -ne 0) { throw "Build mislukt" }
|
||||
Write-Host ""
|
||||
@@ -137,8 +117,9 @@ switch ($Action) {
|
||||
}
|
||||
|
||||
"up" {
|
||||
if ($Target -eq "both") {
|
||||
docker compose -f $devCompose down -v
|
||||
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
|
||||
} else {
|
||||
docker compose -f $devCompose stop $Target
|
||||
@@ -147,6 +128,8 @@ switch ($Action) {
|
||||
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" {
|
||||
@@ -155,19 +138,23 @@ switch ($Action) {
|
||||
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-Push
|
||||
Invoke-AppPush
|
||||
Write-Host ""
|
||||
Write-Host "========================================" -ForegroundColor Cyan
|
||||
Write-Host " Dev images gepusht: $appVersion [$Target]" -ForegroundColor Green
|
||||
if ($Target -eq "both" -or $Target -eq "backend") {
|
||||
Write-Host " $backendVersionDev" -ForegroundColor White
|
||||
Write-Host " $backendLatestDev" -ForegroundColor White
|
||||
}
|
||||
if ($Target -eq "both" -or $Target -eq "frontend") {
|
||||
Write-Host " $frontendVersionDev" -ForegroundColor White
|
||||
Write-Host " $frontendLatestDev" -ForegroundColor White
|
||||
}
|
||||
Write-Host " Dev image gepusht: $appVersion" -ForegroundColor Green
|
||||
Write-Host " $appVersionDev" -ForegroundColor White
|
||||
Write-Host " $appLatestDev" -ForegroundColor White
|
||||
Write-Host "========================================" -ForegroundColor Cyan
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user