From 273b8d5a69d9c84eea1172daf8d23b9e54ac1576 Mon Sep 17 00:00:00 2001 From: MaddoScientisto Date: Mon, 20 Apr 2026 21:17:24 +0200 Subject: [PATCH] feat: Add Docker compose scripts for starting and stopping services with health checks --- .vscode/compose-down.ps1 | 3 ++ .vscode/compose-up.ps1 | 72 ++++++++++++++++++++++++++++++++++++++++ production.env | 31 +++++++++++++++++ 3 files changed, 106 insertions(+) create mode 100644 .vscode/compose-down.ps1 create mode 100644 .vscode/compose-up.ps1 create mode 100644 production.env diff --git a/.vscode/compose-down.ps1 b/.vscode/compose-down.ps1 new file mode 100644 index 0000000..9f24bef --- /dev/null +++ b/.vscode/compose-down.ps1 @@ -0,0 +1,3 @@ +Write-Host "Stopping docker compose (debug)..." +docker compose down +exit $LASTEXITCODE diff --git a/.vscode/compose-up.ps1 b/.vscode/compose-up.ps1 new file mode 100644 index 0000000..1714655 --- /dev/null +++ b/.vscode/compose-up.ps1 @@ -0,0 +1,72 @@ +param( + [int]$TimeoutSeconds = 120 +) + +Write-Host "Starting docker compose (debug) in detached mode..." +docker compose up --build -d +$composeExit = $LASTEXITCODE + +$start = [DateTime]::UtcNow +$containerSeen = $false +while (([DateTime]::UtcNow - $start).TotalSeconds -lt $TimeoutSeconds) { + $container = docker ps --filter "name=worktracker-dev" --format "{{.Names}}" 2>$null + if ($container -and $container.Trim() -ne "") { + if (-not $containerSeen) { + Write-Host "Found container: $container" + $containerSeen = $true + } + + # After container appears, wait a short inner timeout for the app to respond + $innerStart = [DateTime]::UtcNow + $innerTimeout = 30 + while (([DateTime]::UtcNow - $innerStart).TotalSeconds -lt $innerTimeout) { + try { + $resp = Invoke-WebRequest -UseBasicParsing -Uri http://localhost:8002/ -TimeoutSec 2 -ErrorAction Stop + if ($resp.StatusCode -ge 200 -and $resp.StatusCode -lt 400) { + Write-Host "Application responded (HTTP $($resp.StatusCode)). Ready. Opening browser..." + try { + Start-Process "http://localhost:8002/" + } catch { + Write-Host "Failed to open browser: $_" + } + exit 0 + } + } catch { + Start-Sleep -Seconds 1 + } + } + + Write-Host "Container started but application did not respond within $innerTimeout seconds. Collecting logs..." + break + } + Start-Sleep -Seconds 1 +} + +Write-Error "Timed out waiting for container or application to become ready after $TimeoutSeconds seconds. Gathering diagnostics..." + +Write-Host "-- docker compose ps -- (all services) --" +try { + docker compose ps +} catch { + Write-Host "(ps failed): $_" +} + +Write-Host "-- docker ps -a (filtered) --" +try { + docker ps -a --filter "name=worktracker-dev" +} catch { + Write-Host "(docker ps failed): $_" +} + +Write-Host "-- docker compose logs (last 200 lines for service 'worktracker') --" +try { + docker compose logs --no-color --tail 200 worktracker +} catch { + Write-Host "(logs failed): $_" +} + +if ($composeExit -ne 0) { + Write-Error "The initial 'docker compose up' returned exit code $composeExit. Check above logs for details." +} + +exit 1 diff --git a/production.env b/production.env new file mode 100644 index 0000000..592616c --- /dev/null +++ b/production.env @@ -0,0 +1,31 @@ +# Production deployment settings for docker-compose.yml + +ASPNETCORE_ENVIRONMENT=Production +ASPNETCORE_FORWARDEDHEADERS_ENABLED=true +ALLOWED_HOSTS=* +USE_HTTPS_REDIRECTION=false + +# Persistent Couchbase Lite database mount +WORKTRACKER_DATA_PATH=/mnt/storage/data/worktracker/db +COUCHBASELITE_DATABASE_NAME=worktracker + +# Published app port +WORKTRACKER_PORT=8002 + +# Image reference used by Docker Compose +IMAGE_REGISTRY=worktracker +IMAGE_TAG=latest + +# Built-in authentication +APPAUTH_ENABLED=false +APPAUTH_DEFAULT_USERNAME=Admin +APPAUTH_DEFAULT_USERID=ADMIN +SINGLEUSER_SEED_ON_STARTUP=true +SINGLEUSER_USERNAME=admin +SINGLEUSER_PASSWORD=disagio-spaghetti-science-adsfg + +# Container healthcheck tuning +WORKTRACKER_HEALTHCHECK_INTERVAL=30s +WORKTRACKER_HEALTHCHECK_TIMEOUT=5s +WORKTRACKER_HEALTHCHECK_START_PERIOD=10s +WORKTRACKER_HEALTHCHECK_RETRIES=3 \ No newline at end of file