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.
3.9 KiB
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:
IsolatedKotlinClasspathClassCastExceptionbeim 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:
- Root
build.gradle.ktsbereinigt: KMP-Plugin nur noch mitapply falseeingebunden.kotlin { ... }Block im Root entfernt. Root ist nun reiner Konfigurations-Container. - 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.
- Root
2. Problem: .dockerignore blockiert Artefakte
- Symptom:
COPY failed: ... not found. - Ursache:
.dockerignoreschloss**/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.propertiesangepasst: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 denapi-gatewayweiter, sondern lieferte dieindex.htmlaus. - Lösung:
- Caddyfile:
reverse_proxy /api/* api-gateway:8081hinzugefügt. - config.json:
apiBaseUrlauf leer ("") gesetzt, damit Frontend relative Pfade nutzt. - Security: Caddyfile um Security Headers (
Permissions-Policy,Referrer-Policy) und Logging erweitert.
- Caddyfile:
✅ Ergebnisse
- Web-App läuft: Der Container
meldestelle-web-appstartet erfolgreich und ist unterhttp://localhost:4000erreichbar. - API-Zugriff funktioniert: Ping-Service liefert JSON (
200 OK) an das Frontend. - Build-Prozess: Stabilisiert durch Hybrid-Ansatz (Lokal bauen -> Docker kopieren).
- 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.propertiesconfig/docker/caddy/web-app/Dockerfileconfig/docker/caddy/web-app/Caddyfile.dockerignoreconfig/docker/caddy/web-app/config.jsondc-gui.yamldocs/04_Agents/Playbooks/DevOpsEngineer.md