meldestelle/docs/99_Journal/2026-02-04_Session_Log_Docker_Hybrid_Build.md
Stefan Mogeritsch 1aaaf8a203 build: optimize Docker setup for Caddy SPA and improve runtime stability
Updated Dockerfile to streamline the hybrid build process and optimize artifact integration. Modified Caddyfile for better routing logic, enhanced security headers, Prometheus metrics, and improved API proxy handling. Adjusted `dc-gui.yaml` for container stability and simplified runtime configuration for `apiBaseUrl`. Expanded documentation with troubleshooting and session logs.
2026-02-04 16:31:26 +01:00

3.9 KiB

type status owner last_update
Journal ACTIVE DevOps Engineer 2026-02-04

Session Log: Docker Hybrid Build & Build Optimization

Datum: 04.02.2026 Teilnehmer: User, DevOps Engineer Fokus: Stabilisierung des Frontend-Builds im Docker-Container und Optimierung der Build-Performance.

🎯 Ziel

Den Docker-Build für den web-app Service reparieren, der aufgrund von Gradle/Kotlin-Plugin-Konflikten (IsolatedKotlinClasspathClassCastException) fehlschlug, und die Build-Zeiten optimieren.

📝 Protokoll

1. Problem: Gradle Plugin Konflikte im Docker

  • Symptom: IsolatedKotlinClasspathClassCastException beim Build im Docker-Container.
  • Ursache: Konflikt zwischen Gradle 9.x, Kotlin 2.3.0 und dem NodeJsRootPlugin, wenn das Root-Projekt versucht, die Node.js-Umgebung zu initialisieren, während Subprojekte dies ebenfalls tun.
  • Lösung:
    1. Root build.gradle.kts bereinigt: KMP-Plugin nur noch mit apply false eingebunden. kotlin { ... } Block im Root entfernt. Root ist nun reiner Konfigurations-Container.
    2. Hybrid-Build Strategie: Statt im Docker-Container zu bauen (was instabil war), bauen wir das Frontend lokal (./gradlew ...jsBrowserDistribution) und kopieren die fertigen Artefakte in den Container.

2. Problem: .dockerignore blockiert Artefakte

  • Symptom: COPY failed: ... not found.
  • Ursache: .dockerignore schloss **/build/ pauschal aus.
  • Lösung: Explizite Ausnahme für den Pfad !frontend/shells/meldestelle-portal/build/dist/js/productionExecutable/ (inklusive aller Eltern-Ordner) hinzugefügt.

3. Problem: Build-Performance (Webpack Timeout)

  • Symptom: Webpack-Task lief >12 Minuten oder hing.
  • Ursache: Zu wenig Speicher für den Gradle Daemon und Node.js Prozess bei großen Builds.
  • Lösung: gradle.properties angepasst:
    • org.gradle.jvmargs: 4GB (vorher 3GB)
    • kotlin.daemon.jvmargs: 4GB (vorher 3GB)

4. Problem: Caddy Config & Runtime

  • Symptom: 500er Fehler beim Abruf von /config.json.
  • Ursache: Syntax-Fehler im Caddy-Template (Escaping von Anführungszeichen).
  • Lösung: Template auf einfache Syntax zurückgesetzt: {{env "API_BASE_URL" ...}}.
  • Playbook Update: DevOps Engineer übernimmt explizit die Verantwortung für Caddy/Webserver-Konfiguration.

5. Problem: Ping-Service Erreichbarkeit (CORS/Routing)

  • Symptom: Frontend erhielt HTML (SPA Fallback) statt JSON vom Backend.
  • Ursache: Caddy leitete /api/* nicht an den api-gateway weiter, sondern lieferte die index.html aus.
  • Lösung:
    1. Caddyfile: reverse_proxy /api/* api-gateway:8081 hinzugefügt.
    2. config.json: apiBaseUrl auf leer ("") gesetzt, damit Frontend relative Pfade nutzt.
    3. Security: Caddyfile um Security Headers (Permissions-Policy, Referrer-Policy) und Logging erweitert.

Ergebnisse

  1. Web-App läuft: Der Container meldestelle-web-app startet erfolgreich und ist unter http://localhost:4000 erreichbar.
  2. API-Zugriff funktioniert: Ping-Service liefert JSON (200 OK) an das Frontend.
  3. Build-Prozess: Stabilisiert durch Hybrid-Ansatz (Lokal bauen -> Docker kopieren).
  4. Infrastruktur: build.gradle.kts (Root) ist sauberer und performanter.

⏭️ Nächste Schritte (Open Points)

  • CI/CD: Für die CI-Pipeline muss der Hybrid-Build berücksichtigt werden (Build-Step vor Docker-Build).
  • WebGL Warnungen: Im Browser-Log tauchen WebGL-Warnungen auf (vermutlich Compose/Skiko related), die aber die Funktion nicht beeinträchtigen.

📂 Betroffene Dateien

  • build.gradle.kts (Root)
  • gradle.properties
  • config/docker/caddy/web-app/Dockerfile
  • config/docker/caddy/web-app/Caddyfile
  • .dockerignore
  • config/docker/caddy/web-app/config.json
  • dc-gui.yaml
  • docs/04_Agents/Playbooks/DevOpsEngineer.md