fixing docker-compose and cleanup
This commit is contained in:
@@ -1,9 +1,9 @@
|
|||||||
# Docker-Guidelines für das Meldestelle-Projekt
|
# Docker-Guidelines für das Meldestelle-Projekt
|
||||||
|
|
||||||
> **Version:** 1.1
|
> **Version:** 3.0.0
|
||||||
> **Datum:** 16. August 2025
|
> **Datum:** 13. September 2025
|
||||||
> **Autor:** Meldestelle Development Team
|
> **Autor:** Meldestelle Development Team
|
||||||
> **Letzte Aktualisierung:** Erweitert und optimiert basierend auf aktueller Implementierung
|
> **Letzte Aktualisierung:** 🎯 ZENTRALE DOCKER-VERSIONSVERWALTUNG implementiert - Single Source of Truth für alle Build-Argumente, eliminiert Redundanz in 12+ Dockerfiles, automatisierte Build-Scripts und Version-Update-Utilities
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -22,13 +22,14 @@ Das Meldestelle-Projekt implementiert eine **moderne, sicherheitsorientierte Con
|
|||||||
## 📋 Inhaltsverzeichnis
|
## 📋 Inhaltsverzeichnis
|
||||||
|
|
||||||
1. [Architektur-Überblick](#architektur-überblick)
|
1. [Architektur-Überblick](#architektur-überblick)
|
||||||
2. [Dockerfile-Standards](#dockerfile-standards)
|
2. [Zentrale Docker-Versionsverwaltung](#zentrale-docker-versionsverwaltung) 🆕
|
||||||
3. [Docker-Compose Organisation](#docker-compose-organisation)
|
3. [Dockerfile-Standards](#dockerfile-standards)
|
||||||
4. [Development-Workflow](#development-workflow)
|
4. [Docker-Compose Organisation](#docker-compose-organisation)
|
||||||
5. [Production-Deployment](#production-deployment)
|
5. [Development-Workflow](#development-workflow)
|
||||||
6. [Monitoring und Observability](#monitoring-und-observability)
|
6. [Production-Deployment](#production-deployment)
|
||||||
7. [Troubleshooting](#troubleshooting)
|
7. [Monitoring und Observability](#monitoring-und-observability)
|
||||||
8. [Best Practices](#best-practices)
|
8. [Troubleshooting](#troubleshooting)
|
||||||
|
9. [Best Practices](#best-practices)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -91,6 +92,257 @@ graph TB
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## 🎯 Zentrale Docker-Versionsverwaltung
|
||||||
|
|
||||||
|
### Überblick und Motivation
|
||||||
|
|
||||||
|
**Version 3.0.0** führt eine revolutionäre Änderung in der Docker-Versionsverwaltung ein: die **zentrale Verwaltung aller Build-Argumente** analog zum bewährten `gradle/libs.versions.toml` System.
|
||||||
|
|
||||||
|
#### Das Problem vor Version 3.0.0
|
||||||
|
|
||||||
|
```dockerfile
|
||||||
|
# BEFORE: Redundante Hardcodierung in 12+ Dockerfiles
|
||||||
|
ARG GRADLE_VERSION=9.0.0
|
||||||
|
ARG GRADLE_VERSION=9.0.0
|
||||||
|
ARG GRADLE_VERSION=9.0.0
|
||||||
|
# ... 9 weitere Male identisch wiederholt!
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Die Lösung: Single Source of Truth
|
||||||
|
|
||||||
|
```toml
|
||||||
|
# docker/versions.toml - SINGLE SOURCE OF TRUTH
|
||||||
|
[versions]
|
||||||
|
gradle = "9.0.0"
|
||||||
|
java = "21"
|
||||||
|
node = "20.11.0"
|
||||||
|
nginx = "1.25-alpine"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 🏗️ Architektur der zentralen Versionsverwaltung
|
||||||
|
|
||||||
|
```
|
||||||
|
docker/
|
||||||
|
├── versions.toml # 🎯 Single Source of Truth
|
||||||
|
├── build-args/ # Auto-generierte Environment Files
|
||||||
|
│ ├── global.env # Globale Build-Argumente
|
||||||
|
│ ├── services.env # dockerfiles/services/*
|
||||||
|
│ ├── clients.env # dockerfiles/clients/*
|
||||||
|
│ └── infrastructure.env # dockerfiles/infrastructure/*
|
||||||
|
└── README.md # Dokumentation
|
||||||
|
```
|
||||||
|
|
||||||
|
### 📊 Hierarchische Versionsverwaltung
|
||||||
|
|
||||||
|
#### 1. **Globale Versionen** (`docker/build-args/global.env`)
|
||||||
|
Verwendet von **allen** Dockerfiles:
|
||||||
|
```bash
|
||||||
|
GRADLE_VERSION=9.0.0
|
||||||
|
JAVA_VERSION=21
|
||||||
|
BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')
|
||||||
|
VERSION=1.0.0
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 2. **Kategorie-spezifische Versionen**
|
||||||
|
|
||||||
|
**Services** (`docker/build-args/services.env`):
|
||||||
|
```bash
|
||||||
|
SPRING_PROFILES_ACTIVE=docker
|
||||||
|
SERVICE_PORT=8080
|
||||||
|
PING_SERVICE_PORT=8082
|
||||||
|
MEMBERS_SERVICE_PORT=8083
|
||||||
|
```
|
||||||
|
|
||||||
|
**Clients** (`docker/build-args/clients.env`):
|
||||||
|
```bash
|
||||||
|
NODE_VERSION=20.11.0
|
||||||
|
NGINX_VERSION=1.25-alpine
|
||||||
|
WEB_APP_PORT=4000
|
||||||
|
DESKTOP_APP_VNC_PORT=5901
|
||||||
|
```
|
||||||
|
|
||||||
|
**Infrastructure** (`docker/build-args/infrastructure.env`):
|
||||||
|
```bash
|
||||||
|
SPRING_PROFILES_ACTIVE=default
|
||||||
|
GATEWAY_PORT=8081
|
||||||
|
AUTH_SERVER_PORT=8087
|
||||||
|
```
|
||||||
|
|
||||||
|
### 🛠️ Verwendung der zentralen Versionsverwaltung
|
||||||
|
|
||||||
|
#### Automatisierte Builds mit `scripts/docker-build.sh`
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Alle Services mit zentralen Versionen bauen
|
||||||
|
./scripts/docker-build.sh services
|
||||||
|
|
||||||
|
# Client-Anwendungen bauen
|
||||||
|
./scripts/docker-build.sh clients
|
||||||
|
|
||||||
|
# Komplettes System bauen
|
||||||
|
./scripts/docker-build.sh all
|
||||||
|
|
||||||
|
# Aktuelle Versionen anzeigen
|
||||||
|
./scripts/docker-build.sh --versions
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Versionen aktualisieren mit `scripts/docker-versions-update.sh`
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Aktuelle Versionen anzeigen
|
||||||
|
./scripts/docker-versions-update.sh show
|
||||||
|
|
||||||
|
# Java auf Version 22 upgraden
|
||||||
|
./scripts/docker-versions-update.sh update java 22
|
||||||
|
|
||||||
|
# Gradle auf 9.1.0 upgraden
|
||||||
|
./scripts/docker-versions-update.sh update gradle 9.1.0
|
||||||
|
|
||||||
|
# Alle Environment-Dateien synchronisieren
|
||||||
|
./scripts/docker-versions-update.sh sync
|
||||||
|
```
|
||||||
|
|
||||||
|
### 📋 Dockerfile Template-System Version 3.0.0
|
||||||
|
|
||||||
|
#### Neue Template-Struktur
|
||||||
|
|
||||||
|
```dockerfile
|
||||||
|
# === CENTRALIZED BUILD ARGUMENTS ===
|
||||||
|
# Values sourced from docker/versions.toml and docker/build-args/
|
||||||
|
# Global arguments (docker/build-args/global.env)
|
||||||
|
ARG GRADLE_VERSION
|
||||||
|
ARG JAVA_VERSION
|
||||||
|
ARG BUILD_DATE
|
||||||
|
ARG VERSION
|
||||||
|
|
||||||
|
# Category-specific arguments (docker/build-args/services.env)
|
||||||
|
ARG SPRING_PROFILES_ACTIVE
|
||||||
|
ARG SERVICE_PATH=.
|
||||||
|
ARG SERVICE_NAME=spring-boot-service
|
||||||
|
ARG SERVICE_PORT=8080
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Docker-Compose Integration
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
api-gateway:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: dockerfiles/infrastructure/gateway/Dockerfile
|
||||||
|
args:
|
||||||
|
# Zentrale Versionen via Environment-Variablen
|
||||||
|
GRADLE_VERSION: ${DOCKER_GRADLE_VERSION:-9.0.0}
|
||||||
|
JAVA_VERSION: ${DOCKER_JAVA_VERSION:-21}
|
||||||
|
BUILD_DATE: ${BUILD_DATE}
|
||||||
|
VERSION: ${DOCKER_APP_VERSION:-1.0.0}
|
||||||
|
SPRING_PROFILES_ACTIVE: ${DOCKER_SPRING_PROFILES_DEFAULT:-default}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 🎉 Vorteile der zentralen Versionsverwaltung
|
||||||
|
|
||||||
|
#### **DRY-Prinzip Durchsetzung** ✅
|
||||||
|
- **Vor Version 3.0.0**: `GRADLE_VERSION=9.0.0` in 12 Dockerfiles
|
||||||
|
- **Ab Version 3.0.0**: `gradle = "9.0.0"` **einmalig** in `docker/versions.toml`
|
||||||
|
|
||||||
|
#### **Wartungsaufwand drastisch reduziert** ✅
|
||||||
|
```bash
|
||||||
|
# BEFORE: 12 Dateien manuell editieren für Gradle-Update
|
||||||
|
# AFTER: Ein Befehl für alle Services
|
||||||
|
./scripts/docker-versions-update.sh update gradle 9.1.0
|
||||||
|
```
|
||||||
|
|
||||||
|
#### **Konsistenz garantiert** ✅
|
||||||
|
- Keine Version-Inkonsistenzen zwischen Services möglich
|
||||||
|
- Automatische Synchronisation aller Environment-Dateien
|
||||||
|
- Einheitliche Spring-Profile-Behandlung
|
||||||
|
|
||||||
|
#### **Skalierbarkeit für neue Services** ✅
|
||||||
|
```dockerfile
|
||||||
|
# Neue Services verwenden automatisch zentrale Versionen
|
||||||
|
ARG GRADLE_VERSION
|
||||||
|
ARG JAVA_VERSION
|
||||||
|
```
|
||||||
|
|
||||||
|
### 🔄 Migration bestehender Services
|
||||||
|
|
||||||
|
#### Schritt 1: Template-basierte Migration
|
||||||
|
```bash
|
||||||
|
# Neue Services basieren auf aktualisierten Templates
|
||||||
|
cp dockerfiles/templates/spring-boot-service.Dockerfile dockerfiles/services/new-service/
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Schritt 2: Automatisierte Version-Synchronisation
|
||||||
|
```bash
|
||||||
|
# Bestehende Services automatisch aktualisieren
|
||||||
|
./scripts/docker-versions-update.sh sync
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Schritt 3: Build-Integration
|
||||||
|
```bash
|
||||||
|
# Neue Builds verwenden zentrale Versionen
|
||||||
|
./scripts/docker-build.sh services
|
||||||
|
```
|
||||||
|
|
||||||
|
### 📚 Best Practices für Version 3.0.0
|
||||||
|
|
||||||
|
#### **DO: Zentrale Versionskommandos verwenden**
|
||||||
|
```bash
|
||||||
|
# ✅ RICHTIG - Zentrale Version-Updates
|
||||||
|
./scripts/docker-versions-update.sh update java 22
|
||||||
|
|
||||||
|
# ✅ RICHTIG - Automatisierte Builds
|
||||||
|
./scripts/docker-build.sh all
|
||||||
|
```
|
||||||
|
|
||||||
|
#### **DON'T: Manuelle Dockerfile-Bearbeitung**
|
||||||
|
```dockerfile
|
||||||
|
# ❌ FALSCH - Nie mehr hardcodierte Versionen
|
||||||
|
ARG GRADLE_VERSION=9.1.0
|
||||||
|
|
||||||
|
# ✅ RICHTIG - Zentrale Referenz
|
||||||
|
ARG GRADLE_VERSION
|
||||||
|
```
|
||||||
|
|
||||||
|
#### **Konsistenz-Regeln**
|
||||||
|
1. **Niemals** Versionen direkt in Dockerfiles hardcodieren
|
||||||
|
2. **Immer** `docker/versions.toml` als Single Source of Truth verwenden
|
||||||
|
3. **Automated** Environment-File-Synchronisation via Scripts
|
||||||
|
4. **Kategorien-spezifische** Build-Argumente korrekt zuordnen
|
||||||
|
|
||||||
|
### 🚀 Entwickler-Workflow mit Version 3.0.0
|
||||||
|
|
||||||
|
#### **Neuen Service entwickeln**
|
||||||
|
```bash
|
||||||
|
# 1. Template kopieren (bereits Version 3.0.0 kompatibel)
|
||||||
|
cp dockerfiles/templates/spring-boot-service.Dockerfile dockerfiles/services/my-service/
|
||||||
|
|
||||||
|
# 2. Service-spezifische Parameter anpassen (Port, Name, etc.)
|
||||||
|
# 3. Bauen mit zentralen Versionen
|
||||||
|
./scripts/docker-build.sh services
|
||||||
|
```
|
||||||
|
|
||||||
|
#### **Versionen projekt-weit upgraden**
|
||||||
|
```bash
|
||||||
|
# 1. Java-Version upgraden (betrifft ALLE Services)
|
||||||
|
./scripts/docker-versions-update.sh update java 22
|
||||||
|
|
||||||
|
# 2. Automatisch alle Services neu bauen
|
||||||
|
./scripts/docker-build.sh all
|
||||||
|
|
||||||
|
# 3. Testen und committen
|
||||||
|
```
|
||||||
|
|
||||||
|
#### **Version-Status prüfen**
|
||||||
|
```bash
|
||||||
|
# Aktuelle zentrale Versionen anzeigen
|
||||||
|
./scripts/docker-versions-update.sh show
|
||||||
|
|
||||||
|
# Build-Environment-Status prüfen
|
||||||
|
./scripts/docker-build.sh --versions
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## 🐳 Dockerfile-Standards
|
## 🐳 Dockerfile-Standards
|
||||||
|
|
||||||
### Template-Struktur
|
### Template-Struktur
|
||||||
@@ -100,20 +352,105 @@ Alle Dockerfiles folgen einem standardisierten Template-System:
|
|||||||
```
|
```
|
||||||
dockerfiles/
|
dockerfiles/
|
||||||
├── templates/
|
├── templates/
|
||||||
│ ├── spring-boot-service.Dockerfile # Backend-Services
|
│ ├── spring-boot-service.Dockerfile # Backend-Services
|
||||||
│ ├── kotlin-multiplatform-web.Dockerfile # Web-Client
|
│ ├── kotlin-multiplatform-web.Dockerfile # Web-Client
|
||||||
│ └── monitoring-service.Dockerfile # Monitoring-Services
|
│ └── monitoring-service.Dockerfile # Monitoring-Services
|
||||||
|
├── clients/
|
||||||
|
│ ├── web-app/Dockerfile # Web-App (nginx)
|
||||||
|
│ └── desktop-app/Dockerfile # Desktop-App (VNC/X11)
|
||||||
├── infrastructure/
|
├── infrastructure/
|
||||||
│ ├── gateway/Dockerfile # ✅ API Gateway
|
│ ├── gateway/Dockerfile # API Gateway
|
||||||
│ ├── auth-server/Dockerfile # Auth Server
|
│ ├── auth-server/Dockerfile # Auth Server
|
||||||
│ └── monitoring-server/Dockerfile # Monitoring Server
|
│ └── monitoring-server/Dockerfile # Monitoring Server
|
||||||
└── services/
|
└── services/
|
||||||
├── members-service/Dockerfile # Domain Services (wenn reaktiviert)
|
├── members-service/Dockerfile # Domain Services (wenn reaktiviert)
|
||||||
├── horses-service/Dockerfile
|
├── horses-service/Dockerfile
|
||||||
├── events-service/Dockerfile
|
├── events-service/Dockerfile
|
||||||
└── masterdata-service/Dockerfile
|
└── masterdata-service/Dockerfile
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Dockerfile-Architektur & Konsistenz-Richtlinien ✅ RESOLVED
|
||||||
|
|
||||||
|
**AKTUELLER STATUS (Version 2.1):**
|
||||||
|
- ✅ Alle Dockerfiles folgen der konsistenten `dockerfiles/` Struktur
|
||||||
|
- ✅ API Gateway Dockerfile: `dockerfiles/infrastructure/gateway/Dockerfile`
|
||||||
|
- ✅ Keine Architektur-Ausnahmen mehr - alle Services folgen dem gleichen Muster
|
||||||
|
- ✅ Docker-Compose Referenzen nutzen konsistent die `dockerfiles/` Pfade
|
||||||
|
|
||||||
|
**RICHTLINIEN ZUR VERMEIDUNG VON INKONSISTENZEN:**
|
||||||
|
|
||||||
|
1. **Konsistenz-Prinzip:** ALLE Dockerfiles müssen unter `dockerfiles/` organisiert sein
|
||||||
|
2. **Keine Ausnahmen:** Kein Service darf außerhalb dieser Struktur platziert werden
|
||||||
|
3. **Vorhersagbarkeit:** Entwickler finden Dockerfiles immer am gleichen Ort
|
||||||
|
4. **Einheitliche Referenzierung:** Alle docker-compose.yml Dateien referenzieren `dockerfiles/`
|
||||||
|
|
||||||
|
**Struktur-Kategorien:**
|
||||||
|
- `dockerfiles/templates/` - Wiederverwendbare Templates
|
||||||
|
- `dockerfiles/clients/` - Frontend-Anwendungen
|
||||||
|
- `dockerfiles/infrastructure/` - Infrastructure Services (inkl. Gateway)
|
||||||
|
- `dockerfiles/services/` - Domain Services
|
||||||
|
|
||||||
|
**WICHTIG:** Bei neuen Services oder Refactoring IMMER die konsistente Struktur befolgen!
|
||||||
|
|
||||||
|
### ✨ Neue Optimierungen (Version 2.0)
|
||||||
|
|
||||||
|
#### BuildKit Cache Mounts ✅ IMPLEMENTIERT
|
||||||
|
|
||||||
|
Alle Dockerfiles verwenden jetzt **BuildKit cache mounts** für optimale Build-Performance:
|
||||||
|
|
||||||
|
```dockerfile
|
||||||
|
# Download dependencies with cache mount
|
||||||
|
RUN --mount=type=cache,target=/home/gradle/.gradle/caches \
|
||||||
|
--mount=type=cache,target=/home/gradle/.gradle/wrapper \
|
||||||
|
./gradlew dependencies --no-daemon --info
|
||||||
|
|
||||||
|
# Build application with cache mount
|
||||||
|
RUN --mount=type=cache,target=/home/gradle/.gradle/caches \
|
||||||
|
--mount=type=cache,target=/home/gradle/.gradle/wrapper \
|
||||||
|
./gradlew bootJar --no-daemon --info
|
||||||
|
```
|
||||||
|
|
||||||
|
**Vorteile:**
|
||||||
|
- Gradle Dependencies werden zwischen Builds gecacht
|
||||||
|
- Signifikant reduzierte Build-Zeiten
|
||||||
|
- Bessere Resource-Effizienz in CI/CD-Pipelines
|
||||||
|
|
||||||
|
#### Tini Init System ✅ IMPLEMENTIERT
|
||||||
|
|
||||||
|
Alle Runtime-Container verwenden jetzt **tini** als Init-System:
|
||||||
|
|
||||||
|
```dockerfile
|
||||||
|
# Installation in Alpine
|
||||||
|
RUN apk add --no-cache tini
|
||||||
|
|
||||||
|
# Verwendung im Entrypoint
|
||||||
|
ENTRYPOINT ["tini", "--", "sh", "-c", "exec java $JAVA_OPTS -jar app.jar"]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Vorteile:**
|
||||||
|
- Proper signal handling für Container
|
||||||
|
- Zombie-Process cleanup
|
||||||
|
- Graceful shutdown support
|
||||||
|
|
||||||
|
#### Enhanced Security Hardening ✅ IMPLEMENTIERT
|
||||||
|
|
||||||
|
Alle Container implementieren erweiterte Sicherheitspraktiken:
|
||||||
|
|
||||||
|
```dockerfile
|
||||||
|
# Alpine security updates
|
||||||
|
RUN apk update && apk upgrade && \
|
||||||
|
apk add --no-cache curl tzdata tini && \
|
||||||
|
rm -rf /var/cache/apk/*
|
||||||
|
|
||||||
|
# Non-root user with proper permissions
|
||||||
|
RUN addgroup -g ${APP_GID} -S ${APP_GROUP} && \
|
||||||
|
adduser -u ${APP_UID} -S ${APP_USER} -G ${APP_GROUP} && \
|
||||||
|
chown -R ${APP_USER}:${APP_GROUP} /app && \
|
||||||
|
chmod -R 750 /app
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
### Spring Boot Service Template
|
### Spring Boot Service Template
|
||||||
|
|
||||||
**Datei:** `dockerfiles/templates/spring-boot-service.Dockerfile`
|
**Datei:** `dockerfiles/templates/spring-boot-service.Dockerfile`
|
||||||
@@ -127,7 +464,7 @@ dockerfiles/
|
|||||||
# ===================================================================
|
# ===================================================================
|
||||||
|
|
||||||
# Build arguments for flexibility
|
# Build arguments for flexibility
|
||||||
ARG GRADLE_VERSION=8.14
|
ARG GRADLE_VERSION=9.0.0
|
||||||
ARG JAVA_VERSION=21
|
ARG JAVA_VERSION=21
|
||||||
ARG SPRING_PROFILES_ACTIVE=default
|
ARG SPRING_PROFILES_ACTIVE=default
|
||||||
ARG SERVICE_PATH=.
|
ARG SERVICE_PATH=.
|
||||||
|
|||||||
@@ -1,242 +0,0 @@
|
|||||||
# Docker-Analyse Komplett - Meldestelle Projekt
|
|
||||||
|
|
||||||
**Datum:** 10. September 2025, 23:13 Uhr
|
|
||||||
**Status:** Vollständige Docker-Port-Optimierung - Alle Konflikte behoben
|
|
||||||
**Konsolidiert aus:** 4 separaten Analyseberichten
|
|
||||||
|
|
||||||
## Executive Summary ✅
|
|
||||||
|
|
||||||
**ALLE DOCKER-PORT-KONFLIKTE ERFOLGREICH BEHOBEN**: Vollständige Analyse und Lösung aller Docker-Konfigurationsprobleme im Meldestelle-Projekt. Von der Problemidentifikation über detaillierte Konfliktanalyse bis zur finalen Implementierung und Verifikation.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Phase 1: Problemidentifikation (9. September 2025)
|
|
||||||
|
|
||||||
### 🔍 Identifizierte Inkonsistenzen
|
|
||||||
|
|
||||||
#### 1. Docker Compose Network Configuration Issues
|
|
||||||
- **Main File** (`docker-compose.yml`): Creates `meldestelle-network` as bridge driver
|
|
||||||
- **Services File** (`docker-compose.services.yml`): References network as `external: true`
|
|
||||||
- **Clients File** (`docker-compose.clients.yml`): References network as `external: true`
|
|
||||||
- **Impact**: Services and clients compose files cannot work standalone - network dependency issue
|
|
||||||
|
|
||||||
#### 2. API Gateway Port Configuration Issues
|
|
||||||
- **Dockerfile**: Exposes port 8080 and healthcheck uses port 8080
|
|
||||||
- **Docker-compose**: Maps to port 8081 via `${GATEWAY_PORT:-8081}`
|
|
||||||
- **Healthcheck in compose**: Still checks port 8080 instead of configured port
|
|
||||||
- **Impact**: Healthchecks will fail, service appears unhealthy
|
|
||||||
|
|
||||||
#### 3. Dockerfile Inconsistencies
|
|
||||||
- **Base Image Versions**: Mixed versions between services
|
|
||||||
- **User Creation Patterns**: Inconsistent security patterns
|
|
||||||
- **JVM Configuration Differences**: Suboptimal performance configurations
|
|
||||||
- **Health Check Configuration**: Inconsistent failure detection timing
|
|
||||||
|
|
||||||
#### 4. Environment Variable Inconsistencies
|
|
||||||
- **Default Profile Handling**: Mixed dev/prod defaults
|
|
||||||
- **Port Environment Variables**: Missing fallbacks in some services
|
|
||||||
|
|
||||||
#### 5. Service Dependencies Issues
|
|
||||||
- **Circular Dependencies**: Potential startup race conditions between services
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Phase 2: Spezifische Port-Konflikte (10. September 2025)
|
|
||||||
|
|
||||||
### 🚨 Kritische Konflikte Identifiziert
|
|
||||||
|
|
||||||
#### Complete Port Inventory
|
|
||||||
|
|
||||||
**Infrastructure Services (docker-compose.yml)**
|
|
||||||
| Service | External Port | Internal Port | Environment Variable |
|
|
||||||
|---------|---------------|---------------|---------------------|
|
|
||||||
| postgres | 5432 | 5432 | - |
|
|
||||||
| redis | 6379 | 6379 | REDIS_PORT |
|
|
||||||
| keycloak | 8180 | 8081 | - |
|
|
||||||
| consul | 8500 | 8500 | CONSUL_PORT |
|
|
||||||
| zookeeper | 2181 | 2181 | ZOOKEEPER_CLIENT_PORT |
|
|
||||||
| kafka | 9092 | 9092 | KAFKA_PORT |
|
|
||||||
| prometheus | 9090 | 9090 | PROMETHEUS_PORT |
|
|
||||||
| **grafana** | **3000** | **3000** | **GRAFANA_PORT** |
|
|
||||||
| api-gateway | 8081 | 8081 | GATEWAY_PORT |
|
|
||||||
|
|
||||||
**Client Services (docker-compose.clients.yml)**
|
|
||||||
| Service | External Port | Internal Port | Environment Variable | Issue |
|
|
||||||
|---------|---------------|---------------|---------------------|--------|
|
|
||||||
| **web-app** | **4000** | **4000** | **WEB_APP_PORT** | ❌ **Health check uses port 3000!** |
|
|
||||||
| **desktop-app** | **6901, 5901** | **6080, 5901** | **DESKTOP_WEB_VNC_PORT, DESKTOP_VNC_PORT** | ❌ **Port mapping mismatch!** |
|
|
||||||
| auth-server | 8087 | 8087 | AUTH_SERVICE_PORT | ✅ OK |
|
|
||||||
| monitoring-server | 8088 | 8088 | - | ✅ OK |
|
|
||||||
|
|
||||||
#### PORT COLLISION MATRIX
|
|
||||||
| Port | Service 1 | Service 2 | Conflict Type |
|
|
||||||
|------|-----------|-----------|---------------|
|
|
||||||
| 3000 | grafana (infrastructure) | web-app health check | ❌ CRITICAL |
|
|
||||||
| 6080 | desktop-app (expected) | desktop-app (actual: 6901) | ❌ MISMATCH |
|
|
||||||
| 8081 | api-gateway | keycloak (internal) | ⚠️ Different interfaces, OK |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Phase 3: Lösungsimplementierung (10. September 2025)
|
|
||||||
|
|
||||||
### ✅ ALLE PORT-KONFLIKTE BEHOBEN
|
|
||||||
|
|
||||||
#### 1. Web Application Health Check Korrektur ✅
|
|
||||||
- **Problem behoben**: Health Check verwendete falschen Port
|
|
||||||
- **Datei**: `docker-compose.clients.yml` Zeile 39
|
|
||||||
- **Vorher**: `http://localhost:3000/health` ❌
|
|
||||||
- **Nachher**: `http://localhost:4000/health` ✅
|
|
||||||
- **Auswirkung**: Health Checks funktionieren jetzt korrekt
|
|
||||||
|
|
||||||
#### 2. Desktop Application VNC Port Mapping Korrektur ✅
|
|
||||||
- **Problem behoben**: Port Mapping inkonsistent
|
|
||||||
- **Datei**: `docker-compose.clients.yml` Zeilen 72-73
|
|
||||||
- **Vorher**: `"6901:6901"` ❌
|
|
||||||
- **Nachher**: `"6080:6080"` ✅
|
|
||||||
- **Auswirkung**: VNC Web-Interface ist über korrekten Port erreichbar
|
|
||||||
|
|
||||||
#### 3. Environment Variables Konsistenz ✅
|
|
||||||
- **Problem behoben**: Inkonsistente Umgebungsvariablen
|
|
||||||
- **Datei**: `.env` Zeile 38
|
|
||||||
- **Vorher**: `DESKTOP_WEB_VNC_PORT=6901` ❌
|
|
||||||
- **Nachher**: `DESKTOP_WEB_VNC_PORT=6080` ✅
|
|
||||||
- **Auswirkung**: Alle Konfigurationen verwenden konsistente Werte
|
|
||||||
|
|
||||||
#### 4. Dockerfile VNC Konfiguration Korrektur ✅
|
|
||||||
- **Problem behoben**: Mehrere inkonsistente Port-Referenzen im Dockerfile
|
|
||||||
- **Datei**: `dockerfiles/clients/desktop-app/Dockerfile`
|
|
||||||
- **Korrektur 1 (Zeile 108)**: `NOVNC_PORT=6901` → `NOVNC_PORT=6080` ✅
|
|
||||||
- **Korrektur 2 (Zeile 148)**: Health Check Port `6901` → `6080` ✅
|
|
||||||
- **Auswirkung**: Container startet mit korrekten Port-Konfigurationen
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Phase 4: Finale Verifikation (10. September 2025)
|
|
||||||
|
|
||||||
### 🎯 Optimierte Port-Übersicht (Nach Implementierung)
|
|
||||||
|
|
||||||
#### Infrastructure Services
|
|
||||||
| Service | Port | Status | Zweck |
|
|
||||||
|---------|------|--------|-------|
|
|
||||||
| PostgreSQL | 5432 | ✅ OK | Database |
|
|
||||||
| Redis | 6379 | ✅ OK | Cache |
|
|
||||||
| Keycloak | 8180→8081 | ✅ OK | Authentication |
|
|
||||||
| Consul | 8500 | ✅ OK | Service Discovery |
|
|
||||||
| Zookeeper | 2181 | ✅ OK | Kafka Coordination |
|
|
||||||
| Kafka | 9092 | ✅ OK | Message Broker |
|
|
||||||
| Prometheus | 9090 | ✅ OK | Metrics |
|
|
||||||
| Grafana | 3000 | ✅ OK | Monitoring Dashboard |
|
|
||||||
| API Gateway | 8081 | ✅ OK | API Gateway |
|
|
||||||
|
|
||||||
#### Business Services
|
|
||||||
| Service | Port | Status | Zweck |
|
|
||||||
|---------|------|--------|-------|
|
|
||||||
| Ping Service | 8082 | ✅ OK | Health & Test Service |
|
|
||||||
| Members Service | 8083 | ✅ OK | Member Management |
|
|
||||||
| Horses Service | 8084 | ✅ OK | Horse Management |
|
|
||||||
| Events Service | 8085 | ✅ OK | Event Management |
|
|
||||||
| Masterdata Service | 8086 | ✅ OK | Master Data |
|
|
||||||
|
|
||||||
#### Client Applications
|
|
||||||
| Service | Port | Status | Zweck |
|
|
||||||
|---------|------|--------|-------|
|
|
||||||
| Web App | 4000 | ✅ FIXED | WASM Web Frontend |
|
|
||||||
| Desktop VNC Direct | 5901 | ✅ OK | VNC Direct Access |
|
|
||||||
| Desktop VNC Web | 6080 | ✅ FIXED | noVNC Web Interface |
|
|
||||||
| Auth Server | 8087 | ✅ OK | Custom Auth Extensions |
|
|
||||||
| Monitoring Server | 8088 | ✅ OK | Custom Monitoring |
|
|
||||||
|
|
||||||
### 🏗️ Infrastructure Module Vollständig Containerisiert ✅
|
|
||||||
|
|
||||||
**Analysierte Komponenten:**
|
|
||||||
```
|
|
||||||
infrastructure/
|
|
||||||
├── auth/ # Authentifizierung ✅
|
|
||||||
├── cache/ # Caching-Infrastruktur ✅
|
|
||||||
├── event-store/ # Event Sourcing ✅
|
|
||||||
├── gateway/ # API Gateway (mit Dockerfile) ✅
|
|
||||||
├── messaging/ # Messaging-System ✅
|
|
||||||
└── monitoring/ # Monitoring & Observability ✅
|
|
||||||
```
|
|
||||||
|
|
||||||
**Gateway Dockerfile Optimierungen:**
|
|
||||||
- Multi-Stage Build: Optimierte Containerisierung ✅
|
|
||||||
- Security: Non-root User, System Updates ✅
|
|
||||||
- Performance: Spring Boot Layer Caching, JVM Container Optimierungen ✅
|
|
||||||
- Health Checks: Konfigurierbare Port-basierte Gesundheitsprüfungen ✅
|
|
||||||
- Configuration: Vollständig über Environment Variables konfigurierbar ✅
|
|
||||||
|
|
||||||
### 🔍 Logische Port-Gruppierung
|
|
||||||
- **2000-2999**: Coordination Services (Zookeeper: 2181)
|
|
||||||
- **3000-3999**: Monitoring & UI (Grafana: 3000)
|
|
||||||
- **4000-4999**: Client Applications (Web App: 4000)
|
|
||||||
- **5000-5999**: Remote Access (VNC: 5901)
|
|
||||||
- **6000-6999**: Cache & Web Interfaces (Redis: 6379, noVNC: 6080)
|
|
||||||
- **8000-8099**: Infrastructure Services (Gateway: 8081, Auth: 8087-8088, Keycloak: 8180)
|
|
||||||
- **8100-8199**: Business Services (8082-8086)
|
|
||||||
- **9000-9999**: Messaging & Metrics (Kafka: 9092, Prometheus: 9090)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Testbarkeit & Verifikation
|
|
||||||
|
|
||||||
### Docker Compose Kommandos
|
|
||||||
```bash
|
|
||||||
# Vollständiges System
|
|
||||||
docker-compose -f docker-compose.yml -f docker-compose.services.yml -f docker-compose.clients.yml up -d
|
|
||||||
|
|
||||||
# Nur Infrastructure
|
|
||||||
docker-compose up -d
|
|
||||||
|
|
||||||
# Nur Backend Services
|
|
||||||
docker-compose -f docker-compose.yml -f docker-compose.services.yml up -d
|
|
||||||
|
|
||||||
# Nur Clients
|
|
||||||
docker-compose -f docker-compose.yml -f docker-compose.clients.yml up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
### Health Check Validierung
|
|
||||||
```bash
|
|
||||||
# Web App Health Check
|
|
||||||
curl http://localhost:4000/health
|
|
||||||
|
|
||||||
# Desktop VNC Web Interface
|
|
||||||
curl http://localhost:6080/vnc.html
|
|
||||||
|
|
||||||
# All Service Health Checks
|
|
||||||
curl http://localhost:8081/actuator/health # API Gateway
|
|
||||||
curl http://localhost:8082/actuator/health # Ping Service
|
|
||||||
curl http://localhost:8083/actuator/health # Members Service
|
|
||||||
# ... etc.
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Fazit & Ergebnisse
|
|
||||||
|
|
||||||
### ✅ VOLLSTÄNDIGE COMPLIANCE ERREICHT
|
|
||||||
|
|
||||||
1. **Alle Port-Konflikte behoben** - Keine Kollisionen mehr zwischen Services
|
|
||||||
2. **Infrastructure Module vollständig containerisiert** - Komplette Docker-Integration
|
|
||||||
3. **Optimierungen implementiert** - Performance und Security Best Practices
|
|
||||||
4. **Konsistente Konfiguration** - Einheitliche Patterns über alle Dateien
|
|
||||||
5. **Skalierbare und wartbare Architektur** - Logische Port-Gruppierung
|
|
||||||
6. **Funktionierende Health Checks** - Korrekte Port-Verwendung in allen Prüfungen
|
|
||||||
|
|
||||||
### 📊 Quantifizierte Verbesserungen
|
|
||||||
- **Port-Konflikte**: 3 kritische Konflikte → 0 Konflikte ✅
|
|
||||||
- **Health Check Erfolgsrate**: ~60% → 100% ✅
|
|
||||||
- **Konfigurationskonsistenz**: Fragmentiert → Vollständig einheitlich ✅
|
|
||||||
- **Wartbarkeit**: Verbessert durch logische Port-Gruppierung ✅
|
|
||||||
|
|
||||||
### 🚀 Empfehlungen für die Zukunft
|
|
||||||
1. **Monitoring**: Überwachung der Port-Nutzung bei Service-Erweiterungen
|
|
||||||
2. **Documentation**: Port-Zuordnungen in README-Dateien aktuell halten
|
|
||||||
3. **Testing**: Regelmäßige Tests der Health Check Endpoints
|
|
||||||
4. **Security**: Regelmäßige Updates der Base Images in Dockerfiles
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Analyse-Zeitraum**: 9.-10. September 2025
|
|
||||||
**Status**: ✅ ALLE DOCKER-ANFORDERUNGEN VOLLSTÄNDIG ERFÜLLT
|
|
||||||
**Ursprüngliche Dateien konsolidiert**: DOCKER_INCONSISTENCIES_ANALYSIS.md, PORT_CONFLICTS_ANALYSIS.md, PORT_OPTIMIZATION_SUMMARY.md, INFRASTRUCTURE_DOCKER_ANALYSIS_FINAL.md
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
# Docker Compose Fix Summary - Meldestelle Project
|
|
||||||
|
|
||||||
## What was failing
|
|
||||||
Starting docker-compose.services.yml or docker-compose.clients.yml alone (while docker-compose.yml was already running) failed with errors like:
|
|
||||||
- service "ping-service" depends on undefined service "consul"
|
|
||||||
- service "web-app" depends on undefined service "api-gateway"
|
|
||||||
|
|
||||||
## Root cause
|
|
||||||
Docker Compose validates depends_on only against services defined in the same compose project (the files provided in the same command). Our services/clients files referenced infrastructure services (consul, postgres, redis, keycloak, api-gateway) that live in docker-compose.yml, so starting them standalone produced “depends on undefined service”.
|
|
||||||
|
|
||||||
## Fixes applied (minimal, safe)
|
|
||||||
1. Removed cross-file depends_on from these files:
|
|
||||||
- docker-compose.services.yml → ping-service (removed depends_on on consul, postgres, redis)
|
|
||||||
- docker-compose.clients.yml → web-app, desktop-app, auth-server, monitoring-server (removed depends_on on api-gateway, keycloak, postgres)
|
|
||||||
2. Kept existing healthchecks. The apps already handle startup ordering by retrying connections, and you are starting infra first, so this is safe.
|
|
||||||
3. Left networking as-is to continue sharing the same project-scoped bridge network when using the same project name.
|
|
||||||
|
|
||||||
## How to run now
|
|
||||||
Option A — Recommended project name (ensures all stacks share the same resources):
|
|
||||||
- Start infra:
|
|
||||||
docker compose -p meldestelle -f docker-compose.yml up -d
|
|
||||||
- Start services (optional):
|
|
||||||
docker compose -p meldestelle -f docker-compose.services.yml up -d
|
|
||||||
- Start clients (optional):
|
|
||||||
docker compose -p meldestelle -f docker-compose.clients.yml up -d
|
|
||||||
|
|
||||||
Option B — Combined (unchanged and still works):
|
|
||||||
- Infra + Services:
|
|
||||||
docker compose -f docker-compose.yml -f docker-compose.services.yml up -d
|
|
||||||
- Infra + Clients:
|
|
||||||
docker compose -f docker-compose.yml -f docker-compose.clients.yml up -d
|
|
||||||
- Full stack:
|
|
||||||
docker compose -f docker-compose.yml -f docker-compose.services.yml -f docker-compose.clients.yml up -d
|
|
||||||
|
|
||||||
Notes:
|
|
||||||
- Always start docker-compose.yml before the others when running separately.
|
|
||||||
- Using -p meldestelle ensures the same project-scoped network (meldestelle_meldestelle-network) is reused so containers can resolve each other (postgres, consul, api-gateway, etc.).
|
|
||||||
- If you prefer not to pass -p each time, you can export COMPOSE_PROJECT_NAME=meldestelle in your shell or define it in .env.
|
|
||||||
|
|
||||||
## Status
|
|
||||||
- Services and clients files can now be started standalone (with -p meldestelle) while the infra stack is already running.
|
|
||||||
- Combined modes continue to work.
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
# Docker Container Analyse-Bericht
|
|
||||||
**Datum:** 09. September 2025, 10:57 Uhr
|
|
||||||
**System:** Meldestelle Projekt - Docker Container Status
|
|
||||||
|
|
||||||
## Executive Summary
|
|
||||||
Die Docker-Container-Analyse zeigt ein gemischtes Bild: Die meisten Basis-Services laufen stabil, aber es gibt **zwei kritische Ausfälle** die sofortige Aufmerksamkeit erfordern.
|
|
||||||
|
|
||||||
## Container Status Übersicht
|
|
||||||
|
|
||||||
### ✅ **GESUNDE CONTAINER** (Laufen einwandfrei)
|
|
||||||
| Container | Status | Port | Uptime |
|
|
||||||
|-----------|---------|------|--------|
|
|
||||||
| meldestelle-postgres | Healthy | 5432 | 3 Stunden |
|
|
||||||
| meldestelle-redis | Healthy | 6379 | 3 Stunden |
|
|
||||||
| meldestelle-consul | Healthy | 8500 | 3 Stunden |
|
|
||||||
| meldestelle-kafka | Healthy | 9092 | 3 Stunden |
|
|
||||||
| meldestelle-zookeeper | Healthy | 2181 | 3 Stunden |
|
|
||||||
| meldestelle-api-gateway | Healthy | 8081 | 3 Stunden |
|
|
||||||
| meldestelle-grafana | Healthy | 3000 | 3 Stunden |
|
|
||||||
|
|
||||||
### ❌ **KRITISCHE PROBLEME**
|
|
||||||
|
|
||||||
#### 1. **meldestelle-prometheus** - KONTINUIERLICHER NEUSTART
|
|
||||||
- **Status:** Restarting (Exit Code 2)
|
|
||||||
- **Problem:** Konfigurationsdatei fehlt
|
|
||||||
- **Fehler:** `open /etc/prometheus/prometheus.yml: no such file or directory`
|
|
||||||
- **Ursache:** Das Verzeichnis `./docker/monitoring/prometheus/` ist leer
|
|
||||||
- **Auswirkung:** Kein Monitoring der Services möglich
|
|
||||||
|
|
||||||
#### 2. **meldestelle-keycloak** - GESTOPPT
|
|
||||||
- **Status:** Exited (137) - vor 19 Minuten beendet
|
|
||||||
- **Problem:** Port-Konfigurationsfehler
|
|
||||||
- **Details:**
|
|
||||||
- Container läuft intern auf Port 8080
|
|
||||||
- Docker-Compose Mapping wurde auf 8081 geändert
|
|
||||||
- Health-Check versucht Port 8081, aber Service läuft auf 8080
|
|
||||||
- **Auswirkung:** Keine Authentifizierung verfügbar
|
|
||||||
|
|
||||||
## Identifizierte Konflikte und Probleme
|
|
||||||
|
|
||||||
### 🔧 **Konfigurationskonflikte**
|
|
||||||
1. **Keycloak Port-Mismatch:**
|
|
||||||
- Kürzliche Änderung: Port-Mapping von `8180:8080` auf `8180:8081`
|
|
||||||
- Health-Check zeigt auf `localhost:8081`, aber Keycloak läuft auf Port 8080
|
|
||||||
- Dies führt zu fehlschlagenden Health-Checks und Container-Neustart
|
|
||||||
|
|
||||||
### 📁 **Fehlende Dateien**
|
|
||||||
1. **Prometheus Konfiguration:**
|
|
||||||
- Verzeichnis `./docker/monitoring/prometheus/` existiert, ist aber leer
|
|
||||||
- Benötigt: `prometheus.yml` Konfigurationsdatei
|
|
||||||
- Ohne diese Datei kann Prometheus nicht starten
|
|
||||||
|
|
||||||
### ⚠️ **Weitere Beobachtungen**
|
|
||||||
1. **Umgebungsvariablen-Änderung:**
|
|
||||||
- In `.env.ping-test`: JAVA_OPTS wurde in Anführungszeichen gesetzt
|
|
||||||
- Dies deutet auf kürzliche Debugging-Aktivitäten hin
|
|
||||||
|
|
||||||
## Empfohlene Lösungsschritte
|
|
||||||
|
|
||||||
### **Sofort erforderlich:**
|
|
||||||
|
|
||||||
1. **Prometheus reparieren:**
|
|
||||||
```bash
|
|
||||||
# Erstelle prometheus.yml Konfigurationsdatei
|
|
||||||
touch ./docker/monitoring/prometheus/prometheus.yml
|
|
||||||
# Füge Basis-Konfiguration hinzu
|
|
||||||
```
|
|
||||||
|
|
||||||
2. **Keycloak Port-Problem lösen:**
|
|
||||||
```bash
|
|
||||||
# Option A: Health-Check auf Port 8080 ändern
|
|
||||||
# Option B: Keycloak auf Port 8081 konfigurieren
|
|
||||||
# Empfehlung: Health-Check anpassen
|
|
||||||
```
|
|
||||||
|
|
||||||
### **Mittelfristig:**
|
|
||||||
1. Vollständige Prometheus-Konfiguration mit Service-Discovery einrichten
|
|
||||||
2. Keycloak-Konfiguration standardisieren
|
|
||||||
3. Monitoring-Dashboards in Grafana konfigurieren
|
|
||||||
|
|
||||||
## Fazit
|
|
||||||
**Status: 🟡 GELB - Teilweise funktionsfähig**
|
|
||||||
|
|
||||||
- ✅ Kern-Infrastruktur (DB, Cache, Messaging) läuft stabil
|
|
||||||
- ❌ Monitoring und Authentifizierung sind ausgefallen
|
|
||||||
- 🔧 Zwei kritische Konfigurationsprobleme müssen behoben werden
|
|
||||||
|
|
||||||
Die Container-Infrastruktur ist grundsätzlich gut aufgesetzt mit ordnungsgemäßen Health-Checks und Abhängigkeiten. Die aktuellen Probleme sind konfigurationsbedingt und können schnell behoben werden.
|
|
||||||
@@ -1,133 +0,0 @@
|
|||||||
# Datei-Konsolidierung Empfehlungen - Meldestelle Projekt
|
|
||||||
|
|
||||||
**Datum:** 10. September 2025, 23:07 Uhr
|
|
||||||
**Analyse:** Vollständige Bewertung der 21 angeforderten Dateien
|
|
||||||
|
|
||||||
## Executive Summary
|
|
||||||
|
|
||||||
Von den 21 analysierten Dateien sind **alle noch benötigt**, jedoch gibt es erhebliche Konsolidierungs- und Aktualisierungsmöglichkeiten:
|
|
||||||
|
|
||||||
- **7 Dateien** können zusammengeführt werden (3 Gruppen)
|
|
||||||
- **2 Dateien** sollten gelöscht werden (Redundanz)
|
|
||||||
- **8 Dateien** benötigen Aktualisierungen (veraltete Port-Informationen)
|
|
||||||
- **4 Dateien** können unverändert bleiben
|
|
||||||
|
|
||||||
## Detaillierte Empfehlungen
|
|
||||||
|
|
||||||
### 🔄 ZUSAMMENFÜHREN (3 Gruppen)
|
|
||||||
|
|
||||||
#### Gruppe 1: Docker-Analyse Berichte → **DOCKER_ANALYSIS_COMPLETE.md**
|
|
||||||
**Zusammenführen:**
|
|
||||||
- `DOCKER_INCONSISTENCIES_ANALYSIS.md` (Sep 9) - Problemidentifikation
|
|
||||||
- `PORT_CONFLICTS_ANALYSIS.md` (Sep 10) - Spezifische Port-Konflikte
|
|
||||||
- `PORT_OPTIMIZATION_SUMMARY.md` (Sep 10) - Lösungsübersicht
|
|
||||||
- `INFRASTRUCTURE_DOCKER_ANALYSIS_FINAL.md` (Sep 10) - Finale Analyse
|
|
||||||
|
|
||||||
**Begründung:** Diese 4 Dateien dokumentieren den kompletten Workflow der Docker-Port-Optimierung von Problemerkennung bis zur Lösung. Sie enthalten überlappende Informationen und können zu einem umfassenden Analysebericht konsolidiert werden.
|
|
||||||
|
|
||||||
#### Gruppe 2: Projekt-Berichte → **PROJEKT_SERVICES_ANALYSIS.md**
|
|
||||||
**Zusammenführen:**
|
|
||||||
- `Ping-Service-Analyse-Bericht.md` - Service-spezifische Analyse
|
|
||||||
- `Ping-Service-Problem-Lösung.md` - Lösungsansätze
|
|
||||||
- `SERVICES_TEST_REPORT.md` - Test-Ergebnisse
|
|
||||||
|
|
||||||
**Begründung:** Diese 3 Dateien behandeln Service-Analysen und können zu einem konsolidierten Service-Analysebericht zusammengefasst werden.
|
|
||||||
|
|
||||||
### ❌ LÖSCHEN (Redundanz)
|
|
||||||
|
|
||||||
#### `FOLDER_STRUCTURE_ANALYSIS.md`
|
|
||||||
**Begründung:** Die Projektstruktur ist bereits umfassend in `README.md` dokumentiert und die Struktur ist stabil. Eine separate Strukturanalyse ist redundant.
|
|
||||||
|
|
||||||
#### `Trace-Bullet-Bericht.md`
|
|
||||||
**Begründung:** Falls sich auf veraltete Trace-Bullet-Tests bezieht, die durch umfassendere Tests ersetzt wurden.
|
|
||||||
|
|
||||||
### 🔧 AKTUALISIEREN (Veraltete Port-Informationen)
|
|
||||||
|
|
||||||
#### `README-DOCKER.md` (Sep 9)
|
|
||||||
**Problem:** Zeigt Web App auf Port 3000 (Zeile 31), aber wurde auf Port 4000 geändert
|
|
||||||
**Update benötigt:** Port-Konfigurationen aktualisieren
|
|
||||||
|
|
||||||
#### `README-DOCKER-CLIENT-CONTAINERIZATION.md` (Sep 10)
|
|
||||||
**Problem:** Zeigt Web App auf Port 3000 (Zeilen 13, 66, 98, 114), Health Check Port 3000
|
|
||||||
**Update benötigt:** Alle Port-Referenzen auf 4000 aktualisieren
|
|
||||||
|
|
||||||
#### `Makefile` (Sep 9)
|
|
||||||
**Problem:** Zeile 98 zeigt Web App auf Port 3000
|
|
||||||
**Update benötigt:** Port-Informationen in Ausgaben korrigieren
|
|
||||||
|
|
||||||
#### `README-PING-TEST.md` (Sep 9)
|
|
||||||
**Vermutung:** Könnte veraltete Port-Informationen enthalten
|
|
||||||
**Update benötigt:** Überprüfung und Aktualisierung der Port-Konfigurationen
|
|
||||||
|
|
||||||
#### `GATEWAY-STARTUP-GUIDE.md` (Sep 9)
|
|
||||||
**Update benötigt:** Überprüfung auf veraltete Port-/Konfigurationsinformationen
|
|
||||||
|
|
||||||
#### `README-ENV.md` (Sep 9)
|
|
||||||
**Update benötigt:** Überprüfung der Environment-Variable-Dokumentation
|
|
||||||
|
|
||||||
#### `README-PRODUCTION.md` (Sep 9)
|
|
||||||
**Update benötigt:** Überprüfung der Produktions-Port-Konfigurationen
|
|
||||||
|
|
||||||
#### `Docker-Container-Bericht.md` (Sep 9)
|
|
||||||
**Update benötigt:** Überprüfung und Aktualisierung der Container-Konfigurationsinformationen
|
|
||||||
|
|
||||||
### ✅ UNVERÄNDERT LASSEN
|
|
||||||
|
|
||||||
#### `README.md` (Sep 9)
|
|
||||||
**Status:** Umfassende, aktuelle Projektdokumentation
|
|
||||||
**Begründung:** Hauptdokumentation ist gut strukturiert und aktuell
|
|
||||||
|
|
||||||
#### `PROJEKT_OPTIMIERUNG_BERICHT.md` (Sep 10)
|
|
||||||
**Status:** Aktueller Optimierungsbericht
|
|
||||||
**Begründung:** Neuester zusammenfassender Bericht über alle Optimierungen
|
|
||||||
|
|
||||||
#### `docker-compose-ping-test.yml` (Sep 9)
|
|
||||||
**Status:** Funktionale Test-Konfiguration
|
|
||||||
**Begründung:** Spezifische Test-Setup mit isolierten Ports, erfüllt klaren Zweck
|
|
||||||
|
|
||||||
#### `test-services-startup.sh` (Sep 9)
|
|
||||||
**Status:** Funktionales Test-Skript
|
|
||||||
**Begründung:** Automatisiertes Testing-Tool, aktiv verwendet
|
|
||||||
|
|
||||||
## Implementierungsplan
|
|
||||||
|
|
||||||
### Phase 1: Zusammenführungen (Priorität: Hoch)
|
|
||||||
1. **Docker-Analyse-Konsolidierung**
|
|
||||||
- Erstelle `DOCKER_ANALYSIS_COMPLETE.md`
|
|
||||||
- Integriere chronologischen Workflow: Problem → Analyse → Lösung → Verifikation
|
|
||||||
- Lösche 4 ursprüngliche Dateien
|
|
||||||
|
|
||||||
2. **Service-Analyse-Konsolidierung**
|
|
||||||
- Erstelle `PROJEKT_SERVICES_ANALYSIS.md`
|
|
||||||
- Kombiniere Service-spezifische Analysen und Tests
|
|
||||||
- Lösche 3 ursprüngliche Dateien
|
|
||||||
|
|
||||||
### Phase 2: Aktualisierungen (Priorität: Hoch)
|
|
||||||
1. **Port-Korrekturen (KRITISCH)**
|
|
||||||
- README-DOCKER.md: Port 3000 → 4000
|
|
||||||
- README-DOCKER-CLIENT-CONTAINERIZATION.md: Alle Port-Referenzen aktualisieren
|
|
||||||
- Makefile: Ausgabe-Ports korrigieren
|
|
||||||
|
|
||||||
2. **Dokumentations-Updates**
|
|
||||||
- Weitere README-Dateien überprüfen und aktualisieren
|
|
||||||
- Gateway- und Environment-Dokumentation überprüfen
|
|
||||||
|
|
||||||
### Phase 3: Bereinigung (Priorität: Mittel)
|
|
||||||
1. **Redundante Dateien löschen**
|
|
||||||
- FOLDER_STRUCTURE_ANALYSIS.md
|
|
||||||
- Trace-Bullet-Bericht.md (nach Verifikation)
|
|
||||||
|
|
||||||
## Ergebnis nach Implementierung
|
|
||||||
|
|
||||||
- **Von 21 auf 13 Dateien** (38% Reduktion)
|
|
||||||
- **Eliminierte Redundanzen** und Inkonsistenzen
|
|
||||||
- **Aktualisierte Dokumentation** mit korrekten Port-Konfigurationen
|
|
||||||
- **Verbesserte Wartbarkeit** durch konsolidierte Berichte
|
|
||||||
|
|
||||||
## Sofortige Maßnahmen empfohlen
|
|
||||||
|
|
||||||
1. **KRITISCH:** Port-Updates in README und Makefile (Produktionsrelevant)
|
|
||||||
2. **HOCH:** Docker-Analyse-Konsolidierung (Reduziert Verwirrung)
|
|
||||||
3. **MITTEL:** Service-Analyse-Konsolidierung und Bereinigung
|
|
||||||
|
|
||||||
Diese Empfehlungen adressieren alle Anforderungen aus der ursprünglichen Anfrage und optimieren die Projektdokumentation erheblich.
|
|
||||||
@@ -1,200 +0,0 @@
|
|||||||
# Gateway Startup Guide - Korrigierte Befehle
|
|
||||||
|
|
||||||
Dieses Dokument erklärt die korrekten Befehle zum Starten des API Gateways sowohl mit Gradle als auch mit Docker.
|
|
||||||
|
|
||||||
## Wichtiger Hinweis: Arbeitsverzeichnis
|
|
||||||
|
|
||||||
**ALLE BEFEHLE MÜSSEN AUS DEM PROJEKT-ROOT-VERZEICHNIS AUSGEFÜHRT WERDEN:**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Sicherstellen, dass Sie im richtigen Verzeichnis sind
|
|
||||||
cd /home/stefan/WsMeldestelle/Meldestelle
|
|
||||||
|
|
||||||
# Überprüfen des aktuellen Verzeichnisses
|
|
||||||
pwd
|
|
||||||
# Sollte ausgeben: /home/stefan/WsMeldestelle/Meldestelle
|
|
||||||
|
|
||||||
# Überprüfen, dass gradlew vorhanden ist
|
|
||||||
ls -la gradlew
|
|
||||||
```
|
|
||||||
|
|
||||||
## 1. Gateway mit Gradle starten
|
|
||||||
|
|
||||||
### Entwicklungsumgebung (Development)
|
|
||||||
```bash
|
|
||||||
# Aus dem Projekt-Root-Verzeichnis:
|
|
||||||
./gradlew :infrastructure:gateway:bootRun
|
|
||||||
|
|
||||||
# Mit spezifischem Profil:
|
|
||||||
./gradlew :infrastructure:gateway:bootRun --args='--spring.profiles.active=dev'
|
|
||||||
```
|
|
||||||
|
|
||||||
### Produktionsumgebung
|
|
||||||
```bash
|
|
||||||
# Gateway JAR bauen:
|
|
||||||
./gradlew :infrastructure:gateway:bootJar
|
|
||||||
|
|
||||||
# Gateway ausführen:
|
|
||||||
java -jar infrastructure/gateway/build/libs/gateway-*.jar
|
|
||||||
```
|
|
||||||
|
|
||||||
## 2. Gateway mit Docker starten
|
|
||||||
|
|
||||||
### Docker Image bauen
|
|
||||||
```bash
|
|
||||||
# Aus dem Projekt-Root-Verzeichnis:
|
|
||||||
docker build -t meldestelle/gateway:latest -f infrastructure/gateway/Dockerfile .
|
|
||||||
|
|
||||||
# Mit Build-Argumenten (optional):
|
|
||||||
docker build \
|
|
||||||
--build-arg SPRING_PROFILES_ACTIVE=prod \
|
|
||||||
-t meldestelle/gateway:latest \
|
|
||||||
-f infrastructure/gateway/Dockerfile .
|
|
||||||
```
|
|
||||||
|
|
||||||
### Docker Container starten
|
|
||||||
```bash
|
|
||||||
# Einfacher Start:
|
|
||||||
docker run -p 8080:8080 meldestelle/gateway:latest
|
|
||||||
|
|
||||||
# Mit Umgebungsvariablen:
|
|
||||||
docker run \
|
|
||||||
-p 8080:8080 \
|
|
||||||
-e SPRING_PROFILES_ACTIVE=prod \
|
|
||||||
-e CONSUL_HOST=localhost \
|
|
||||||
-e CONSUL_PORT=8500 \
|
|
||||||
--name gateway \
|
|
||||||
meldestelle/gateway:latest
|
|
||||||
|
|
||||||
# Im Hintergrund starten:
|
|
||||||
docker run -d \
|
|
||||||
-p 8080:8080 \
|
|
||||||
-e SPRING_PROFILES_ACTIVE=prod \
|
|
||||||
--name gateway \
|
|
||||||
meldestelle/gateway:latest
|
|
||||||
```
|
|
||||||
|
|
||||||
### Docker Container verwalten
|
|
||||||
```bash
|
|
||||||
# Container Status prüfen:
|
|
||||||
docker ps
|
|
||||||
|
|
||||||
# Logs anzeigen:
|
|
||||||
docker logs gateway
|
|
||||||
|
|
||||||
# Container stoppen:
|
|
||||||
docker stop gateway
|
|
||||||
|
|
||||||
# Container entfernen:
|
|
||||||
docker rm gateway
|
|
||||||
|
|
||||||
# Image entfernen:
|
|
||||||
docker rmi meldestelle/gateway:latest
|
|
||||||
```
|
|
||||||
|
|
||||||
## 3. Gateway mit Docker Compose
|
|
||||||
|
|
||||||
### docker-compose.yml verwenden
|
|
||||||
```bash
|
|
||||||
# Services starten (inkl. Gateway):
|
|
||||||
docker-compose up -d gateway
|
|
||||||
|
|
||||||
# Oder alle Services:
|
|
||||||
docker-compose up -d
|
|
||||||
|
|
||||||
# Logs verfolgen:
|
|
||||||
docker-compose logs -f gateway
|
|
||||||
|
|
||||||
# Services stoppen:
|
|
||||||
docker-compose down
|
|
||||||
```
|
|
||||||
|
|
||||||
## 4. Fehlerbehebung
|
|
||||||
|
|
||||||
### Häufige Fehler und Lösungen
|
|
||||||
|
|
||||||
#### "./gradlew: Datei oder Verzeichnis nicht gefunden"
|
|
||||||
**Problem:** Sie befinden sich nicht im Projekt-Root-Verzeichnis.
|
|
||||||
**Lösung:**
|
|
||||||
```bash
|
|
||||||
cd /home/stefan/WsMeldestelle/Meldestelle
|
|
||||||
ls -la gradlew # Sollte die gradlew-Datei anzeigen
|
|
||||||
```
|
|
||||||
|
|
||||||
#### "lstat infrastructure: no such file or directory"
|
|
||||||
**Problem:** Docker build wird mit falschem Kontext ausgeführt.
|
|
||||||
**Lösung:**
|
|
||||||
```bash
|
|
||||||
# Sicherstellen, dass Sie im Projekt-Root sind:
|
|
||||||
cd /home/stefan/WsMeldestelle/Meldestelle
|
|
||||||
|
|
||||||
# Dockerfile-Pfad korrekt angeben:
|
|
||||||
docker build -t meldestelle/gateway:latest -f infrastructure/gateway/Dockerfile .
|
|
||||||
```
|
|
||||||
|
|
||||||
#### "Image nicht gefunden" beim docker run
|
|
||||||
**Problem:** Das Image wurde noch nicht gebaut.
|
|
||||||
**Lösung:**
|
|
||||||
```bash
|
|
||||||
# Zuerst das Image bauen:
|
|
||||||
docker build -t meldestelle/gateway:latest -f infrastructure/gateway/Dockerfile .
|
|
||||||
|
|
||||||
# Dann den Container starten:
|
|
||||||
docker run -p 8080:8080 meldestelle/gateway:latest
|
|
||||||
```
|
|
||||||
|
|
||||||
## 5. Gateway Health Check
|
|
||||||
|
|
||||||
Nach dem Start können Sie die Gateway-Gesundheit überprüfen:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Health Endpoint:
|
|
||||||
curl http://localhost:8080/actuator/health
|
|
||||||
|
|
||||||
# Metriken:
|
|
||||||
curl http://localhost:8080/actuator/metrics
|
|
||||||
|
|
||||||
# Gateway-Routen:
|
|
||||||
curl http://localhost:8080/actuator/gateway/routes
|
|
||||||
```
|
|
||||||
|
|
||||||
## 6. Umgebungsvariablen
|
|
||||||
|
|
||||||
Wichtige Umgebungsvariablen für die Gateway-Konfiguration:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Spring Profil
|
|
||||||
export SPRING_PROFILES_ACTIVE=dev|test|prod
|
|
||||||
|
|
||||||
# Consul Konfiguration
|
|
||||||
export CONSUL_HOST=localhost
|
|
||||||
export CONSUL_PORT=8500
|
|
||||||
|
|
||||||
# Gateway Admin Credentials
|
|
||||||
export GATEWAY_ADMIN_USER=admin
|
|
||||||
export GATEWAY_ADMIN_PASSWORD=secure-password
|
|
||||||
|
|
||||||
# Logging Level
|
|
||||||
export LOGGING_LEVEL_ROOT=INFO
|
|
||||||
export LOGGING_LEVEL_GATEWAY=DEBUG
|
|
||||||
```
|
|
||||||
|
|
||||||
## 7. Zusammenfassung der korrekten Befehle
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# IMMER aus dem Projekt-Root-Verzeichnis:
|
|
||||||
cd /home/stefan/WsMeldestelle/Meldestelle
|
|
||||||
|
|
||||||
# Gateway mit Gradle starten:
|
|
||||||
./gradlew :infrastructure:gateway:bootRun
|
|
||||||
|
|
||||||
# Gateway Docker Image bauen:
|
|
||||||
docker build -t meldestelle/gateway:latest -f infrastructure/gateway/Dockerfile .
|
|
||||||
|
|
||||||
# Gateway Container starten:
|
|
||||||
docker run -p 8080:8080 meldestelle/gateway:latest
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Wichtiger Hinweis:** Alle Pfade sind relativ zum Projekt-Root-Verzeichnis (`/home/stefan/WsMeldestelle/Meldestelle`). Stellen Sie sicher, dass Sie sich immer in diesem Verzeichnis befinden, bevor Sie die Befehle ausführen.
|
|
||||||
@@ -1,217 +0,0 @@
|
|||||||
# Projekt Optimierung Bericht - Meldestelle
|
|
||||||
**Datum:** 10. September 2025, 22:51 Uhr
|
|
||||||
**Analyst:** Junie AI Assistant
|
|
||||||
**Projekt:** Meldestelle (Kotlin Multiplatform mit Compose)
|
|
||||||
**Update:** Vollständige Infrastruktur-Optimierung und Port-Konflikt-Behebung
|
|
||||||
|
|
||||||
## Zusammenfassung
|
|
||||||
|
|
||||||
Das Meldestelle-Projekt wurde umfassend analysiert und optimiert. Es handelt sich um eine moderne, gut strukturierte Kotlin Multiplatform-Anwendung mit Compose Multiplatform für Desktop- und Web-Clients. Die Analyse ergab, dass das Projekt bereits auf einem hohen technischen Niveau steht, aber mehrere wichtige Optimierungen implementiert werden konnten.
|
|
||||||
|
|
||||||
## Haupterkenntnisse
|
|
||||||
|
|
||||||
### ✅ Positive Aspekte (bereits vorhanden)
|
|
||||||
- **Moderne Technologien:** Kotlin 2.2.10, Spring Boot 3.5.5, Compose Multiplatform 1.8.2
|
|
||||||
- **Aktuelle Dependencies:** Sehr gut gepflegte Abhängigkeiten (letzte Aktualisierung: 2025-07-31)
|
|
||||||
- **Saubere Architektur:** Klare Trennung in Core, Platform, Infrastructure und Client Module
|
|
||||||
- **Docker-Integration:** Umfassende Container-Unterstützung
|
|
||||||
- **Multiplatform-Setup:** Korrekte Implementierung für JVM (Desktop) und WASM-JS (Web)
|
|
||||||
- **Gradle 9.0.0:** Neueste Gradle-Version mit modernen Features
|
|
||||||
|
|
||||||
### ⚠️ Identifizierte Probleme und Lösungen
|
|
||||||
|
|
||||||
## Implementierte Optimierungen
|
|
||||||
|
|
||||||
### 🆕 NEUE KRITISCHE OPTIMIERUNGEN (Abend 10.09.2025)
|
|
||||||
|
|
||||||
#### ✅ Port-Konflikt-Resolution (KRITISCH)
|
|
||||||
**Problem:** Schwerwiegende Port-Konflikte identifiziert und behoben
|
|
||||||
- ❌ Web-App Health Check verwendete falschen Port (3000 statt 4000)
|
|
||||||
- ❌ Desktop VNC Port-Mapping inkonsistent (6901 vs 6080)
|
|
||||||
- ❌ Environment Variables inkonsistent
|
|
||||||
- ❌ Dockerfile-Konfigurationen widersprüchlich
|
|
||||||
|
|
||||||
**✅ ALLE KONFLIKTE BEHOBEN:**
|
|
||||||
```bash
|
|
||||||
# Web App Health Check Korrektur
|
|
||||||
healthcheck:
|
|
||||||
test: ["CMD", "curl", "--fail", "http://localhost:4000/health"] # ✅ War 3000
|
|
||||||
|
|
||||||
# Desktop VNC Port Mapping Korrektur
|
|
||||||
ports:
|
|
||||||
- "6080:6080" # ✅ War 6901:6901
|
|
||||||
- "5901:5901"
|
|
||||||
|
|
||||||
# Environment Variables Konsistenz
|
|
||||||
DESKTOP_WEB_VNC_PORT=6080 # ✅ War 6901
|
|
||||||
```
|
|
||||||
|
|
||||||
#### ✅ Vollständige Infrastruktur-Docker-Analyse
|
|
||||||
**Umfassende Containerisierung abgeschlossen:**
|
|
||||||
- **Gateway Dockerfile optimiert:** Multi-Stage Build, Security Hardening
|
|
||||||
- **Port-Gruppierung:** Logische 8000er-Bereiche für Services
|
|
||||||
- **Health Check Konsistenz:** Alle Services verwenden korrekte Ports
|
|
||||||
- **Security Best Practices:** Non-root Users, Network Isolation
|
|
||||||
|
|
||||||
### 1. Docker-Konfiguration Fixes (Ursprüngliche Optimierungen)
|
|
||||||
**Problem:** Veraltete und inkorrekte Docker-Konfigurationen
|
|
||||||
- ❌ Falsche Client-Pfade (`client/web-app` statt `client`)
|
|
||||||
- ❌ Veraltete Gradle-Version (8.10 statt 9.0)
|
|
||||||
- ❌ Falsche Build-Tasks (`jsBrowserDistribution` statt `wasmJsBrowserDistribution`)
|
|
||||||
- ❌ Unnötige Node.js Installation für WASM-Builds
|
|
||||||
- ❌ Keycloak Port-Mismatch (8080 vs 8081)
|
|
||||||
|
|
||||||
**✅ Lösungen implementiert:**
|
|
||||||
- Client-Pfade korrigiert: `client/web-app` → `client`
|
|
||||||
- Gradle-Version aktualisiert: `8.10` → `9.0`
|
|
||||||
- Build-Tasks korrigiert: `jsBrowserDistribution` → `wasmJsBrowserDistribution`
|
|
||||||
- Node.js Installation entfernt (nicht benötigt für WASM)
|
|
||||||
- Keycloak Ports vereinheitlicht
|
|
||||||
|
|
||||||
### 2. Dependency Updates
|
|
||||||
**✅ Aktualisierungen:**
|
|
||||||
- Keycloak: 23.0 → 25.0.6 (entspricht Version Catalog)
|
|
||||||
- Gradle Wrapper: bestätigt auf 9.0.0
|
|
||||||
- Docker Build-Konfiguration korrigiert
|
|
||||||
|
|
||||||
### 3. Security Enhancements
|
|
||||||
**✅ Nginx Sicherheits-Header hinzugefügt:**
|
|
||||||
```nginx
|
|
||||||
# Neue Security Headers
|
|
||||||
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'wasm-unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self';" always;
|
|
||||||
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
|
|
||||||
```
|
|
||||||
- **CSP:** Content Security Policy mit WASM-Unterstützung
|
|
||||||
- **HSTS:** Strict Transport Security für HTTPS-Erzwingung
|
|
||||||
|
|
||||||
### 4. Build Performance Optimierungen
|
|
||||||
**✅ Implementierte Verbesserungen:**
|
|
||||||
- Entfernung unnötiger Node.js Installation (reduziert Docker Image-Größe)
|
|
||||||
- Korrekte WASM-Build-Tasks verwenden
|
|
||||||
- Curl-Installation für Health Checks optimiert
|
|
||||||
- Docker Layer-Caching durch bessere Reihenfolge
|
|
||||||
|
|
||||||
### 5. Code Structure Improvements
|
|
||||||
**✅ Verbesserungen:**
|
|
||||||
- Business Module Status dokumentiert (temporär deaktiviert für Multiplatform-Migration)
|
|
||||||
- Klare Kommentierung warum Module deaktiviert sind
|
|
||||||
- Korrekte Pfad-Referenzen in allen Docker-Files
|
|
||||||
|
|
||||||
## Build-Verifikation
|
|
||||||
|
|
||||||
**✅ Build erfolgreich:**
|
|
||||||
```
|
|
||||||
BUILD SUCCESSFUL in 1m 22s
|
|
||||||
202 actionable tasks: 143 executed, 34 from cache, 25 up-to-date
|
|
||||||
```
|
|
||||||
|
|
||||||
**✅ WASM-Output generiert:**
|
|
||||||
- `skiko.wasm`: 8.01 MiB
|
|
||||||
- `Meldestelle-client.wasm`: 1.44 MiB
|
|
||||||
- `composeApp.js`: 542 KiB
|
|
||||||
|
|
||||||
## Aktuelle Projekt-Struktur
|
|
||||||
|
|
||||||
### Aktive Module
|
|
||||||
```
|
|
||||||
├── core (core-domain, core-utils)
|
|
||||||
├── platform (platform-bom, platform-dependencies, platform-testing)
|
|
||||||
├── infrastructure (gateway, auth, messaging, cache, event-store, monitoring)
|
|
||||||
├── client (Compose Multiplatform - JVM + WASM-JS)
|
|
||||||
├── temp (ping-service)
|
|
||||||
└── docs
|
|
||||||
```
|
|
||||||
|
|
||||||
### Deaktivierte Business Module
|
|
||||||
```
|
|
||||||
├── members (domain, application, infrastructure, api, service)
|
|
||||||
├── horses (domain, application, infrastructure, api, service)
|
|
||||||
├── events (domain, application, infrastructure, api, service)
|
|
||||||
└── masterdata (domain, application, infrastructure, api, service)
|
|
||||||
```
|
|
||||||
|
|
||||||
**Grund:** Diese Module benötigen Multiplatform-Konfiguration Updates für KMP/WASM-Kompatibilität.
|
|
||||||
|
|
||||||
## Empfehlungen für weitere Optimierungen
|
|
||||||
|
|
||||||
### ✅ ABGESCHLOSSENE KRITISCHE OPTIMIERUNGEN
|
|
||||||
**Seit der ursprünglichen Analyse zusätzlich implementiert:**
|
|
||||||
1. **Port-Konflikt-Behebung** ✅ VOLLSTÄNDIG BEHOBEN
|
|
||||||
- Alle 3 kritischen Port-Konflikte identifiziert und behoben
|
|
||||||
- Web-App Health Checks funktionieren (Port 4000)
|
|
||||||
- Desktop VNC korrekt erreichbar (Port 6080)
|
|
||||||
- Environment Variables vollständig konsistent
|
|
||||||
2. **Infrastruktur-Docker-Analyse** ✅ ABGESCHLOSSEN
|
|
||||||
- Vollständige Containerisierung aller Infrastructure Services
|
|
||||||
- Gateway Dockerfile optimiert mit Security Hardening
|
|
||||||
- Port-Gruppierung nach logischen Bereichen implementiert
|
|
||||||
|
|
||||||
### 🔄 Nächste Schritte (Priorität: Hoch)
|
|
||||||
1. **Business Module Migration**
|
|
||||||
- Platform-Testing Modul für JS/WASM erweitern
|
|
||||||
- Business Module Build-Scripts für Multiplatform anpassen
|
|
||||||
- Graduelle Reaktivierung der Module
|
|
||||||
|
|
||||||
### 🔄 Mittelfristige Verbesserungen
|
|
||||||
1. **Performance**
|
|
||||||
- Configuration Cache aktivieren (`--configuration-cache`)
|
|
||||||
- Build Cache Optimierung
|
|
||||||
- Parallel Builds verbessern
|
|
||||||
|
|
||||||
2. **Security**
|
|
||||||
- Secrets Management für Docker Compose
|
|
||||||
- Certificate Management für HTTPS
|
|
||||||
- Vulnerability Scanning Integration
|
|
||||||
|
|
||||||
3. **Monitoring**
|
|
||||||
- Health Check Endpoints für alle Services
|
|
||||||
- Metrics Dashboard Setup
|
|
||||||
- Log Aggregation
|
|
||||||
|
|
||||||
### 🔄 Langfristige Optimierungen
|
|
||||||
1. **CI/CD Pipeline**
|
|
||||||
- Automated Testing Pipeline
|
|
||||||
- Container Registry Integration
|
|
||||||
- Deployment Automation
|
|
||||||
|
|
||||||
2. **Development Experience**
|
|
||||||
- Hot-Reload für alle Module
|
|
||||||
- Development Docker Compose Setup
|
|
||||||
- IDE Integration Verbesserungen
|
|
||||||
|
|
||||||
## Risikobewertung
|
|
||||||
|
|
||||||
### ✅ Niedrig
|
|
||||||
- Docker-Konfiguration Fixes: Vollständig getestet
|
|
||||||
- Dependency Updates: Kompatibel
|
|
||||||
- Security Headers: Standard-konform
|
|
||||||
|
|
||||||
### ⚠️ Mittel
|
|
||||||
- Business Module Reaktivierung: Erfordert weitere Arbeit
|
|
||||||
- Chrome Testing Issues: Environment-spezifisch
|
|
||||||
|
|
||||||
### 🔴 Keine kritischen Risiken identifiziert
|
|
||||||
|
|
||||||
## Fazit
|
|
||||||
|
|
||||||
Das Meldestelle-Projekt ist technisch sehr gut aufgestellt und folgt modernen Best Practices. Die implementierten Optimierungen verbessern:
|
|
||||||
|
|
||||||
- **Sicherheit:** Enhanced Security Headers + Docker Security Hardening
|
|
||||||
- **Performance:** Optimierte Docker Builds + Port-Konflikt-freie Architektur
|
|
||||||
- **Wartbarkeit:** Korrekte Konfigurationen + Vollständige Infrastruktur-Containerisierung
|
|
||||||
- **Stabilität:** Funktionierende WASM-Builds + Konsistente Health Checks
|
|
||||||
- **🆕 Zuverlässigkeit:** Alle kritischen Port-Konflikte behoben
|
|
||||||
- **🆕 Betriebsbereitschaft:** Vollständige Docker-Container-Infrastruktur
|
|
||||||
|
|
||||||
### Zusätzliche Analyse-Dokumentation
|
|
||||||
**Erweiterte Dokumentation erstellt:**
|
|
||||||
- `INFRASTRUCTURE_DOCKER_ANALYSIS_FINAL.md` - Vollständige Container-Analyse
|
|
||||||
- `PORT_CONFLICTS_ANALYSIS.md` - Detaillierte Port-Konflikt-Analyse
|
|
||||||
- `PORT_OPTIMIZATION_SUMMARY.md` - Zusammenfassung aller Optimierungen
|
|
||||||
|
|
||||||
Die wichtigste verbleibende Aufgabe ist die Migration der Business Module für vollständige Multiplatform-Kompatibilität, was das Projekt zu seinem vollen Potenzial bringen würde.
|
|
||||||
|
|
||||||
---
|
|
||||||
**Status:** ✅ Umfassende Optimierung erfolgreich abgeschlossen
|
|
||||||
**Zusätzliche Achievements:** ✅ Kritische Port-Konflikte behoben, ✅ Infrastruktur vollständig containerisiert
|
|
||||||
**Nächster Review:** Bei Business Module Migration
|
|
||||||
@@ -1,314 +0,0 @@
|
|||||||
# Projekt Services Analyse - Vollständiger Bericht
|
|
||||||
|
|
||||||
**Datum:** 10. September 2025, 23:13 Uhr
|
|
||||||
**Status:** Umfassende Service-Analyse und Problemlösung abgeschlossen
|
|
||||||
**Konsolidiert aus:** 3 separaten Service-Berichten
|
|
||||||
|
|
||||||
## Executive Summary ✅
|
|
||||||
|
|
||||||
**VOLLSTÄNDIGE SERVICE-OPTIMIERUNG ERFOLGREICH**: Komplette Analyse, Problemlösung und Verifikation aller Meldestelle-Services. Von der initialen Problemidentifikation über die Lösungsimplementierung bis zur finalen Validierung durch umfassende Tests.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Phase 1: Problemidentifikation & Analyse (9. September 2025)
|
|
||||||
|
|
||||||
### 🔍 **Ping-Service Startup-Probleme identifiziert**
|
|
||||||
|
|
||||||
#### Status Übersicht
|
|
||||||
|
|
||||||
**✅ KORREKTE KONFIGURATIONEN**
|
|
||||||
| Komponente | Status | Details |
|
|
||||||
|------------|--------|---------|
|
|
||||||
| docker-compose.services.yml | ✅ Korrekt | Syntaktisch einwandfrei, alle Services definiert |
|
|
||||||
| Dockerfile | ✅ Vorhanden | Existiert unter `dockerfiles/services/ping-service/Dockerfile` |
|
|
||||||
| Dependencies | ✅ Verfügbar | Consul, Postgres, Redis laufen und sind healthy |
|
|
||||||
| Environment Variables | ✅ Definiert | Alle Variablen in .env.dev korrekt konfiguriert |
|
|
||||||
| Port-Mapping | ✅ Korrekt | 8082:8082 Port-Mapping funktional |
|
|
||||||
|
|
||||||
**❌ IDENTIFIZIERTE PROBLEME**
|
|
||||||
|
|
||||||
#### 1. Ping-Service Startup-Verzögerung
|
|
||||||
- **Status:** Container läuft, aber Health-Check schlägt fehl
|
|
||||||
- **Symptom:** Bleibt dauerhaft im Status "health: starting"
|
|
||||||
- **Fehler:** Connection Reset beim Zugriff auf `/actuator/health`
|
|
||||||
- **Ursache:** Anwendung startet nicht vollständig oder hängt bei der Initialisierung
|
|
||||||
|
|
||||||
#### 2. Environment Variable Resolution
|
|
||||||
- **Problem:** Einige Variablen werden nicht korrekt aufgelöst
|
|
||||||
- **Beobachtung:** In Logs erscheint `${JAVA_VERSION}` statt aufgelöster Wert
|
|
||||||
- **Auswirkung:** Deutet auf Build- oder Runtime-Konfigurationsprobleme hin
|
|
||||||
|
|
||||||
#### 3. Application Startup Issues
|
|
||||||
- **Symptom:** Spring Boot startet, aber Health-Endpoint wird nicht verfügbar
|
|
||||||
- **Details:**
|
|
||||||
- Service läuft auf Java 21.0.8
|
|
||||||
- Spring Boot 3.5.5 initialisiert korrekt
|
|
||||||
- Dev-Profil wird aktiviert
|
|
||||||
- Aber `/actuator/health` antwortet nicht
|
|
||||||
|
|
||||||
### Root Cause Analyse
|
|
||||||
|
|
||||||
**Wahrscheinliche Ursachen:**
|
|
||||||
1. **Application Configuration Issue** - Fehlende oder fehlerhafte Spring Boot Service Konfiguration
|
|
||||||
2. **Resource Constraints** - Insufficient Memory/CPU für Java 21 + Spring Boot
|
|
||||||
3. **Network/Port Issues** - Interne Port-Bindung funktioniert nicht korrekt
|
|
||||||
4. **Build Issues** - Unvollständiges Build-Artefakt
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Phase 2: Lösungsimplementierung (9. September 2025)
|
|
||||||
|
|
||||||
### ✅ **PROBLEM IDENTIFIZIERT UND GELÖST**
|
|
||||||
|
|
||||||
#### 1. Hauptproblem: Hardcodierte Consul-Konfiguration
|
|
||||||
```yaml
|
|
||||||
# FEHLERHAFT in temp/ping-service/src/main/resources/application.yml
|
|
||||||
spring:
|
|
||||||
cloud:
|
|
||||||
consul:
|
|
||||||
host: localhost # ❌ Hardcodiert für lokale Entwicklung
|
|
||||||
port: 8500
|
|
||||||
```
|
|
||||||
**Problem:** In Docker-Container-Umgebung muss der Consul-Host `consul` sein, nicht `localhost`.
|
|
||||||
|
|
||||||
#### 2. Sekundärproblem: Umgebungsvariablen im Dockerfile
|
|
||||||
**Problem:** Build-Args wurden nicht als ENV-Variablen exponiert.
|
|
||||||
|
|
||||||
### Implementierte Lösungen
|
|
||||||
|
|
||||||
#### ✅ **Lösung 1: Consul-Konfiguration korrigiert**
|
|
||||||
```yaml
|
|
||||||
# KORRIGIERT in temp/ping-service/src/main/resources/application.yml
|
|
||||||
spring:
|
|
||||||
application:
|
|
||||||
name: ping-service
|
|
||||||
cloud:
|
|
||||||
consul:
|
|
||||||
host: ${CONSUL_HOST:localhost} # ✅ Umgebungsvariable mit Fallback
|
|
||||||
port: ${CONSUL_PORT:8500} # ✅ Konfigurierbar
|
|
||||||
discovery:
|
|
||||||
enabled: ${CONSUL_ENABLED:true} # ✅ Kann deaktiviert werden
|
|
||||||
register: true
|
|
||||||
health-check-path: /actuator/health
|
|
||||||
health-check-interval: 10s
|
|
||||||
```
|
|
||||||
|
|
||||||
#### ✅ **Lösung 2: Dockerfile Environment-Variablen korrigiert**
|
|
||||||
```dockerfile
|
|
||||||
# KORRIGIERT im Dockerfile
|
|
||||||
# Convert build arguments to environment variables
|
|
||||||
ENV JAVA_VERSION=${JAVA_VERSION} \
|
|
||||||
VERSION=${VERSION} \
|
|
||||||
BUILD_DATE=${BUILD_DATE}
|
|
||||||
```
|
|
||||||
|
|
||||||
#### ✅ **Lösung 3: Docker-Compose Konfiguration angepasst**
|
|
||||||
```yaml
|
|
||||||
# KORRIGIERT in docker-compose.services.yml
|
|
||||||
ping-service:
|
|
||||||
environment:
|
|
||||||
SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE:-dev}
|
|
||||||
SERVER_PORT: ${PING_SERVICE_PORT:-8082}
|
|
||||||
CONSUL_HOST: consul # ✅ Korrekte Container-Referenz
|
|
||||||
CONSUL_PORT: ${CONSUL_PORT:-8500}
|
|
||||||
CONSUL_ENABLED: false # ✅ Temporär deaktiviert für Tests
|
|
||||||
```
|
|
||||||
|
|
||||||
### Technische Details der Lösung
|
|
||||||
|
|
||||||
**Warum die Umgebungsvariablen nicht funktionierten:**
|
|
||||||
1. **Build-Time vs Runtime:** Die ursprüngliche Konfiguration war zur Build-Zeit hardcodiert
|
|
||||||
2. **JAR-Kompilierung:** Spring Boot kompiliert die `application.yml` in das JAR-File
|
|
||||||
3. **Override-Reihenfolge:** Umgebungsvariablen können nur konfigurierbare Werte überschreiben
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Phase 3: Umfassende Systemverifikation (8.-9. September 2025)
|
|
||||||
|
|
||||||
### 🎯 **Infrastructure Services Testing - ERFOLGREICH**
|
|
||||||
|
|
||||||
#### ✅ **VOLLSTÄNDIG GETESTETE SERVICES**
|
|
||||||
|
|
||||||
**1. PostgreSQL Database** ✅
|
|
||||||
- Status: **HEALTHY**
|
|
||||||
- Health Check: `pg_isready -U meldestelle -d meldestelle`
|
|
||||||
- Port: 5432
|
|
||||||
- Notes: Startet korrekt und antwortet auf Health Checks
|
|
||||||
|
|
||||||
**2. Redis Cache** ✅
|
|
||||||
- Status: **HEALTHY**
|
|
||||||
- Health Check: `redis-cli ping`
|
|
||||||
- Port: 6379
|
|
||||||
- Notes: Initialisiert schnell und antwortet auf Ping-Kommandos
|
|
||||||
|
|
||||||
**3. Consul Service Discovery** ✅
|
|
||||||
- Status: **HEALTHY**
|
|
||||||
- Health Check: `http://localhost:8500/v1/status/leader`
|
|
||||||
- Port: 8500
|
|
||||||
- Response: Gibt valide Leader-Informationen zurück
|
|
||||||
- Notes: URL-Parsing-Problem gelöst, Health Endpoint funktioniert korrekt
|
|
||||||
|
|
||||||
**4. Prometheus Monitoring** ✅
|
|
||||||
- Status: **HEALTHY**
|
|
||||||
- Health Check: `http://localhost:9090/-/healthy`
|
|
||||||
- Port: 9090
|
|
||||||
- Notes: Monitoring-Service startet und antwortet korrekt
|
|
||||||
|
|
||||||
**5. Grafana Dashboard** ✅
|
|
||||||
- Status: **HEALTHY**
|
|
||||||
- Health Check: `http://localhost:3000/api/health`
|
|
||||||
- Port: 3000
|
|
||||||
- Notes: Dashboard-Service initialisiert und Health Endpoint antwortet
|
|
||||||
|
|
||||||
#### ⚠️ **Keycloak Authentication**
|
|
||||||
- Status: **PARTIALLY WORKING**
|
|
||||||
- Health Check: `http://localhost:8180/health/ready` (Endpoint benötigt Verifikation)
|
|
||||||
- Port: 8180
|
|
||||||
- Notes: Container startet aber Health Endpoint benötigt Verifikation
|
|
||||||
|
|
||||||
### 🔧 **Konfigurationsfixes verifiziert**
|
|
||||||
|
|
||||||
#### 1. Network Configuration ✅
|
|
||||||
- **Issue:** Services und Clients Compose Files hatten `external: true`
|
|
||||||
- **Fix:** Geändert zu `external: false` in beiden Files
|
|
||||||
- **Verifikation:** Services können innerhalb des meldestelle-network kommunizieren
|
|
||||||
|
|
||||||
#### 2. API Gateway Port Configuration ✅
|
|
||||||
- **Issue:** Port-Mismatch zwischen Dockerfile (8080) und Compose (8081)
|
|
||||||
- **Fix:** Dockerfile aktualisiert um `${GATEWAY_PORT:-8081}` konsistent zu verwenden
|
|
||||||
- **Verifikation:** Konfiguration standardisiert über alle Files
|
|
||||||
|
|
||||||
#### 3. Health Check Intervals ✅
|
|
||||||
- **Issue:** Inkonsistente Health Check Timings
|
|
||||||
- **Fix:** Standardisierte Intervalle:
|
|
||||||
- Infrastructure: 10s interval/5s timeout/3 retries/20s start_period
|
|
||||||
- Application: 15s interval/5s timeout/3 retries/30s start_period
|
|
||||||
- Clients: 30s interval/10s timeout/3 retries/60s start_period
|
|
||||||
- **Verifikation:** Alle Services verwenden konsistente Health Check Patterns
|
|
||||||
|
|
||||||
#### 4. Dockerfile Standardization ✅
|
|
||||||
- **Issue:** Inkonsistente JVM-Konfigurationen, User Creation Patterns
|
|
||||||
- **Fix:** Alle Dockerfiles mit modernen Java 21 Optimierungen ausgerichtet
|
|
||||||
- **Verifikation:** Konsistente Base Images, JVM Settings und Security Patterns
|
|
||||||
|
|
||||||
### 📊 **Test-Ergebnisse Analyse**
|
|
||||||
|
|
||||||
#### **SUCCESS METRICS**
|
|
||||||
- ✅ **5/6 Infrastructure Services**: Erfolgreich gestartet und healthy
|
|
||||||
- ✅ **Network Connectivity**: Services können intern kommunizieren
|
|
||||||
- ✅ **Health Checks**: Standardisierte Health Check Intervalle funktionieren
|
|
||||||
- ✅ **Port Configuration**: API Gateway Port-Konsistenz aufgelöst
|
|
||||||
- ✅ **Docker Configuration**: Alle Major Inkonsistenzen behoben
|
|
||||||
|
|
||||||
#### **TECHNISCHE ERRUNGENSCHAFTEN**
|
|
||||||
1. **Docker Compose Issues aufgelöst:** Alternative Testing-Ansatz mit direkten Docker-Kommandos erstellt
|
|
||||||
2. **URL-Parsing behoben:** Service-Konfiguration Parsing-Logik korrigiert
|
|
||||||
3. **Health Checks standardisiert:** Alle Services verwenden konsistente Health Check Patterns
|
|
||||||
4. **Network Configuration:** Services können innerhalb des gemeinsamen Networks kommunizieren
|
|
||||||
5. **Container Management:** Korrekte Cleanup- und Startup-Prozeduren implementiert
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Komplette Service-Übersicht (Nach Optimierung)
|
|
||||||
|
|
||||||
### 🏗️ **Infrastructure Services**
|
|
||||||
| Service | Port | Status | Health Check | Zweck |
|
|
||||||
|---------|------|--------|--------------|-------|
|
|
||||||
| PostgreSQL | 5432 | ✅ HEALTHY | `pg_isready` | Hauptdatenbank |
|
|
||||||
| Redis | 6379 | ✅ HEALTHY | `redis-cli ping` | Cache & Event Store |
|
|
||||||
| Consul | 8500 | ✅ HEALTHY | `/v1/status/leader` | Service Discovery |
|
|
||||||
| Prometheus | 9090 | ✅ HEALTHY | `/-/healthy` | Metrics Collection |
|
|
||||||
| Grafana | 3000 | ✅ HEALTHY | `/api/health` | Monitoring Dashboard |
|
|
||||||
| Keycloak | 8180 | ⚠️ PARTIAL | `/health/ready` | Authentication |
|
|
||||||
|
|
||||||
### ⚙️ **Application Services**
|
|
||||||
| Service | Port | Status | Health Check | Zweck |
|
|
||||||
|---------|------|--------|--------------|-------|
|
|
||||||
| Ping Service | 8082 | ✅ FIXED | `/actuator/health` | Health & Test Service |
|
|
||||||
| Members Service | 8083 | ✅ READY | `/actuator/health` | Member Management |
|
|
||||||
| Horses Service | 8084 | ✅ READY | `/actuator/health` | Horse Management |
|
|
||||||
| Events Service | 8085 | ✅ READY | `/actuator/health` | Event Management |
|
|
||||||
| Masterdata Service | 8086 | ✅ READY | `/actuator/health` | Master Data |
|
|
||||||
|
|
||||||
### 💻 **Client Services**
|
|
||||||
| Service | Port | Status | Health Check | Zweck |
|
|
||||||
|---------|------|--------|--------------|-------|
|
|
||||||
| Web App | 4000 | ✅ READY | `/health` | WASM Web Frontend |
|
|
||||||
| Desktop App | 6080/5901 | ✅ READY | `/vnc.html` | VNC Desktop Interface |
|
|
||||||
| Auth Server | 8087 | ✅ READY | `/actuator/health` | Auth Extensions |
|
|
||||||
| Monitoring Server | 8088 | ✅ READY | `/actuator/health` | Monitoring Extensions |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Empfohlene Deployment-Sequenz
|
|
||||||
|
|
||||||
### 1. Infrastructure Layer (Basis)
|
|
||||||
```bash
|
|
||||||
docker-compose up -d postgres redis consul prometheus grafana
|
|
||||||
# Warten bis alle healthy sind
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. Application Services
|
|
||||||
```bash
|
|
||||||
docker-compose -f docker-compose.yml -f docker-compose.services.yml up -d
|
|
||||||
# Ping-Service wird jetzt korrekt starten
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. Client Applications
|
|
||||||
```bash
|
|
||||||
docker-compose -f docker-compose.yml -f docker-compose.clients.yml up -d
|
|
||||||
# Alle Client-Anwendungen verfügbar
|
|
||||||
```
|
|
||||||
|
|
||||||
### 4. Vollständige Validierung
|
|
||||||
```bash
|
|
||||||
# Infrastructure Health Checks
|
|
||||||
curl http://localhost:9090/-/healthy # Prometheus
|
|
||||||
curl http://localhost:3000/api/health # Grafana
|
|
||||||
curl http://localhost:8500/v1/status/leader # Consul
|
|
||||||
|
|
||||||
# Application Health Checks
|
|
||||||
curl http://localhost:8082/actuator/health # Ping Service
|
|
||||||
curl http://localhost:8083/actuator/health # Members Service
|
|
||||||
curl http://localhost:8084/actuator/health # Horses Service
|
|
||||||
curl http://localhost:8085/actuator/health # Events Service
|
|
||||||
curl http://localhost:8086/actuator/health # Masterdata Service
|
|
||||||
|
|
||||||
# Client Health Checks
|
|
||||||
curl http://localhost:4000/health # Web App
|
|
||||||
curl http://localhost:6080/vnc.html # Desktop App
|
|
||||||
curl http://localhost:8087/actuator/health # Auth Server
|
|
||||||
curl http://localhost:8088/actuator/health # Monitoring Server
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Fazit & Ergebnisse
|
|
||||||
|
|
||||||
### ✅ **VOLLSTÄNDIGE SYSTEM-BEREITSCHAFT ERREICHT**
|
|
||||||
|
|
||||||
1. **Alle Service-Probleme gelöst** - Ping-Service und alle anderen Services funktional
|
|
||||||
2. **Infrastructure Services verifiziert** - 5/6 Services vollständig getestet und healthy
|
|
||||||
3. **Konfigurationskonsistenz** - Alle Docker-Konfigurationen standardisiert
|
|
||||||
4. **Health Check Optimierung** - Einheitliche Monitoring-Patterns implementiert
|
|
||||||
5. **Network-Probleme behoben** - Service-zu-Service Kommunikation funktioniert
|
|
||||||
6. **Build-Pipeline optimiert** - Environment Variables und Dockerfile-Patterns korrigiert
|
|
||||||
|
|
||||||
### 📊 **Quantifizierte Verbesserungen**
|
|
||||||
- **Service Startup Erfolgsrate**: ~40% → 95% ✅
|
|
||||||
- **Health Check Konsistenz**: Fragmentiert → Vollständig standardisiert ✅
|
|
||||||
- **Configuration Management**: Hardcodiert → Environment-Variable-basiert ✅
|
|
||||||
- **Infrastructure Zuverlässigkeit**: Instabil → Produktionsreif ✅
|
|
||||||
|
|
||||||
### 🚀 **System-Status: PRODUKTIONSBEREIT**
|
|
||||||
- Core Infrastructure Services vollständig operational
|
|
||||||
- Network-Konfigurationsprobleme gelöst
|
|
||||||
- Health Check Standardisierung komplett
|
|
||||||
- Service-Kommunikation verifiziert
|
|
||||||
- Container Management optimiert
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Analyse-Zeitraum**: 8.-9. September 2025
|
|
||||||
**Status**: ✅ **ALLE SERVICE-ANFORDERUNGEN VOLLSTÄNDIG ERFÜLLT**
|
|
||||||
**Ursprüngliche Dateien konsolidiert**: Ping-Service-Analyse-Bericht.md, Ping-Service-Problem-Lösung.md, SERVICES_TEST_REPORT.md
|
|
||||||
@@ -1,168 +0,0 @@
|
|||||||
# Meldestelle Client Containerization
|
|
||||||
|
|
||||||
## Übersicht
|
|
||||||
|
|
||||||
Dieses Dokument beschreibt die Docker-Containerisierung der Kotlin Compose Multiplatform Frontend-Anwendungen für das Meldestelle-Projekt.
|
|
||||||
|
|
||||||
## Implementierte Lösungen
|
|
||||||
|
|
||||||
### 🌐 Web Application (WASM) - Bereits funktionsfähig
|
|
||||||
- **Status**: ✅ Vollständig implementiert und funktionsfähig
|
|
||||||
- **Technologie**: Kotlin Compose Multiplatform mit WASM-Target
|
|
||||||
- **Container**: Nginx-basiertes Setup mit statischen Assets
|
|
||||||
- **Port**: 4000
|
|
||||||
- **Zugriff**: `http://localhost:4000`
|
|
||||||
- **Docker-Compose Service**: `web-app`
|
|
||||||
|
|
||||||
### 🖥️ Desktop Application (JVM) - Neu implementiert
|
|
||||||
- **Status**: ✅ Implementiert mit VNC-basierten GUI-Zugriff
|
|
||||||
- **Technologie**: Kotlin Compose Desktop mit VNC + noVNC
|
|
||||||
- **Container**: Ubuntu-basiert mit Xvfb, x11vnc, fluxbox, noVNC
|
|
||||||
- **Ports**:
|
|
||||||
- 6080 (noVNC Web-Interface)
|
|
||||||
- 5901 (Direkter VNC-Zugriff)
|
|
||||||
- **Zugriff**: `http://localhost:6080` (Web-basiertes VNC)
|
|
||||||
- **Docker-Compose Service**: `desktop-app`
|
|
||||||
|
|
||||||
## Verwendung
|
|
||||||
|
|
||||||
### Alle Client-Anwendungen starten
|
|
||||||
```bash
|
|
||||||
# Mit Backend-Services
|
|
||||||
docker-compose -f docker-compose.yml -f docker-compose.services.yml -f docker-compose.clients.yml up -d
|
|
||||||
|
|
||||||
# Nur Frontend-Anwendungen
|
|
||||||
docker-compose -f docker-compose.yml -f docker-compose.clients.yml up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
### Einzelne Anwendungen starten
|
|
||||||
```bash
|
|
||||||
# Nur Web-Anwendung
|
|
||||||
docker-compose -f docker-compose.yml -f docker-compose.clients.yml up -d web-app
|
|
||||||
|
|
||||||
# Nur Desktop-Anwendung
|
|
||||||
docker-compose -f docker-compose.yml -f docker-compose.clients.yml up -d desktop-app
|
|
||||||
```
|
|
||||||
|
|
||||||
## Desktop Application - VNC-Zugriff
|
|
||||||
|
|
||||||
### Web-basierter Zugriff (empfohlen)
|
|
||||||
1. Container starten: `docker-compose up -d desktop-app`
|
|
||||||
2. Browser öffnen: `http://localhost:6080`
|
|
||||||
3. VNC-Viewer startet automatisch
|
|
||||||
4. Meldestelle Desktop-Anwendung wird angezeigt
|
|
||||||
|
|
||||||
### Direkter VNC-Zugriff
|
|
||||||
1. VNC-Client installieren (z.B. TigerVNC, RealVNC)
|
|
||||||
2. Verbindung zu `localhost:5901` herstellen
|
|
||||||
3. Passwort: `meldestelle` (falls erforderlich)
|
|
||||||
|
|
||||||
## Architektur Details
|
|
||||||
|
|
||||||
### Web Application (WASM)
|
|
||||||
```
|
|
||||||
┌─────────────────┐ ┌──────────────┐ ┌─────────────────┐
|
|
||||||
│ Browser │────│ Nginx │────│ Static WASM │
|
|
||||||
│ localhost:4000│ │ Container │ │ Assets │
|
|
||||||
└─────────────────┘ └──────────────┘ └─────────────────┘
|
|
||||||
```
|
|
||||||
|
|
||||||
### Desktop Application (JVM + VNC)
|
|
||||||
```
|
|
||||||
┌─────────────────┐ ┌──────────────┐ ┌─────────────────┐
|
|
||||||
│ Browser │────│ noVNC │────│ VNC Server │
|
|
||||||
│ localhost:6080│ │ Web Interface│ │ (x11vnc) │
|
|
||||||
└─────────────────┘ └──────────────┘ └─────────────────┘
|
|
||||||
│
|
|
||||||
┌──────▼──────┐
|
|
||||||
│ Xvfb + Compose │
|
|
||||||
│ Desktop App │
|
|
||||||
└────────────────┘
|
|
||||||
```
|
|
||||||
|
|
||||||
## Build-Prozess
|
|
||||||
|
|
||||||
### Web Application
|
|
||||||
1. Gradle Build: `wasmJsBrowserDistribution`
|
|
||||||
2. Output: `/build/dist/wasmJs/productionExecutable/`
|
|
||||||
3. Nginx serving static assets
|
|
||||||
|
|
||||||
### Desktop Application
|
|
||||||
1. Gradle Build: `createDistributable`
|
|
||||||
2. Output: `/build/compose/binaries/main/app/`
|
|
||||||
3. VNC Environment Setup:
|
|
||||||
- Xvfb (Virtual X Server)
|
|
||||||
- fluxbox (Window Manager)
|
|
||||||
- x11vnc (VNC Server)
|
|
||||||
- noVNC (Web-based VNC Client)
|
|
||||||
|
|
||||||
## Umgebungsvariablen
|
|
||||||
|
|
||||||
### Web Application
|
|
||||||
- `API_BASE_URL`: Backend API URL (default: `http://api-gateway:8081`)
|
|
||||||
- `APP_TITLE`: Anwendungstitel (default: `Meldestelle`)
|
|
||||||
|
|
||||||
### Desktop Application
|
|
||||||
- `API_BASE_URL`: Backend API URL (default: `http://api-gateway:8081`)
|
|
||||||
- `DISPLAY`: X11 Display (default: `:99`)
|
|
||||||
- `VNC_PORT`: VNC Server Port (default: `5901`)
|
|
||||||
- `NOVNC_PORT`: noVNC Web Interface Port (default: `6080`)
|
|
||||||
|
|
||||||
## Health Checks
|
|
||||||
|
|
||||||
### Web Application
|
|
||||||
- Endpoint: `http://localhost:4000/health`
|
|
||||||
- Methode: HTTP GET
|
|
||||||
- Erwartete Antwort: `{"status":"ok","service":"web-app"}`
|
|
||||||
|
|
||||||
### Desktop Application
|
|
||||||
- Endpoint: `http://localhost:6080/vnc.html`
|
|
||||||
- Methode: HTTP GET (via noVNC)
|
|
||||||
- Überprüfung: noVNC Web-Interface verfügbar
|
|
||||||
|
|
||||||
## Logs und Debugging
|
|
||||||
|
|
||||||
### Container-Logs anzeigen
|
|
||||||
```bash
|
|
||||||
# Web Application
|
|
||||||
docker-compose logs -f web-app
|
|
||||||
|
|
||||||
# Desktop Application
|
|
||||||
docker-compose logs -f desktop-app
|
|
||||||
```
|
|
||||||
|
|
||||||
### Desktop Application Logs
|
|
||||||
- Application Logs: `/var/log/meldestelle.log`
|
|
||||||
- Error Logs: `/var/log/meldestelle_error.log`
|
|
||||||
- VNC Logs: Über supervisor zugänglich
|
|
||||||
|
|
||||||
## Troubleshooting
|
|
||||||
|
|
||||||
### Web Application
|
|
||||||
- **Container startet nicht**: Überprüfe API Gateway Verfügbarkeit
|
|
||||||
- **Leere Seite**: Überprüfe Browser-Kompatibilität mit WASM
|
|
||||||
- **API-Fehler**: Überprüfe Netzwerk-Konfiguration
|
|
||||||
|
|
||||||
### Desktop Application
|
|
||||||
- **VNC nicht erreichbar**: Überprüfe Port 6080 Verfügbarkeit
|
|
||||||
- **Schwarzer Bildschirm**: Warte 30-60s für Application Startup
|
|
||||||
- **Keine GUI**: Überprüfe Xvfb und Window Manager Status
|
|
||||||
- **Performance-Probleme**: VNC-Bildschirmauflösung reduzieren
|
|
||||||
|
|
||||||
## Erweiterungen
|
|
||||||
|
|
||||||
### VNC-Konfiguration anpassen
|
|
||||||
Die VNC-Konfiguration kann über Umgebungsvariablen oder durch Anpassung des `start-vnc.sh` Skripts im Dockerfile geändert werden.
|
|
||||||
|
|
||||||
### Alternative GUI-Lösungen
|
|
||||||
- **X11 Forwarding**: Für Linux-Host-Systeme
|
|
||||||
- **RDP**: Alternative Remote Desktop Lösung
|
|
||||||
- **Web-based Terminals**: Für minimale GUI-Anforderungen
|
|
||||||
|
|
||||||
## Fazit
|
|
||||||
|
|
||||||
✅ **Beide Containerisierungsansätze erfolgreich implementiert:**
|
|
||||||
- Web (WASM): Optimiert für moderne Browser
|
|
||||||
- Desktop (JVM): Universell über VNC-Web-Interface zugänglich
|
|
||||||
|
|
||||||
Die Lösung erfüllt alle Anforderungen aus der ursprünglichen Issue-Beschreibung und ermöglicht sowohl Web- als auch Desktop-Zugriff auf die Meldestelle-Anwendung über Docker-Container.
|
|
||||||
@@ -1,299 +0,0 @@
|
|||||||
# Meldestelle - Docker Konfiguration
|
|
||||||
|
|
||||||
## Übersicht
|
|
||||||
|
|
||||||
Das Meldestelle-Projekt nutzt eine modulare Docker-Compose-Struktur für verschiedene Deployment-Szenarien:
|
|
||||||
|
|
||||||
- **`docker-compose.yml`** - Basis-Infrastruktur (PostgreSQL, Redis, Keycloak, Consul, Kafka, Monitoring, Gateway)
|
|
||||||
- **`docker-compose.services.yml`** - Microservices (Ping, Members, Horses, Events, Masterdata)
|
|
||||||
- **`docker-compose.clients.yml`** - Client-Anwendungen (Web-App, Auth-Server, Monitoring-Server)
|
|
||||||
|
|
||||||
## Architektur
|
|
||||||
|
|
||||||
### Infrastruktur-Services (docker-compose.yml)
|
|
||||||
- **PostgreSQL** (Port 5432) - Hauptdatenbank
|
|
||||||
- **Redis** (Port 6379) - Cache und Event Store
|
|
||||||
- **Keycloak** (Port 8180) - Authentifizierung und Autorisierung
|
|
||||||
- **Consul** (Port 8500) - Service Discovery
|
|
||||||
- **Kafka + Zookeeper** (Ports 9092, 2181) - Event Streaming
|
|
||||||
- **Prometheus** (Port 9090) - Metriken-Sammlung
|
|
||||||
- **Grafana** (Port 3000) - Monitoring-Dashboard
|
|
||||||
- **API Gateway** (Port 8081) - Zentraler Eingang
|
|
||||||
|
|
||||||
### Microservices (docker-compose.services.yml)
|
|
||||||
- **Ping Service** (Port 8082) - Health Check und Test Service
|
|
||||||
- **Members Service** (Port 8083) - Mitgliederverwaltung
|
|
||||||
- **Horses Service** (Port 8084) - Pferdedaten
|
|
||||||
- **Events Service** (Port 8085) - Veranstaltungen
|
|
||||||
- **Masterdata Service** (Port 8086) - Stammdaten
|
|
||||||
|
|
||||||
### Client-Anwendungen (docker-compose.clients.yml)
|
|
||||||
- **Web Application** (Port 4000) - Kotlin Multiplatform Frontend
|
|
||||||
- **Auth Server** (Port 8087) - Erweiterte Authentifizierung
|
|
||||||
- **Monitoring Server** (Port 8088) - Monitoring-Erweiterungen
|
|
||||||
|
|
||||||
## Verwendung
|
|
||||||
|
|
||||||
### Nur Infrastruktur starten
|
|
||||||
```bash
|
|
||||||
# Für Backend-Entwicklung
|
|
||||||
docker-compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
### Vollständiges System
|
|
||||||
```bash
|
|
||||||
# Alle Services und Clients
|
|
||||||
docker-compose -f docker-compose.yml \
|
|
||||||
-f docker-compose.services.yml \
|
|
||||||
-f docker-compose.clients.yml up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
### Nur Services ohne Clients
|
|
||||||
```bash
|
|
||||||
# Infrastruktur + Microservices
|
|
||||||
docker-compose -f docker-compose.yml \
|
|
||||||
-f docker-compose.services.yml up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
### Spezifische Services
|
|
||||||
```bash
|
|
||||||
# Nur bestimmte Services
|
|
||||||
docker-compose up -d postgres redis keycloak
|
|
||||||
```
|
|
||||||
|
|
||||||
## Umgebungsvariablen
|
|
||||||
|
|
||||||
Die Docker-Konfiguration nutzt das zentrale `.env`-System aus dem `config/` Verzeichnis:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Für Entwicklung
|
|
||||||
ln -sf config/.env.dev .env
|
|
||||||
|
|
||||||
# Für Produktion
|
|
||||||
ln -sf config/.env.prod .env
|
|
||||||
|
|
||||||
# Für Tests
|
|
||||||
ln -sf config/.env.test .env
|
|
||||||
```
|
|
||||||
|
|
||||||
### Wichtige Variablen
|
|
||||||
|
|
||||||
| Variable | Standard | Beschreibung |
|
|
||||||
|----------|----------|--------------|
|
|
||||||
| `POSTGRES_USER` | meldestelle | PostgreSQL Benutzer |
|
|
||||||
| `POSTGRES_PASSWORD` | meldestelle | PostgreSQL Passwort |
|
|
||||||
| `POSTGRES_DB` | meldestelle | PostgreSQL Datenbankname |
|
|
||||||
| `REDIS_PASSWORD` | (leer) | Redis Passwort |
|
|
||||||
| `GATEWAY_PORT` | 8081 | API Gateway Port |
|
|
||||||
| `CONSUL_PORT` | 8500 | Consul Port |
|
|
||||||
| `KAFKA_PORT` | 9092 | Kafka Port |
|
|
||||||
| `PROMETHEUS_PORT` | 9090 | Prometheus Port |
|
|
||||||
| `GRAFANA_PORT` | 3000 | Grafana Port |
|
|
||||||
|
|
||||||
## Health Checks
|
|
||||||
|
|
||||||
Alle Services verfügen über Health Checks:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Status aller Services prüfen
|
|
||||||
docker-compose ps
|
|
||||||
|
|
||||||
# Service-spezifische Logs
|
|
||||||
docker-compose logs -f [service-name]
|
|
||||||
|
|
||||||
# Health Check einzelner Services
|
|
||||||
docker-compose exec postgres pg_isready -U meldestelle
|
|
||||||
docker-compose exec redis redis-cli ping
|
|
||||||
curl http://localhost:8500/v1/status/leader # Consul
|
|
||||||
curl http://localhost:8081/actuator/health # API Gateway
|
|
||||||
```
|
|
||||||
|
|
||||||
## Entwicklung
|
|
||||||
|
|
||||||
### Hot Reload für Web-App
|
|
||||||
```bash
|
|
||||||
# Web-App im Development-Modus
|
|
||||||
docker-compose -f docker-compose.yml \
|
|
||||||
-f docker-compose.clients.yml up -d web-app
|
|
||||||
```
|
|
||||||
|
|
||||||
### Debug-Modus für Services
|
|
||||||
```bash
|
|
||||||
# Service mit Debug-Port (5005)
|
|
||||||
docker-compose -f docker-compose.yml \
|
|
||||||
-f docker-compose.services.yml up -d
|
|
||||||
# Debug-Port ist automatisch verfügbar
|
|
||||||
```
|
|
||||||
|
|
||||||
### Logs verfolgen
|
|
||||||
```bash
|
|
||||||
# Alle Logs
|
|
||||||
docker-compose logs -f
|
|
||||||
|
|
||||||
# Spezifischer Service
|
|
||||||
docker-compose logs -f api-gateway
|
|
||||||
|
|
||||||
# Letzten 100 Zeilen
|
|
||||||
docker-compose logs --tail=100 -f
|
|
||||||
```
|
|
||||||
|
|
||||||
## Datenmanagement
|
|
||||||
|
|
||||||
### Volumes
|
|
||||||
- `postgres-data` - PostgreSQL Daten
|
|
||||||
- `redis-data` - Redis Persistierung
|
|
||||||
- `prometheus-data` - Prometheus Metriken
|
|
||||||
- `grafana-data` - Grafana Dashboards
|
|
||||||
- `monitoring-data` - Custom Monitoring Daten
|
|
||||||
|
|
||||||
### Backup
|
|
||||||
```bash
|
|
||||||
# PostgreSQL Backup
|
|
||||||
docker-compose exec -T postgres pg_dump -U meldestelle meldestelle > backup.sql
|
|
||||||
|
|
||||||
# Redis Backup
|
|
||||||
docker-compose exec redis redis-cli SAVE
|
|
||||||
docker cp $(docker-compose ps -q redis):/data/dump.rdb ./redis-backup.rdb
|
|
||||||
```
|
|
||||||
|
|
||||||
### Reset
|
|
||||||
```bash
|
|
||||||
# Alle Container und Volumes löschen
|
|
||||||
docker-compose down -v
|
|
||||||
docker-compose -f docker-compose.yml \
|
|
||||||
-f docker-compose.services.yml \
|
|
||||||
-f docker-compose.clients.yml down -v
|
|
||||||
|
|
||||||
# Images neu bauen
|
|
||||||
docker-compose build --no-cache
|
|
||||||
```
|
|
||||||
|
|
||||||
## Monitoring
|
|
||||||
|
|
||||||
### Prometheus Metriken
|
|
||||||
- URL: http://localhost:9090
|
|
||||||
- Sammelt Metriken von allen Services
|
|
||||||
- Konfiguration: `docker/monitoring/prometheus/prometheus.yml`
|
|
||||||
|
|
||||||
### Grafana Dashboards
|
|
||||||
- URL: http://localhost:3000
|
|
||||||
- Benutzer: admin / admin (Standard)
|
|
||||||
- Vorkonfigurierte Dashboards für alle Services
|
|
||||||
|
|
||||||
### Service Discovery
|
|
||||||
- Consul UI: http://localhost:8500
|
|
||||||
- Zeigt alle registrierten Services
|
|
||||||
- Health Status und Service-Informationen
|
|
||||||
|
|
||||||
## Troubleshooting
|
|
||||||
|
|
||||||
### Häufige Probleme
|
|
||||||
|
|
||||||
1. **Port-Konflikte**
|
|
||||||
```bash
|
|
||||||
# Ports prüfen
|
|
||||||
netstat -tulpn | grep :8081
|
|
||||||
|
|
||||||
# Alternative Ports in .env setzen
|
|
||||||
GATEWAY_PORT=8082
|
|
||||||
```
|
|
||||||
|
|
||||||
2. **Service startet nicht**
|
|
||||||
```bash
|
|
||||||
# Dependencies prüfen
|
|
||||||
docker-compose ps
|
|
||||||
|
|
||||||
# Logs analysieren
|
|
||||||
docker-compose logs [service-name]
|
|
||||||
|
|
||||||
# Service neu starten
|
|
||||||
docker-compose restart [service-name]
|
|
||||||
```
|
|
||||||
|
|
||||||
3. **Speicher-Probleme**
|
|
||||||
```bash
|
|
||||||
# Speicher freigeben
|
|
||||||
docker system prune -a
|
|
||||||
|
|
||||||
# Volumes prüfen
|
|
||||||
docker volume ls
|
|
||||||
```
|
|
||||||
|
|
||||||
4. **Netzwerk-Probleme**
|
|
||||||
```bash
|
|
||||||
# Netzwerk neu erstellen
|
|
||||||
docker-compose down
|
|
||||||
docker network prune
|
|
||||||
docker-compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
### Konfiguration validieren
|
|
||||||
```bash
|
|
||||||
# Docker-Compose Syntax prüfen
|
|
||||||
docker-compose config
|
|
||||||
|
|
||||||
# Mit allen Files
|
|
||||||
docker-compose -f docker-compose.yml \
|
|
||||||
-f docker-compose.services.yml \
|
|
||||||
-f docker-compose.clients.yml config
|
|
||||||
```
|
|
||||||
|
|
||||||
## Produktion
|
|
||||||
|
|
||||||
### Sicherheitsaspekte
|
|
||||||
1. **Secrets**: Verwenden Sie starke Passwörter in `.env.prod`
|
|
||||||
2. **Netzwerk**: Externe Zugriffe über Load Balancer
|
|
||||||
3. **Volumes**: Backup-Strategie implementieren
|
|
||||||
4. **Updates**: Regelmäßige Image-Updates
|
|
||||||
|
|
||||||
### Performance-Optimierungen
|
|
||||||
1. **Resource Limits**: In Produktion definieren
|
|
||||||
2. **Monitoring**: Vollständige Observability
|
|
||||||
3. **Load Balancing**: Mehrere Instanzen für kritische Services
|
|
||||||
4. **Caching**: Redis optimal konfigurieren
|
|
||||||
|
|
||||||
## Build-Automatisierung
|
|
||||||
|
|
||||||
### Makefile-Integration
|
|
||||||
```bash
|
|
||||||
# Verfügbare Targets
|
|
||||||
make help
|
|
||||||
|
|
||||||
# System starten
|
|
||||||
make start
|
|
||||||
|
|
||||||
# System stoppen
|
|
||||||
make stop
|
|
||||||
|
|
||||||
# Logs anzeigen
|
|
||||||
make logs
|
|
||||||
|
|
||||||
# Services bauen
|
|
||||||
make build
|
|
||||||
```
|
|
||||||
|
|
||||||
### CI/CD Integration
|
|
||||||
```yaml
|
|
||||||
# GitHub Actions Beispiel
|
|
||||||
- name: Start Services
|
|
||||||
run: |
|
|
||||||
docker-compose -f docker-compose.yml \
|
|
||||||
-f docker-compose.services.yml up -d
|
|
||||||
|
|
||||||
- name: Run Tests
|
|
||||||
run: |
|
|
||||||
docker-compose exec -T api-gateway ./gradlew test
|
|
||||||
```
|
|
||||||
|
|
||||||
## Support
|
|
||||||
|
|
||||||
Bei Problemen:
|
|
||||||
|
|
||||||
1. Überprüfen Sie die Logs: `docker-compose logs -f`
|
|
||||||
2. Validieren Sie die Konfiguration: `docker-compose config`
|
|
||||||
3. Prüfen Sie die Umgebungsvariablen: `docker-compose config | grep environment`
|
|
||||||
4. Konsultieren Sie die Service-spezifischen READMEs im jeweiligen Verzeichnis
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
*Letzte Aktualisierung: 2025-01-06*
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
# ===================================================================
|
|
||||||
# Prometheus Configuration - Ping Service Testing
|
|
||||||
# ===================================================================
|
|
||||||
|
|
||||||
global:
|
|
||||||
scrape_interval: 15s
|
|
||||||
evaluation_interval: 15s
|
|
||||||
|
|
||||||
# Scrape configuration for ping-service testing
|
|
||||||
scrape_configs:
|
|
||||||
- job_name: 'prometheus'
|
|
||||||
static_configs:
|
|
||||||
- targets: ['localhost:9090']
|
|
||||||
|
|
||||||
- job_name: 'ping-service'
|
|
||||||
metrics_path: '/actuator/prometheus'
|
|
||||||
static_configs:
|
|
||||||
- targets: ['ping-service:8082']
|
|
||||||
scrape_interval: 10s
|
|
||||||
scrape_timeout: 5s
|
|
||||||
|
|
||||||
- job_name: 'consul'
|
|
||||||
static_configs:
|
|
||||||
- targets: ['consul-test:8500']
|
|
||||||
scrape_interval: 30s
|
|
||||||
|
|
||||||
- job_name: 'postgres'
|
|
||||||
static_configs:
|
|
||||||
- targets: ['postgres-test:5432']
|
|
||||||
scrape_interval: 30s
|
|
||||||
scrape_timeout: 10s
|
|
||||||
|
|
||||||
- job_name: 'redis'
|
|
||||||
static_configs:
|
|
||||||
- targets: ['redis-test:6379']
|
|
||||||
scrape_interval: 30s
|
|
||||||
scrape_timeout: 10s
|
|
||||||
@@ -1,220 +0,0 @@
|
|||||||
# ===================================================================
|
|
||||||
# Docker Compose - Ping Service Testing
|
|
||||||
# Trace-Bullet Testing Setup für Ping Service Backend
|
|
||||||
# ===================================================================
|
|
||||||
# Usage:
|
|
||||||
# Start testing environment: docker-compose -f docker-compose-ping-test.yml up -d
|
|
||||||
# Stop and cleanup: docker-compose -f docker-compose-ping-test.yml down -v
|
|
||||||
# ===================================================================
|
|
||||||
|
|
||||||
services:
|
|
||||||
# ===================================================================
|
|
||||||
# Datenbank (PostgreSQL) - Minimale Konfiguration für Tests
|
|
||||||
# ===================================================================
|
|
||||||
postgres-test:
|
|
||||||
image: postgres:16-alpine
|
|
||||||
container_name: ping-test-postgres
|
|
||||||
environment:
|
|
||||||
POSTGRES_USER: ${POSTGRES_USER:-testuser}
|
|
||||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-testpass}
|
|
||||||
POSTGRES_DB: ${POSTGRES_DB:-pingtest}
|
|
||||||
ports:
|
|
||||||
- "5433:5432" # Anderer Port um Konflikte zu vermeiden
|
|
||||||
volumes:
|
|
||||||
- postgres-test-data:/var/lib/postgresql/data
|
|
||||||
networks:
|
|
||||||
- ping-test-network
|
|
||||||
healthcheck:
|
|
||||||
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-testuser} -d ${POSTGRES_DB:-pingtest}"]
|
|
||||||
interval: 5s
|
|
||||||
timeout: 3s
|
|
||||||
retries: 3
|
|
||||||
start_period: 10s
|
|
||||||
restart: unless-stopped
|
|
||||||
|
|
||||||
# ===================================================================
|
|
||||||
# Redis Cache - Für Event Store und Caching
|
|
||||||
# ===================================================================
|
|
||||||
redis-test:
|
|
||||||
image: redis:7-alpine
|
|
||||||
container_name: ping-test-redis
|
|
||||||
ports:
|
|
||||||
- "6380:6379" # Anderer Port um Konflikte zu vermeiden
|
|
||||||
volumes:
|
|
||||||
- redis-test-data:/data
|
|
||||||
command: redis-server --appendonly yes
|
|
||||||
networks:
|
|
||||||
- ping-test-network
|
|
||||||
healthcheck:
|
|
||||||
test: ["CMD", "redis-cli", "ping"]
|
|
||||||
interval: 5s
|
|
||||||
timeout: 3s
|
|
||||||
retries: 3
|
|
||||||
start_period: 10s
|
|
||||||
restart: unless-stopped
|
|
||||||
|
|
||||||
# ===================================================================
|
|
||||||
# Service Discovery (Consul) - Für Service Registration
|
|
||||||
# ===================================================================
|
|
||||||
consul-test:
|
|
||||||
image: hashicorp/consul:1.15
|
|
||||||
container_name: ping-test-consul
|
|
||||||
ports:
|
|
||||||
- "8501:8500" # Anderer Port um Konflikte zu vermeiden
|
|
||||||
command: agent -server -ui -node=test-server -bootstrap-expect=1 -client=0.0.0.0
|
|
||||||
networks:
|
|
||||||
- ping-test-network
|
|
||||||
healthcheck:
|
|
||||||
test: ["CMD", "curl", "-f", "http://localhost:8500/v1/status/leader"]
|
|
||||||
interval: 5s
|
|
||||||
timeout: 3s
|
|
||||||
retries: 3
|
|
||||||
start_period: 10s
|
|
||||||
restart: unless-stopped
|
|
||||||
|
|
||||||
# ===================================================================
|
|
||||||
# Monitoring (Prometheus) - Für Metriken
|
|
||||||
# ===================================================================
|
|
||||||
prometheus-test:
|
|
||||||
image: prom/prometheus:v2.47.0
|
|
||||||
container_name: ping-test-prometheus
|
|
||||||
ports:
|
|
||||||
- "9091:9090" # Anderer Port um Konflikte zu vermeiden
|
|
||||||
volumes:
|
|
||||||
- prometheus-test-data:/prometheus
|
|
||||||
- ./config/prometheus-test.yml:/etc/prometheus/prometheus.yml:ro
|
|
||||||
command:
|
|
||||||
- '--config.file=/etc/prometheus/prometheus.yml'
|
|
||||||
- '--storage.tsdb.path=/prometheus'
|
|
||||||
- '--web.console.libraries=/etc/prometheus/console_libraries'
|
|
||||||
- '--web.console.templates=/etc/prometheus/consoles'
|
|
||||||
- '--storage.tsdb.retention.time=24h'
|
|
||||||
- '--web.enable-lifecycle'
|
|
||||||
networks:
|
|
||||||
- ping-test-network
|
|
||||||
healthcheck:
|
|
||||||
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:9090/-/healthy"]
|
|
||||||
interval: 10s
|
|
||||||
timeout: 3s
|
|
||||||
retries: 3
|
|
||||||
start_period: 15s
|
|
||||||
restart: unless-stopped
|
|
||||||
|
|
||||||
# ===================================================================
|
|
||||||
# Ping Service - Der zu testende Service
|
|
||||||
# ===================================================================
|
|
||||||
ping-service:
|
|
||||||
build:
|
|
||||||
context: .
|
|
||||||
dockerfile: dockerfiles/services/ping-service/Dockerfile
|
|
||||||
args:
|
|
||||||
SPRING_PROFILES_ACTIVE: test
|
|
||||||
container_name: ping-test-service
|
|
||||||
environment:
|
|
||||||
# Spring Konfiguration
|
|
||||||
SPRING_PROFILES_ACTIVE: test
|
|
||||||
SERVER_PORT: 8082
|
|
||||||
|
|
||||||
# Consul Konfiguration
|
|
||||||
CONSUL_HOST: consul-test
|
|
||||||
CONSUL_PORT: 8500
|
|
||||||
CONSUL_ENABLED: true
|
|
||||||
|
|
||||||
# Datenbank Konfiguration
|
|
||||||
DB_HOST: postgres-test
|
|
||||||
DB_PORT: 5432
|
|
||||||
DB_NAME: ${POSTGRES_DB:-pingtest}
|
|
||||||
DB_USER: ${POSTGRES_USER:-testuser}
|
|
||||||
DB_PASSWORD: ${POSTGRES_PASSWORD:-testpass}
|
|
||||||
|
|
||||||
# Redis Konfiguration
|
|
||||||
REDIS_EVENT_STORE_HOST: redis-test
|
|
||||||
REDIS_EVENT_STORE_PORT: 6379
|
|
||||||
REDIS_EVENT_STORE_PASSWORD: ""
|
|
||||||
|
|
||||||
# JVM Optimierungen für Testing
|
|
||||||
JAVA_OPTS: "-Xmx512m -XX:+UseG1GC -Dspring.profiles.active=test"
|
|
||||||
|
|
||||||
# Debug Modus aktivieren
|
|
||||||
DEBUG: ${DEBUG:-false}
|
|
||||||
ports:
|
|
||||||
- "8082:8082"
|
|
||||||
- "5005:5005" # Debug Port
|
|
||||||
depends_on:
|
|
||||||
consul-test:
|
|
||||||
condition: service_healthy
|
|
||||||
postgres-test:
|
|
||||||
condition: service_healthy
|
|
||||||
redis-test:
|
|
||||||
condition: service_healthy
|
|
||||||
networks:
|
|
||||||
- ping-test-network
|
|
||||||
healthcheck:
|
|
||||||
test: ["CMD", "curl", "--fail", "http://localhost:8082/actuator/health"]
|
|
||||||
interval: 10s
|
|
||||||
timeout: 5s
|
|
||||||
retries: 5
|
|
||||||
start_period: 30s
|
|
||||||
restart: unless-stopped
|
|
||||||
|
|
||||||
# ===================================================================
|
|
||||||
# Test Utilities - Hilfscontainer für Tests
|
|
||||||
# ===================================================================
|
|
||||||
test-runner:
|
|
||||||
image: curlimages/curl:latest
|
|
||||||
container_name: ping-test-runner
|
|
||||||
depends_on:
|
|
||||||
ping-service:
|
|
||||||
condition: service_healthy
|
|
||||||
networks:
|
|
||||||
- ping-test-network
|
|
||||||
command: |
|
|
||||||
sh -c '
|
|
||||||
echo "=== Ping Service Test Suite ==="
|
|
||||||
echo "Warte auf Service-Start..."
|
|
||||||
sleep 10
|
|
||||||
|
|
||||||
echo "=== Health Check Test ==="
|
|
||||||
curl -v http://ping-service:8082/actuator/health
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
echo "=== Info Endpoint Test ==="
|
|
||||||
curl -v http://ping-service:8082/actuator/info
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
echo "=== Circuit Breaker Status Test ==="
|
|
||||||
curl -v http://ping-service:8082/actuator/circuitbreakers
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
echo "=== Prometheus Metrics Test ==="
|
|
||||||
curl -v http://ping-service:8082/actuator/prometheus
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
echo "=== Service Discovery Test (Consul) ==="
|
|
||||||
curl -v http://consul-test:8500/v1/agent/services
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
echo "=== Alle Tests abgeschlossen ==="
|
|
||||||
'
|
|
||||||
profiles: ["test"]
|
|
||||||
|
|
||||||
# ===================================================================
|
|
||||||
# Volumes für persistente Daten
|
|
||||||
# ===================================================================
|
|
||||||
volumes:
|
|
||||||
postgres-test-data:
|
|
||||||
driver: local
|
|
||||||
redis-test-data:
|
|
||||||
driver: local
|
|
||||||
prometheus-test-data:
|
|
||||||
driver: local
|
|
||||||
|
|
||||||
# ===================================================================
|
|
||||||
# Isoliertes Test-Netzwerk
|
|
||||||
# ===================================================================
|
|
||||||
networks:
|
|
||||||
ping-test-network:
|
|
||||||
driver: bridge
|
|
||||||
ipam:
|
|
||||||
config:
|
|
||||||
- subnet: 172.20.0.0/16
|
|
||||||
@@ -16,6 +16,15 @@ services:
|
|||||||
context: .
|
context: .
|
||||||
dockerfile: dockerfiles/clients/web-app/Dockerfile
|
dockerfile: dockerfiles/clients/web-app/Dockerfile
|
||||||
args:
|
args:
|
||||||
|
# Global build arguments (from docker/build-args/global.env)
|
||||||
|
GRADLE_VERSION: ${DOCKER_GRADLE_VERSION:-9.0.0}
|
||||||
|
JAVA_VERSION: ${DOCKER_JAVA_VERSION:-21}
|
||||||
|
BUILD_DATE: ${BUILD_DATE}
|
||||||
|
VERSION: ${DOCKER_APP_VERSION:-1.0.0}
|
||||||
|
# Client-specific arguments (from docker/build-args/clients.env)
|
||||||
|
NODE_VERSION: ${DOCKER_NODE_VERSION:-20.11.0}
|
||||||
|
NGINX_VERSION: ${DOCKER_NGINX_VERSION:-1.25-alpine}
|
||||||
|
# Application-specific arguments
|
||||||
CLIENT_PATH: client
|
CLIENT_PATH: client
|
||||||
CLIENT_MODULE: client
|
CLIENT_MODULE: client
|
||||||
CLIENT_NAME: meldestelle-web-app
|
CLIENT_NAME: meldestelle-web-app
|
||||||
@@ -53,6 +62,14 @@ services:
|
|||||||
context: .
|
context: .
|
||||||
dockerfile: dockerfiles/clients/desktop-app/Dockerfile
|
dockerfile: dockerfiles/clients/desktop-app/Dockerfile
|
||||||
args:
|
args:
|
||||||
|
# Global build arguments (from docker/build-args/global.env)
|
||||||
|
GRADLE_VERSION: ${DOCKER_GRADLE_VERSION:-9.0.0}
|
||||||
|
JAVA_VERSION: ${DOCKER_JAVA_VERSION:-21}
|
||||||
|
BUILD_DATE: ${BUILD_DATE}
|
||||||
|
VERSION: ${DOCKER_APP_VERSION:-1.0.0}
|
||||||
|
# Client-specific arguments (from docker/build-args/clients.env)
|
||||||
|
NODE_VERSION: ${DOCKER_NODE_VERSION:-20.11.0}
|
||||||
|
# Application-specific arguments
|
||||||
CLIENT_PATH: client
|
CLIENT_PATH: client
|
||||||
CLIENT_MODULE: client
|
CLIENT_MODULE: client
|
||||||
CLIENT_NAME: meldestelle-desktop-app
|
CLIENT_NAME: meldestelle-desktop-app
|
||||||
|
|||||||
@@ -14,6 +14,14 @@ services:
|
|||||||
build:
|
build:
|
||||||
context: .
|
context: .
|
||||||
dockerfile: dockerfiles/services/ping-service/Dockerfile
|
dockerfile: dockerfiles/services/ping-service/Dockerfile
|
||||||
|
args:
|
||||||
|
# Global build arguments (from docker/build-args/global.env)
|
||||||
|
GRADLE_VERSION: ${DOCKER_GRADLE_VERSION:-9.0.0}
|
||||||
|
JAVA_VERSION: ${DOCKER_JAVA_VERSION:-21}
|
||||||
|
BUILD_DATE: ${BUILD_DATE}
|
||||||
|
VERSION: ${DOCKER_APP_VERSION:-1.0.0}
|
||||||
|
# Service-specific arguments (from docker/build-args/services.env)
|
||||||
|
SPRING_PROFILES_ACTIVE: ${DOCKER_SPRING_PROFILES_DOCKER:-docker}
|
||||||
container_name: meldestelle-ping-service
|
container_name: meldestelle-ping-service
|
||||||
environment:
|
environment:
|
||||||
SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE:-dev}
|
SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE:-dev}
|
||||||
|
|||||||
+9
-1
@@ -208,7 +208,15 @@ services:
|
|||||||
api-gateway:
|
api-gateway:
|
||||||
build:
|
build:
|
||||||
context: .
|
context: .
|
||||||
dockerfile: infrastructure/gateway/Dockerfile
|
dockerfile: dockerfiles/infrastructure/gateway/Dockerfile
|
||||||
|
args:
|
||||||
|
# Global build arguments (from docker/build-args/global.env)
|
||||||
|
GRADLE_VERSION: ${DOCKER_GRADLE_VERSION:-9.0.0}
|
||||||
|
JAVA_VERSION: ${DOCKER_JAVA_VERSION:-21}
|
||||||
|
BUILD_DATE: ${BUILD_DATE}
|
||||||
|
VERSION: ${DOCKER_APP_VERSION:-1.0.0}
|
||||||
|
# Infrastructure-specific arguments (from docker/build-args/infrastructure.env)
|
||||||
|
SPRING_PROFILES_ACTIVE: ${DOCKER_SPRING_PROFILES_DEFAULT:-default}
|
||||||
container_name: meldestelle-api-gateway
|
container_name: meldestelle-api-gateway
|
||||||
environment:
|
environment:
|
||||||
SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE:-dev}
|
SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE:-dev}
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
# ===================================================================
|
||||||
|
# Clients Docker Build Arguments - dockerfiles/clients/*
|
||||||
|
# Source: docker/versions.toml [categories.clients]
|
||||||
|
# Last updated: 2025-09-13 12:51:22 UTC
|
||||||
|
# ===================================================================
|
||||||
|
|
||||||
|
# --- Include Global Arguments ---
|
||||||
|
# Source global.env for GRADLE_VERSION, JAVA_VERSION, BUILD_DATE, VERSION
|
||||||
|
|
||||||
|
# --- Client-Specific Build Tools ---
|
||||||
|
NODE_VERSION=20.12.0
|
||||||
|
NGINX_VERSION=1.25-alpine
|
||||||
|
|
||||||
|
# --- Client Build Configuration ---
|
||||||
|
CLIENT_PATH=client
|
||||||
|
CLIENT_MODULE=client
|
||||||
|
CLIENT_NAME=meldestelle-client
|
||||||
|
|
||||||
|
# --- Web Application Specific ---
|
||||||
|
WEB_APP_PORT=4000
|
||||||
|
WEB_APP_BUILD_TARGET=wasmJsBrowserDistribution
|
||||||
|
|
||||||
|
# --- Desktop Application Specific ---
|
||||||
|
DESKTOP_APP_VNC_PORT=5901
|
||||||
|
DESKTOP_APP_NOVNC_PORT=6080
|
||||||
|
DESKTOP_APP_BUILD_TARGET=composeDesktop
|
||||||
|
|
||||||
|
# --- Client Environment ---
|
||||||
|
NODE_ENV=production
|
||||||
|
APP_TITLE=Meldestelle
|
||||||
|
APP_VERSION=1.0.0
|
||||||
|
DOCKER_APP_VERSION
|
||||||
|
|
||||||
|
# --- Development Configuration ---
|
||||||
|
WEBPACK_DEV_SERVER_HOST=0.0.0.0
|
||||||
|
WEBPACK_DEV_SERVER_PORT=4000
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
# ===================================================================
|
||||||
|
# Global Docker Build Arguments - Used by all categories
|
||||||
|
# Source: docker/versions.toml
|
||||||
|
# Last updated: 2025-09-13 12:51:22 UTC
|
||||||
|
# ===================================================================
|
||||||
|
|
||||||
|
# --- Build Tools ---
|
||||||
|
GRADLE_VERSION=9.0.0
|
||||||
|
JAVA_VERSION=21
|
||||||
|
|
||||||
|
# --- Build Metadata ---
|
||||||
|
BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')
|
||||||
|
VERSION=1.0.0
|
||||||
|
DOCKER_APP_VERSION
|
||||||
|
|
||||||
|
# --- Common Base Images ---
|
||||||
|
ALPINE_VERSION=3.19
|
||||||
|
ECLIPSE_TEMURIN_JDK_VERSION=21-jdk-alpine
|
||||||
|
ECLIPSE_TEMURIN_JRE_VERSION=21-jre-alpine
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
# ===================================================================
|
||||||
|
# Infrastructure Docker Build Arguments - dockerfiles/infrastructure/*
|
||||||
|
# Source: docker/versions.toml [categories.infrastructure]
|
||||||
|
# Last updated: 2025-09-13 12:51:22 UTC
|
||||||
|
# ===================================================================
|
||||||
|
|
||||||
|
# --- Include Global Arguments ---
|
||||||
|
# Source global.env for GRADLE_VERSION, JAVA_VERSION, BUILD_DATE, VERSION
|
||||||
|
|
||||||
|
# --- Infrastructure Services Configuration ---
|
||||||
|
SPRING_PROFILES_ACTIVE=default
|
||||||
|
DOCKER_SPRING_PROFILES_DEFAULT
|
||||||
|
|
||||||
|
# --- Infrastructure Service Ports (matches gradle.properties) ---
|
||||||
|
GATEWAY_PORT=8081
|
||||||
|
AUTH_SERVER_PORT=8087
|
||||||
|
MONITORING_SERVER_PORT=8088
|
||||||
|
|
||||||
|
# --- API Gateway Specific ---
|
||||||
|
GATEWAY_SERVICE_PATH=infrastructure/gateway
|
||||||
|
GATEWAY_SERVICE_NAME=api-gateway
|
||||||
|
|
||||||
|
# --- Auth Server Specific ---
|
||||||
|
AUTH_SERVER_PATH=infrastructure/auth/auth-server
|
||||||
|
AUTH_SERVER_SERVICE_NAME=auth-server
|
||||||
|
|
||||||
|
# --- Monitoring Server Specific ---
|
||||||
|
MONITORING_SERVER_PATH=infrastructure/monitoring/monitoring-server
|
||||||
|
MONITORING_SERVER_SERVICE_NAME=monitoring-server
|
||||||
|
|
||||||
|
# --- Infrastructure Dependencies ---
|
||||||
|
CONSUL_ENABLED=true
|
||||||
|
CONSUL_HOST=consul
|
||||||
|
CONSUL_PORT=8500
|
||||||
|
|
||||||
|
# --- Database Configuration for Infrastructure Services ---
|
||||||
|
DB_HOST=postgres
|
||||||
|
DB_PORT=5432
|
||||||
|
DB_NAME=meldestelle
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
# ===================================================================
|
||||||
|
# Services Docker Build Arguments - dockerfiles/services/*
|
||||||
|
# Source: docker/versions.toml [categories.services]
|
||||||
|
# Last updated: 2025-09-13 12:51:22 UTC
|
||||||
|
# ===================================================================
|
||||||
|
|
||||||
|
# --- Include Global Arguments ---
|
||||||
|
# Source global.env for GRADLE_VERSION, JAVA_VERSION, BUILD_DATE, VERSION
|
||||||
|
|
||||||
|
# --- Spring Boot Services Configuration ---
|
||||||
|
SPRING_PROFILES_ACTIVE=docker
|
||||||
|
DOCKER_SPRING_PROFILES_DOCKER
|
||||||
|
|
||||||
|
# --- Service-Specific Arguments ---
|
||||||
|
SERVICE_PATH=.
|
||||||
|
SERVICE_NAME=spring-boot-service
|
||||||
|
SERVICE_PORT=8080
|
||||||
|
|
||||||
|
# --- Service Port Mapping (matches gradle.properties) ---
|
||||||
|
PING_SERVICE_PORT=8082
|
||||||
|
MEMBERS_SERVICE_PORT=8083
|
||||||
|
HORSES_SERVICE_PORT=8084
|
||||||
|
EVENTS_SERVICE_PORT=8085
|
||||||
|
MASTERDATA_SERVICE_PORT=8086
|
||||||
|
|
||||||
|
# --- Services List (for automation scripts) ---
|
||||||
|
# ping-service, members-service, horses-service, events-service, masterdata-service
|
||||||
@@ -0,0 +1,94 @@
|
|||||||
|
# ===================================================================
|
||||||
|
# Docker Versions Catalog - Single Source of Truth
|
||||||
|
# Analogous to gradle/libs.versions.toml for centralized version management
|
||||||
|
# ===================================================================
|
||||||
|
# Last updated: 2025-09-13
|
||||||
|
# Eliminates version redundancy across 12+ Dockerfiles
|
||||||
|
|
||||||
|
[versions]
|
||||||
|
# --- Build Tools ---
|
||||||
|
gradle = "9.0.0"
|
||||||
|
java = "21"
|
||||||
|
node = "20.12.0"
|
||||||
|
|
||||||
|
# --- Base Images ---
|
||||||
|
nginx = "1.25-alpine"
|
||||||
|
alpine = "3.19"
|
||||||
|
eclipse-temurin-jdk = "21-jdk-alpine"
|
||||||
|
eclipse-temurin-jre = "21-jre-alpine"
|
||||||
|
|
||||||
|
# --- Spring Configuration ---
|
||||||
|
spring-profiles-default = "default"
|
||||||
|
spring-profiles-docker = "docker"
|
||||||
|
spring-profiles-prod = "prod"
|
||||||
|
|
||||||
|
# --- Application Versions ---
|
||||||
|
app-version = "1.0.0"
|
||||||
|
|
||||||
|
[build-args]
|
||||||
|
# --- Global Build Arguments (used across all categories) ---
|
||||||
|
global = [
|
||||||
|
"GRADLE_VERSION",
|
||||||
|
"JAVA_VERSION",
|
||||||
|
"BUILD_DATE",
|
||||||
|
"VERSION"
|
||||||
|
]
|
||||||
|
|
||||||
|
# --- Spring Boot Services (dockerfiles/services/* and infrastructure/*) ---
|
||||||
|
spring-services = [
|
||||||
|
"SPRING_PROFILES_ACTIVE",
|
||||||
|
"SERVICE_PATH",
|
||||||
|
"SERVICE_NAME",
|
||||||
|
"SERVICE_PORT"
|
||||||
|
]
|
||||||
|
|
||||||
|
# --- Kotlin/JS Web Clients (dockerfiles/clients/*) ---
|
||||||
|
web-clients = [
|
||||||
|
"NODE_VERSION",
|
||||||
|
"NGINX_VERSION",
|
||||||
|
"CLIENT_PATH",
|
||||||
|
"CLIENT_MODULE",
|
||||||
|
"CLIENT_NAME"
|
||||||
|
]
|
||||||
|
|
||||||
|
[categories]
|
||||||
|
# --- Services Configuration ---
|
||||||
|
[categories.services]
|
||||||
|
default-spring-profile = "docker"
|
||||||
|
default-port-start = 8082
|
||||||
|
services = [
|
||||||
|
"ping-service",
|
||||||
|
"members-service",
|
||||||
|
"horses-service",
|
||||||
|
"events-service",
|
||||||
|
"masterdata-service"
|
||||||
|
]
|
||||||
|
|
||||||
|
# --- Infrastructure Configuration ---
|
||||||
|
[categories.infrastructure]
|
||||||
|
default-spring-profile = "default"
|
||||||
|
services = [
|
||||||
|
"gateway",
|
||||||
|
"auth-server",
|
||||||
|
"monitoring-server"
|
||||||
|
]
|
||||||
|
|
||||||
|
# --- Client Applications Configuration ---
|
||||||
|
[categories.clients]
|
||||||
|
default-node-version = "20.11.0"
|
||||||
|
default-nginx-version = "1.25-alpine"
|
||||||
|
clients = [
|
||||||
|
"web-app",
|
||||||
|
"desktop-app"
|
||||||
|
]
|
||||||
|
|
||||||
|
[environment-mapping]
|
||||||
|
# --- Environment Variable Names for Docker Compose ---
|
||||||
|
# Maps internal version names to environment variable names
|
||||||
|
gradle-version = "DOCKER_GRADLE_VERSION"
|
||||||
|
java-version = "DOCKER_JAVA_VERSION"
|
||||||
|
node-version = "DOCKER_NODE_VERSION"
|
||||||
|
nginx-version = "DOCKER_NGINX_VERSION"
|
||||||
|
spring-profiles-default = "DOCKER_SPRING_PROFILES_DEFAULT"
|
||||||
|
spring-profiles-docker = "DOCKER_SPRING_PROFILES_DOCKER"
|
||||||
|
app-version = "DOCKER_APP_VERSION"
|
||||||
@@ -2,10 +2,19 @@
|
|||||||
# Builds Kotlin/JVM (Compose Desktop) client and serves via VNC with noVNC web interface
|
# Builds Kotlin/JVM (Compose Desktop) client and serves via VNC with noVNC web interface
|
||||||
|
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
# Arguments (can be overridden during build)
|
# CENTRALIZED BUILD ARGUMENTS
|
||||||
|
# Values sourced from docker/versions.toml and docker/build-args/
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
ARG JVM_VERSION=21
|
# Global arguments (docker/build-args/global.env)
|
||||||
ARG GRADLE_VERSION=9.0
|
ARG GRADLE_VERSION
|
||||||
|
ARG JAVA_VERSION
|
||||||
|
ARG BUILD_DATE
|
||||||
|
ARG VERSION
|
||||||
|
|
||||||
|
# Client-specific arguments (docker/build-args/clients.env)
|
||||||
|
ARG NODE_VERSION
|
||||||
|
|
||||||
|
# Desktop-specific arguments
|
||||||
ARG UBUNTU_VERSION=22.04
|
ARG UBUNTU_VERSION=22.04
|
||||||
|
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
@@ -17,7 +26,7 @@ ARG CLIENT_MODULE=client
|
|||||||
# ===================================================================
|
# ===================================================================
|
||||||
# Build Stage - Kotlin/JVM (Compose Desktop) Compilation
|
# Build Stage - Kotlin/JVM (Compose Desktop) Compilation
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
FROM gradle:${GRADLE_VERSION}-jdk${JVM_VERSION} AS builder
|
FROM gradle:${GRADLE_VERSION}-jdk${JAVA_VERSION} AS builder
|
||||||
|
|
||||||
ARG CLIENT_PATH=client
|
ARG CLIENT_PATH=client
|
||||||
ARG CLIENT_MODULE=client
|
ARG CLIENT_MODULE=client
|
||||||
|
|||||||
@@ -1,12 +1,22 @@
|
|||||||
# Multi-stage build for Meldestelle Compose for Web Application
|
# syntax=docker/dockerfile:1.8
|
||||||
# Builds Kotlin/JS (Compose for Web) client and serves via Nginx
|
|
||||||
|
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
# Arguments (can be overridden during build)
|
# Multi-stage Dockerfile for Meldestelle Compose for Web Application
|
||||||
|
# Features: BuildKit cache mounts, security hardening, optimal layer caching
|
||||||
|
# Version: 2.0.0 - Enhanced optimization and security
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
ARG JVM_VERSION=21
|
|
||||||
ARG GRADLE_VERSION=9.0
|
# === CENTRALIZED BUILD ARGUMENTS ===
|
||||||
ARG NGINX_VERSION=1.25-alpine
|
# Values sourced from docker/versions.toml and docker/build-args/
|
||||||
|
# Global arguments (docker/build-args/global.env)
|
||||||
|
ARG GRADLE_VERSION
|
||||||
|
ARG JAVA_VERSION
|
||||||
|
ARG BUILD_DATE
|
||||||
|
ARG VERSION
|
||||||
|
|
||||||
|
# Client-specific arguments (docker/build-args/clients.env)
|
||||||
|
ARG NGINX_VERSION
|
||||||
|
ARG NODE_VERSION
|
||||||
|
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
# Build Arguments for Client Configuration
|
# Build Arguments for Client Configuration
|
||||||
@@ -17,17 +27,35 @@ ARG CLIENT_MODULE=client
|
|||||||
# ===================================================================
|
# ===================================================================
|
||||||
# Build Stage - Kotlin/JS (Compose for Web) Compilation
|
# Build Stage - Kotlin/JS (Compose for Web) Compilation
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
FROM gradle:${GRADLE_VERSION}-jdk${JVM_VERSION} AS builder
|
FROM gradle:${GRADLE_VERSION}-jdk${JAVA_VERSION}-alpine AS builder
|
||||||
|
|
||||||
ARG CLIENT_PATH=client
|
ARG CLIENT_PATH=client
|
||||||
ARG CLIENT_MODULE=client
|
ARG CLIENT_MODULE=client
|
||||||
|
ARG BUILD_DATE
|
||||||
|
ARG VERSION=1.0.0
|
||||||
|
|
||||||
|
# Enhanced metadata
|
||||||
|
LABEL stage=builder \
|
||||||
|
service="web-app" \
|
||||||
|
maintainer="Meldestelle Development Team" \
|
||||||
|
version="${VERSION}" \
|
||||||
|
build.date="${BUILD_DATE}"
|
||||||
|
|
||||||
# Set working directory
|
# Set working directory
|
||||||
WORKDIR /build
|
WORKDIR /build
|
||||||
|
|
||||||
# Set build labels
|
# Gradle optimizations for containerized builds
|
||||||
LABEL service=web-app
|
ENV GRADLE_OPTS="-Dorg.gradle.caching=true \
|
||||||
LABEL stage=build
|
-Dorg.gradle.daemon=false \
|
||||||
|
-Dorg.gradle.parallel=true \
|
||||||
|
-Dorg.gradle.configureondemand=true \
|
||||||
|
-Dorg.gradle.workers.max=2 \
|
||||||
|
-Dorg.gradle.jvmargs=-Xmx2g \
|
||||||
|
-XX:+UseParallelGC \
|
||||||
|
-XX:MaxMetaspaceSize=512m"
|
||||||
|
|
||||||
|
# Set Gradle user home for better caching
|
||||||
|
ENV GRADLE_USER_HOME=/home/gradle/.gradle
|
||||||
|
|
||||||
# Copy Gradle files first for better layer caching
|
# Copy Gradle files first for better layer caching
|
||||||
COPY gradle/ gradle/
|
COPY gradle/ gradle/
|
||||||
@@ -55,9 +83,16 @@ COPY docs/ docs/
|
|||||||
# Make Gradle wrapper executable
|
# Make Gradle wrapper executable
|
||||||
RUN chmod +x gradlew
|
RUN chmod +x gradlew
|
||||||
|
|
||||||
# Build client application
|
# Download and cache dependencies with BuildKit cache mount
|
||||||
|
RUN --mount=type=cache,target=/home/gradle/.gradle/caches \
|
||||||
|
--mount=type=cache,target=/home/gradle/.gradle/wrapper \
|
||||||
|
./gradlew ${CLIENT_MODULE}:dependencies --no-daemon --info
|
||||||
|
|
||||||
|
# Build client application with BuildKit cache mount
|
||||||
# For Compose Multiplatform Web (WASM), wasmJsBrowserDistribution produces static assets
|
# For Compose Multiplatform Web (WASM), wasmJsBrowserDistribution produces static assets
|
||||||
RUN echo "Building ${CLIENT_MODULE} module..." && \
|
RUN --mount=type=cache,target=/home/gradle/.gradle/caches \
|
||||||
|
--mount=type=cache,target=/home/gradle/.gradle/wrapper \
|
||||||
|
echo "Building ${CLIENT_MODULE} module..." && \
|
||||||
./gradlew ${CLIENT_MODULE}:wasmJsBrowserDistribution --no-daemon --stacktrace --info
|
./gradlew ${CLIENT_MODULE}:wasmJsBrowserDistribution --no-daemon --stacktrace --info
|
||||||
|
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
@@ -66,14 +101,28 @@ RUN echo "Building ${CLIENT_MODULE} module..." && \
|
|||||||
FROM nginx:${NGINX_VERSION} AS production
|
FROM nginx:${NGINX_VERSION} AS production
|
||||||
|
|
||||||
ARG CLIENT_PATH=client
|
ARG CLIENT_PATH=client
|
||||||
|
ARG BUILD_DATE
|
||||||
|
ARG VERSION=1.0.0
|
||||||
|
|
||||||
# Set production labels
|
# Enhanced metadata
|
||||||
LABEL service="web-app" \
|
LABEL service="web-app" \
|
||||||
|
version="${VERSION}" \
|
||||||
environment="production" \
|
environment="production" \
|
||||||
description="Meldestelle Compose for Web Application"
|
description="Meldestelle Compose for Web Application served via Nginx" \
|
||||||
|
maintainer="Meldestelle Development Team" \
|
||||||
|
build.date="${BUILD_DATE}" \
|
||||||
|
org.opencontainers.image.title="Meldestelle Web App" \
|
||||||
|
org.opencontainers.image.description="Kotlin Multiplatform Web application with WASM" \
|
||||||
|
org.opencontainers.image.version="${VERSION}" \
|
||||||
|
org.opencontainers.image.created="${BUILD_DATE}"
|
||||||
|
|
||||||
# Install curl for health checks and create nginx user
|
# Enhanced Alpine setup with security hardening
|
||||||
RUN apk add --no-cache curl && \
|
RUN apk update && \
|
||||||
|
apk upgrade && \
|
||||||
|
apk add --no-cache \
|
||||||
|
curl \
|
||||||
|
tzdata && \
|
||||||
|
rm -rf /var/cache/apk/* && \
|
||||||
addgroup -g 1001 -S nginx-group && \
|
addgroup -g 1001 -S nginx-group && \
|
||||||
adduser -S -D -H -u 1001 -h /var/cache/nginx -s /sbin/nologin -G nginx-group -g nginx nginx-user
|
adduser -S -D -H -u 1001 -h /var/cache/nginx -s /sbin/nologin -G nginx-group -g nginx nginx-user
|
||||||
|
|
||||||
|
|||||||
@@ -1,32 +1,52 @@
|
|||||||
# syntax=docker/dockerfile:1.7
|
# syntax=docker/dockerfile:1.8
|
||||||
|
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
# Dockerfile for Meldestelle Auth Server
|
# Dockerfile for Meldestelle Auth Server
|
||||||
# Based on spring-boot-service template with auth-server specifics
|
# Features: Security hardening, monitoring support, optimal caching, BuildKit cache mounts
|
||||||
|
# Version: 2.0.0 - Enhanced optimization and security
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
|
|
||||||
# Build arguments
|
# === CENTRALIZED BUILD ARGUMENTS ===
|
||||||
ARG GRADLE_VERSION=8.14
|
# Values sourced from docker/versions.toml and docker/build-args/
|
||||||
ARG JAVA_VERSION=21
|
# Global arguments (docker/build-args/global.env)
|
||||||
ARG SPRING_PROFILES_ACTIVE=docker
|
ARG GRADLE_VERSION
|
||||||
|
ARG JAVA_VERSION
|
||||||
|
ARG BUILD_DATE
|
||||||
|
ARG VERSION
|
||||||
|
|
||||||
|
# Infrastructure-specific arguments (docker/build-args/infrastructure.env)
|
||||||
|
ARG SPRING_PROFILES_ACTIVE
|
||||||
|
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
# Build Stage
|
# Build Stage
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
FROM gradle:${GRADLE_VERSION}-jdk${JAVA_VERSION}-alpine AS builder
|
FROM gradle:${GRADLE_VERSION}-jdk${JAVA_VERSION}-alpine AS builder
|
||||||
|
|
||||||
LABEL stage=builder
|
# Re-declare build arguments for this stage
|
||||||
LABEL service=auth-server
|
ARG SPRING_PROFILES_ACTIVE=docker
|
||||||
LABEL maintainer="Meldestelle Development Team"
|
ARG BUILD_DATE
|
||||||
|
ARG VERSION=1.0.0
|
||||||
|
|
||||||
|
LABEL stage=builder \
|
||||||
|
service="auth-server" \
|
||||||
|
maintainer="Meldestelle Development Team" \
|
||||||
|
version="${VERSION}" \
|
||||||
|
build.date="${BUILD_DATE}"
|
||||||
|
|
||||||
WORKDIR /workspace
|
WORKDIR /workspace
|
||||||
|
|
||||||
# Gradle optimizations
|
# Gradle optimizations for containerized builds
|
||||||
ENV GRADLE_OPTS="-Dorg.gradle.caching=true \
|
ENV GRADLE_OPTS="-Dorg.gradle.caching=true \
|
||||||
-Dorg.gradle.daemon=false \
|
-Dorg.gradle.daemon=false \
|
||||||
-Dorg.gradle.parallel=true \
|
-Dorg.gradle.parallel=true \
|
||||||
-Dorg.gradle.configureondemand=true \
|
-Dorg.gradle.configureondemand=true \
|
||||||
-Xmx2g"
|
-Dorg.gradle.workers.max=2 \
|
||||||
|
-Dorg.gradle.jvmargs=-Xmx2g \
|
||||||
|
-XX:+UseParallelGC \
|
||||||
|
-XX:MaxMetaspaceSize=512m"
|
||||||
|
|
||||||
|
# Set Gradle user home for better caching
|
||||||
|
ENV GRADLE_USER_HOME=/home/gradle/.gradle
|
||||||
|
|
||||||
# Copy build files in optimal order for caching
|
# Copy build files in optimal order for caching
|
||||||
COPY gradlew gradlew.bat gradle.properties settings.gradle.kts ./
|
COPY gradlew gradlew.bat gradle.properties settings.gradle.kts ./
|
||||||
@@ -42,9 +62,15 @@ COPY infrastructure/auth/auth-client/ infrastructure/auth/auth-client/
|
|||||||
COPY infrastructure/auth/auth-server/build.gradle.kts infrastructure/auth/auth-server/
|
COPY infrastructure/auth/auth-server/build.gradle.kts infrastructure/auth/auth-server/
|
||||||
COPY infrastructure/auth/auth-server/src/ infrastructure/auth/auth-server/src/
|
COPY infrastructure/auth/auth-server/src/ infrastructure/auth/auth-server/src/
|
||||||
|
|
||||||
# Build application
|
# Download and cache dependencies with BuildKit cache mount
|
||||||
RUN ./gradlew :infrastructure:auth:auth-server:dependencies --no-daemon --info
|
RUN --mount=type=cache,target=/home/gradle/.gradle/caches \
|
||||||
RUN ./gradlew :infrastructure:auth:auth-server:bootJar --no-daemon --info \
|
--mount=type=cache,target=/home/gradle/.gradle/wrapper \
|
||||||
|
./gradlew :infrastructure:auth:auth-server:dependencies --no-daemon --info
|
||||||
|
|
||||||
|
# Build application with BuildKit cache mount
|
||||||
|
RUN --mount=type=cache,target=/home/gradle/.gradle/caches \
|
||||||
|
--mount=type=cache,target=/home/gradle/.gradle/wrapper \
|
||||||
|
./gradlew :infrastructure:auth:auth-server:bootJar --no-daemon --info \
|
||||||
-Pspring.profiles.active=${SPRING_PROFILES_ACTIVE}
|
-Pspring.profiles.active=${SPRING_PROFILES_ACTIVE}
|
||||||
|
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
@@ -52,13 +78,29 @@ RUN ./gradlew :infrastructure:auth:auth-server:bootJar --no-daemon --info \
|
|||||||
# ===================================================================
|
# ===================================================================
|
||||||
FROM eclipse-temurin:${JAVA_VERSION}-jre-alpine AS runtime
|
FROM eclipse-temurin:${JAVA_VERSION}-jre-alpine AS runtime
|
||||||
|
|
||||||
# Comprehensive metadata
|
# Build arguments for runtime stage
|
||||||
|
ARG BUILD_DATE
|
||||||
|
ARG VERSION=1.0.0
|
||||||
|
ARG JAVA_VERSION=21
|
||||||
|
ARG SPRING_PROFILES_ACTIVE=docker
|
||||||
|
|
||||||
|
# Convert build arguments to environment variables
|
||||||
|
ENV JAVA_VERSION=${JAVA_VERSION} \
|
||||||
|
VERSION=${VERSION} \
|
||||||
|
BUILD_DATE=${BUILD_DATE}
|
||||||
|
|
||||||
|
# Enhanced metadata
|
||||||
LABEL service="auth-server" \
|
LABEL service="auth-server" \
|
||||||
version="1.0.0" \
|
version="${VERSION}" \
|
||||||
description="Authentication and Authorization Server for Meldestelle" \
|
description="Authentication and Authorization Server for Meldestelle" \
|
||||||
maintainer="Meldestelle Development Team" \
|
maintainer="Meldestelle Development Team" \
|
||||||
java.version="${JAVA_VERSION}" \
|
java.version="${JAVA_VERSION}" \
|
||||||
spring.profiles.active="${SPRING_PROFILES_ACTIVE}"
|
spring.profiles.active="${SPRING_PROFILES_ACTIVE}" \
|
||||||
|
build.date="${BUILD_DATE}" \
|
||||||
|
org.opencontainers.image.title="Meldestelle Auth Server" \
|
||||||
|
org.opencontainers.image.description="Spring Boot authentication service with Keycloak integration" \
|
||||||
|
org.opencontainers.image.version="${VERSION}" \
|
||||||
|
org.opencontainers.image.created="${BUILD_DATE}"
|
||||||
|
|
||||||
# Build arguments for user configuration
|
# Build arguments for user configuration
|
||||||
ARG APP_USER=authuser
|
ARG APP_USER=authuser
|
||||||
@@ -68,10 +110,15 @@ ARG APP_GID=1002
|
|||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
# System setup with security updates
|
# Enhanced Alpine setup with security hardening
|
||||||
RUN apk update && \
|
RUN apk update && \
|
||||||
apk upgrade && \
|
apk upgrade && \
|
||||||
apk add --no-cache curl jq tzdata ca-certificates && \
|
apk add --no-cache \
|
||||||
|
curl \
|
||||||
|
jq \
|
||||||
|
tzdata \
|
||||||
|
ca-certificates \
|
||||||
|
tini && \
|
||||||
rm -rf /var/cache/apk/*
|
rm -rf /var/cache/apk/*
|
||||||
|
|
||||||
# Create non-root user for auth-server
|
# Create non-root user for auth-server
|
||||||
@@ -118,14 +165,18 @@ ENV SPRING_OUTPUT_ANSI_ENABLED=ALWAYS \
|
|||||||
LOGGING_LEVEL_ROOT=INFO \
|
LOGGING_LEVEL_ROOT=INFO \
|
||||||
LOGGING_LEVEL_AT_MOCODE=DEBUG
|
LOGGING_LEVEL_AT_MOCODE=DEBUG
|
||||||
|
|
||||||
# Security-focused startup command with debug support
|
# Enhanced entrypoint with tini init system and conditional debug support
|
||||||
ENTRYPOINT ["sh", "-c", "\
|
ENTRYPOINT ["tini", "--", "sh", "-c", "\
|
||||||
echo 'Starting Meldestelle Auth Server on port 8081...'; \
|
echo 'Starting Meldestelle Auth Server with Java ${JAVA_VERSION}...'; \
|
||||||
|
echo 'Active Spring profiles: ${SPRING_PROFILES_ACTIVE}'; \
|
||||||
|
echo 'Auth server port: 8081'; \
|
||||||
|
echo 'Container memory: '$(cat /sys/fs/cgroup/memory/memory.limit_in_bytes 2>/dev/null || echo 'unlimited'); \
|
||||||
if [ \"${DEBUG:-false}\" = \"true\" ]; then \
|
if [ \"${DEBUG:-false}\" = \"true\" ]; then \
|
||||||
echo 'Debug mode enabled on port 5005'; \
|
echo 'DEBUG mode enabled - remote debugging available on port 5005'; \
|
||||||
exec java $JAVA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 -jar app.jar; \
|
exec java ${JAVA_OPTS} -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 -jar app.jar; \
|
||||||
else \
|
else \
|
||||||
exec java $JAVA_OPTS -jar app.jar; \
|
echo 'Starting auth server in production mode'; \
|
||||||
|
exec java ${JAVA_OPTS} -jar app.jar; \
|
||||||
fi"]
|
fi"]
|
||||||
|
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
|
|||||||
@@ -1,163 +1,197 @@
|
|||||||
# =============================================================================
|
# syntax=docker/dockerfile:1.8
|
||||||
# Multi-stage Dockerfile for Meldestelle API Gateway
|
|
||||||
# Optimized for security, performance, and maintainability
|
|
||||||
# =============================================================================
|
|
||||||
|
|
||||||
# =============================================================================
|
# ===================================================================
|
||||||
# Build stage - Full Gradle build for better dependency management
|
# Multi-stage Dockerfile for Meldestelle API Gateway
|
||||||
# =============================================================================
|
# Features: Security hardening, monitoring support, optimal caching, BuildKit cache mounts
|
||||||
FROM gradle:8.14-jdk21-alpine AS builder
|
# Version: 2.0.0 - Canonical location with full optimization
|
||||||
|
# ===================================================================
|
||||||
|
|
||||||
|
# === CENTRALIZED BUILD ARGUMENTS ===
|
||||||
|
# Values sourced from docker/versions.toml and docker/build-args/
|
||||||
|
# Global arguments (docker/build-args/global.env)
|
||||||
|
ARG GRADLE_VERSION
|
||||||
|
ARG JAVA_VERSION
|
||||||
|
ARG BUILD_DATE
|
||||||
|
ARG VERSION
|
||||||
|
|
||||||
|
# Infrastructure-specific arguments (docker/build-args/infrastructure.env)
|
||||||
|
ARG SPRING_PROFILES_ACTIVE
|
||||||
|
|
||||||
|
# ===================================================================
|
||||||
|
# Build Stage
|
||||||
|
# ===================================================================
|
||||||
|
FROM gradle:${GRADLE_VERSION}-jdk${JAVA_VERSION}-alpine AS builder
|
||||||
|
|
||||||
|
# Re-declare build arguments for this stage
|
||||||
|
ARG SPRING_PROFILES_ACTIVE=default
|
||||||
|
ARG BUILD_DATE
|
||||||
|
ARG VERSION=1.0.0
|
||||||
|
|
||||||
LABEL stage=builder
|
LABEL stage=builder
|
||||||
LABEL service=api-gateway
|
LABEL service="api-gateway"
|
||||||
LABEL maintainer="Meldestelle Development Team"
|
LABEL maintainer="Meldestelle Development Team"
|
||||||
|
LABEL version="${VERSION}"
|
||||||
|
LABEL build.date="${BUILD_DATE}"
|
||||||
|
|
||||||
WORKDIR /workspace
|
WORKDIR /workspace
|
||||||
|
|
||||||
# Gradle optimizations
|
# Gradle optimizations for containerized builds
|
||||||
ENV GRADLE_OPTS="-Dorg.gradle.caching=true \
|
ENV GRADLE_OPTS="-Dorg.gradle.caching=true \
|
||||||
-Dorg.gradle.daemon=false \
|
-Dorg.gradle.daemon=false \
|
||||||
-Dorg.gradle.parallel=true \
|
-Dorg.gradle.parallel=true \
|
||||||
-Dorg.gradle.configureondemand=true \
|
-Dorg.gradle.configureondemand=true \
|
||||||
-Xmx2g"
|
-Dorg.gradle.workers.max=2 \
|
||||||
|
-Dorg.gradle.jvmargs=-Xmx2g \
|
||||||
|
-XX:+UseParallelGC \
|
||||||
|
-XX:MaxMetaspaceSize=512m"
|
||||||
|
|
||||||
# Copy build files in optimal order for caching
|
# Set Gradle user home for better caching
|
||||||
|
ENV GRADLE_USER_HOME=/home/gradle/.gradle
|
||||||
|
|
||||||
|
# Copy gradle wrapper and configuration files first for optimal caching
|
||||||
COPY gradlew gradlew.bat gradle.properties settings.gradle.kts ./
|
COPY gradlew gradlew.bat gradle.properties settings.gradle.kts ./
|
||||||
COPY gradle/ gradle/
|
COPY gradle/ gradle/
|
||||||
|
|
||||||
|
# Copy platform dependencies (changes less frequently)
|
||||||
COPY platform/ platform/
|
COPY platform/ platform/
|
||||||
COPY core/ core/
|
COPY core/ core/
|
||||||
|
|
||||||
|
# Copy infrastructure directories (required by settings.gradle.kts)
|
||||||
|
COPY infrastructure/ infrastructure/
|
||||||
|
|
||||||
|
# Copy client directories (required by settings.gradle.kts)
|
||||||
|
COPY client/ client/
|
||||||
|
|
||||||
|
# Copy docs directory (required by settings.gradle.kts)
|
||||||
|
COPY docs/ docs/
|
||||||
|
|
||||||
|
# Copy temporary directory (required by settings.gradle.kts)
|
||||||
|
COPY temp/ temp/
|
||||||
|
|
||||||
|
# Copy root build configuration
|
||||||
COPY build.gradle.kts ./
|
COPY build.gradle.kts ./
|
||||||
|
|
||||||
# Copy gateway specific files
|
# Download and cache dependencies with BuildKit cache mount
|
||||||
COPY infrastructure/gateway/build.gradle.kts infrastructure/gateway/
|
RUN --mount=type=cache,target=/home/gradle/.gradle/caches \
|
||||||
COPY infrastructure/gateway/src/ infrastructure/gateway/src/
|
--mount=type=cache,target=/home/gradle/.gradle/wrapper \
|
||||||
|
./gradlew :infrastructure:gateway:dependencies --no-daemon --info
|
||||||
|
|
||||||
# Build application
|
# Build the application with optimizations and build cache
|
||||||
RUN ./gradlew :infrastructure:gateway:dependencies --no-daemon --info
|
RUN --mount=type=cache,target=/home/gradle/.gradle/caches \
|
||||||
RUN ./gradlew :infrastructure:gateway:bootJar --no-daemon --info
|
--mount=type=cache,target=/home/gradle/.gradle/wrapper \
|
||||||
|
./gradlew :infrastructure:gateway:bootJar --no-daemon --info \
|
||||||
|
-Pspring.profiles.active=${SPRING_PROFILES_ACTIVE}
|
||||||
|
|
||||||
# Extract JAR layers for optimized Docker layer caching
|
# Extract JAR layers for better caching in runtime stage
|
||||||
WORKDIR /builder
|
RUN mkdir -p build/dependency && \
|
||||||
RUN cp /workspace/infrastructure/gateway/build/libs/*.jar app.jar && \
|
(cd build/dependency; java -Djarmode=layertools -jar /workspace/infrastructure/gateway/build/libs/*.jar extract)
|
||||||
java -Djarmode=layertools -jar app.jar extract
|
|
||||||
|
|
||||||
# =============================================================================
|
# ===================================================================
|
||||||
# Runtime stage - Optimized production image
|
# Runtime Stage
|
||||||
# =============================================================================
|
# ===================================================================
|
||||||
FROM eclipse-temurin:21-jre-alpine AS runtime
|
FROM eclipse-temurin:${JAVA_VERSION}-jre-alpine AS runtime
|
||||||
|
|
||||||
# =============================================================================
|
# Build arguments for runtime stage
|
||||||
# Metadata and Build Information
|
ARG BUILD_DATE
|
||||||
# =============================================================================
|
ARG VERSION=1.0.0
|
||||||
LABEL maintainer="Meldestelle Team <support@meldestelle.at>"
|
ARG JAVA_VERSION=21
|
||||||
LABEL description="Self-Contained Systems API Gateway for Austrian Equestrian Federation"
|
ARG SPRING_PROFILES_ACTIVE=default
|
||||||
LABEL version="1.0.0"
|
|
||||||
LABEL org.opencontainers.image.title="Meldestelle Gateway"
|
|
||||||
LABEL org.opencontainers.image.description="Spring Cloud Gateway with Circuit Breaker, Health Monitoring, and Service Discovery"
|
|
||||||
LABEL org.opencontainers.image.vendor="Meldestelle"
|
|
||||||
LABEL org.opencontainers.image.version="1.0.0"
|
|
||||||
LABEL org.opencontainers.image.created="2025-08-14"
|
|
||||||
LABEL org.opencontainers.image.source="https://github.com/meldestelle/api-gateway"
|
|
||||||
LABEL org.opencontainers.image.documentation="https://api.meldestelle.at/docs"
|
|
||||||
|
|
||||||
# =============================================================================
|
# Convert build arguments to environment variables
|
||||||
# Security and System Setup
|
ENV JAVA_VERSION=${JAVA_VERSION} \
|
||||||
# =============================================================================
|
VERSION=${VERSION} \
|
||||||
# Install curl for health checks and security updates
|
BUILD_DATE=${BUILD_DATE}
|
||||||
RUN apk update && \
|
|
||||||
apk add --no-cache curl ca-certificates tzdata && \
|
|
||||||
apk upgrade && \
|
|
||||||
rm -rf /var/cache/apk/*
|
|
||||||
|
|
||||||
# Create dedicated non-root user with specific UID/GID for security
|
# Enhanced metadata
|
||||||
RUN addgroup -g 1001 -S gateway && \
|
LABEL service="api-gateway" \
|
||||||
adduser -u 1001 -S gateway -G gateway -s /bin/sh
|
version="${VERSION}" \
|
||||||
|
description="Spring Cloud Gateway for Meldestelle microservices architecture" \
|
||||||
|
maintainer="Meldestelle Development Team" \
|
||||||
|
java.version="${JAVA_VERSION}" \
|
||||||
|
spring.profiles.active="${SPRING_PROFILES_ACTIVE}" \
|
||||||
|
build.date="${BUILD_DATE}" \
|
||||||
|
org.opencontainers.image.title="Meldestelle API Gateway" \
|
||||||
|
org.opencontainers.image.description="Spring Cloud Gateway with service discovery and monitoring" \
|
||||||
|
org.opencontainers.image.version="${VERSION}" \
|
||||||
|
org.opencontainers.image.vendor="Österreichischer Pferdesportverband" \
|
||||||
|
org.opencontainers.image.created="${BUILD_DATE}"
|
||||||
|
|
||||||
# Set timezone for consistent logging and operations
|
# Build arguments for user configuration
|
||||||
ENV TZ=Europe/Vienna
|
ARG APP_USER=gateway
|
||||||
|
ARG APP_GROUP=gateway
|
||||||
|
ARG APP_UID=1001
|
||||||
|
ARG APP_GID=1001
|
||||||
|
|
||||||
# =============================================================================
|
|
||||||
# Application Setup
|
|
||||||
# =============================================================================
|
|
||||||
# Set working directory
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
# Create required directories with proper permissions
|
# Enhanced Alpine setup with security hardening
|
||||||
RUN mkdir -p /app/logs /app/tmp && \
|
RUN apk update && \
|
||||||
chown -R gateway:gateway /app
|
apk upgrade && \
|
||||||
|
apk add --no-cache \
|
||||||
|
curl \
|
||||||
|
tzdata \
|
||||||
|
tini && \
|
||||||
|
rm -rf /var/cache/apk/* && \
|
||||||
|
addgroup -g ${APP_GID} -S ${APP_GROUP} && \
|
||||||
|
adduser -u ${APP_UID} -S ${APP_USER} -G ${APP_GROUP} -h /app -s /bin/sh && \
|
||||||
|
mkdir -p /app/logs /app/tmp /app/config && \
|
||||||
|
chown -R ${APP_USER}:${APP_GROUP} /app && \
|
||||||
|
chmod -R 750 /app
|
||||||
|
|
||||||
# Copy Spring Boot layers in optimal order for Docker layer caching
|
# Copy Spring Boot layers from builder stage for optimal caching
|
||||||
# Dependencies change less frequently than application code
|
COPY --from=builder --chown=${APP_USER}:${APP_GROUP} /workspace/build/dependency/dependencies/ ./
|
||||||
COPY --from=builder --chown=gateway:gateway /builder/dependencies/ ./
|
COPY --from=builder --chown=${APP_USER}:${APP_GROUP} /workspace/build/dependency/spring-boot-loader/ ./
|
||||||
COPY --from=builder --chown=gateway:gateway /builder/spring-boot-loader/ ./
|
COPY --from=builder --chown=${APP_USER}:${APP_GROUP} /workspace/build/dependency/snapshot-dependencies/ ./
|
||||||
COPY --from=builder --chown=gateway:gateway /builder/snapshot-dependencies/ ./
|
COPY --from=builder --chown=${APP_USER}:${APP_GROUP} /workspace/build/dependency/application/ ./
|
||||||
COPY --from=builder --chown=gateway:gateway /builder/application/ ./
|
|
||||||
|
|
||||||
# =============================================================================
|
# Switch to non-root user
|
||||||
# Runtime Configuration
|
USER ${APP_USER}
|
||||||
# =============================================================================
|
|
||||||
# Switch to non-root user for security
|
|
||||||
USER gateway
|
|
||||||
|
|
||||||
# Expose application port and debug port
|
# Expose application port and debug port
|
||||||
EXPOSE 8080 5005
|
EXPOSE 8081 5005
|
||||||
|
|
||||||
# =============================================================================
|
# Enhanced health check with better configuration
|
||||||
# JVM and Application Configuration
|
HEALTHCHECK --interval=15s --timeout=3s --start-period=40s --retries=3 \
|
||||||
# =============================================================================
|
CMD curl -fsS --max-time 2 http://localhost:8081/actuator/health/readiness || exit 1
|
||||||
# Optimized JVM settings for containerized Spring Boot reactive applications
|
|
||||||
|
# Optimized JVM settings for Spring Cloud Gateway with Java 21
|
||||||
ENV JAVA_OPTS="-XX:MaxRAMPercentage=80.0 \
|
ENV JAVA_OPTS="-XX:MaxRAMPercentage=80.0 \
|
||||||
-XX:+UseG1GC \
|
-XX:+UseG1GC \
|
||||||
-XX:+UseStringDeduplication \
|
-XX:+UseStringDeduplication \
|
||||||
-XX:+UseContainerSupport \
|
-XX:+UseContainerSupport \
|
||||||
-XX:G1HeapRegionSize=16m \
|
-XX:G1HeapRegionSize=16m \
|
||||||
-XX:+OptimizeStringConcat \
|
-XX:G1ReservePercent=25 \
|
||||||
-XX:+UseCompressedOops \
|
-XX:InitiatingHeapOccupancyPercent=30 \
|
||||||
|
-XX:+UnlockExperimentalVMOptions \
|
||||||
|
-XX:+UseTransparentHugePages \
|
||||||
|
-XX:+AlwaysPreTouch \
|
||||||
|
-XX:+DisableExplicitGC \
|
||||||
-Djava.security.egd=file:/dev/./urandom \
|
-Djava.security.egd=file:/dev/./urandom \
|
||||||
-Djava.awt.headless=true \
|
-Djava.awt.headless=true \
|
||||||
-Dfile.encoding=UTF-8 \
|
-Dfile.encoding=UTF-8 \
|
||||||
-Duser.timezone=Europe/Vienna \
|
-Duser.timezone=Europe/Vienna \
|
||||||
-Dmanagement.endpoints.web.exposure.include=health,info,metrics,prometheus,gateway"
|
-Dspring.backgroundpreinitializer.ignore=true \
|
||||||
|
-Dmanagement.endpoints.web.exposure.include=health,info,metrics,prometheus,gateway \
|
||||||
|
-Dmanagement.endpoint.health.show-details=always \
|
||||||
|
-Dmanagement.metrics.export.prometheus.enabled=true"
|
||||||
|
|
||||||
# Spring Boot specific optimizations
|
# Spring Boot configuration
|
||||||
ENV SPRING_OUTPUT_ANSI_ENABLED=ALWAYS \
|
ENV SPRING_OUTPUT_ANSI_ENABLED=ALWAYS \
|
||||||
SPRING_PROFILES_ACTIVE=docker \
|
SPRING_PROFILES_ACTIVE=${SPRING_PROFILES_ACTIVE} \
|
||||||
SERVER_PORT=8080 \
|
SERVER_PORT=8081 \
|
||||||
MANAGEMENT_SERVER_PORT=8080 \
|
LOGGING_LEVEL_ROOT=INFO \
|
||||||
LOGGING_LEVEL_ROOT=INFO
|
LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_CLOUD_GATEWAY=DEBUG
|
||||||
|
|
||||||
# =============================================================================
|
# Enhanced entrypoint with tini init system and conditional debug support
|
||||||
# Health Check Configuration
|
ENTRYPOINT ["tini", "--", "sh", "-c", "\
|
||||||
# =============================================================================
|
echo 'Starting API Gateway with Java ${JAVA_VERSION}...'; \
|
||||||
# Enhanced health check with proper timing for Spring Boot startup
|
echo 'Active Spring profiles: ${SPRING_PROFILES_ACTIVE}'; \
|
||||||
HEALTHCHECK --interval=15s --timeout=5s --start-period=60s --retries=3 \
|
echo 'Gateway port: ${GATEWAY_PORT:-8081}'; \
|
||||||
CMD curl -fsS --max-time 3 http://localhost:8080/actuator/health/readiness || exit 1
|
echo 'Container memory: '$(cat /sys/fs/cgroup/memory/memory.limit_in_bytes 2>/dev/null || echo 'unlimited'); \
|
||||||
|
|
||||||
# =============================================================================
|
|
||||||
# Application Startup
|
|
||||||
# =============================================================================
|
|
||||||
# Gateway-focused startup command with debug support
|
|
||||||
ENTRYPOINT ["sh", "-c", "\
|
|
||||||
echo 'Starting Meldestelle API Gateway on port 8080...'; \
|
|
||||||
if [ \"${DEBUG:-false}\" = \"true\" ]; then \
|
if [ \"${DEBUG:-false}\" = \"true\" ]; then \
|
||||||
echo 'Debug mode enabled on port 5005'; \
|
echo 'DEBUG mode enabled - remote debugging available on port 5005'; \
|
||||||
exec java $JAVA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 org.springframework.boot.loader.launch.JarLauncher; \
|
exec java ${JAVA_OPTS} -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 org.springframework.boot.loader.launch.JarLauncher; \
|
||||||
else \
|
else \
|
||||||
exec java $JAVA_OPTS org.springframework.boot.loader.launch.JarLauncher; \
|
echo 'Starting API Gateway in production mode'; \
|
||||||
|
exec java ${JAVA_OPTS} org.springframework.boot.loader.launch.JarLauncher; \
|
||||||
fi"]
|
fi"]
|
||||||
|
|
||||||
# =============================================================================
|
|
||||||
# Documentation
|
|
||||||
# =============================================================================
|
|
||||||
# Build commands:
|
|
||||||
# docker build -t meldestelle/gateway:latest -f infrastructure/gateway/Dockerfile .
|
|
||||||
# docker run -p 8080:8080 --name gateway meldestelle/gateway:latest
|
|
||||||
#
|
|
||||||
# Key optimizations:
|
|
||||||
# - Multi-stage build with JAR layer extraction for better caching
|
|
||||||
# - Non-root user execution for security
|
|
||||||
# - Optimized JVM settings for containers
|
|
||||||
# - Comprehensive health checks
|
|
||||||
# - Proper timezone and encoding configuration
|
|
||||||
# - Security updates and minimal attack surface
|
|
||||||
# =============================================================================
|
|
||||||
|
|||||||
@@ -5,10 +5,16 @@
|
|||||||
# Based on spring-boot-service template with monitoring specifics
|
# Based on spring-boot-service template with monitoring specifics
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
|
|
||||||
# Build arguments
|
# === CENTRALIZED BUILD ARGUMENTS ===
|
||||||
ARG GRADLE_VERSION=8.14
|
# Values sourced from docker/versions.toml and docker/build-args/
|
||||||
ARG JAVA_VERSION=21
|
# Global arguments (docker/build-args/global.env)
|
||||||
ARG SPRING_PROFILES_ACTIVE=docker
|
ARG GRADLE_VERSION
|
||||||
|
ARG JAVA_VERSION
|
||||||
|
ARG BUILD_DATE
|
||||||
|
ARG VERSION
|
||||||
|
|
||||||
|
# Infrastructure-specific arguments (docker/build-args/infrastructure.env)
|
||||||
|
ARG SPRING_PROFILES_ACTIVE
|
||||||
|
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
# Build Stage
|
# Build Stage
|
||||||
|
|||||||
@@ -5,14 +5,19 @@
|
|||||||
# Based on Spring Boot Service Template with Events-specific configuration
|
# Based on Spring Boot Service Template with Events-specific configuration
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
|
|
||||||
# Build arguments
|
# === CENTRALIZED BUILD ARGUMENTS ===
|
||||||
ARG GRADLE_VERSION=8.14
|
# Values sourced from docker/versions.toml and docker/build-args/
|
||||||
ARG JAVA_VERSION=21
|
# Global arguments (docker/build-args/global.env)
|
||||||
ARG ALPINE_VERSION=3.19
|
ARG GRADLE_VERSION
|
||||||
ARG SPRING_PROFILES_ACTIVE=docker
|
ARG JAVA_VERSION
|
||||||
|
ARG BUILD_DATE
|
||||||
|
ARG VERSION
|
||||||
|
|
||||||
|
# Service-specific arguments (docker/build-args/services.env)
|
||||||
|
ARG SPRING_PROFILES_ACTIVE
|
||||||
ARG SERVICE_PATH=events/events-service
|
ARG SERVICE_PATH=events/events-service
|
||||||
ARG SERVICE_NAME=events-service
|
ARG SERVICE_NAME=events-service
|
||||||
ARG SERVICE_PORT=8086
|
ARG SERVICE_PORT=8085
|
||||||
|
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
# Build Stage
|
# Build Stage
|
||||||
|
|||||||
@@ -5,14 +5,19 @@
|
|||||||
# Based on Spring Boot Service Template with Horses-specific configuration
|
# Based on Spring Boot Service Template with Horses-specific configuration
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
|
|
||||||
# Build arguments
|
# === CENTRALIZED BUILD ARGUMENTS ===
|
||||||
ARG GRADLE_VERSION=8.14
|
# Values sourced from docker/versions.toml and docker/build-args/
|
||||||
ARG JAVA_VERSION=21
|
# Global arguments (docker/build-args/global.env)
|
||||||
ARG ALPINE_VERSION=3.19
|
ARG GRADLE_VERSION
|
||||||
ARG SPRING_PROFILES_ACTIVE=docker
|
ARG JAVA_VERSION
|
||||||
|
ARG BUILD_DATE
|
||||||
|
ARG VERSION
|
||||||
|
|
||||||
|
# Service-specific arguments (docker/build-args/services.env)
|
||||||
|
ARG SPRING_PROFILES_ACTIVE
|
||||||
ARG SERVICE_PATH=horses/horses-service
|
ARG SERVICE_PATH=horses/horses-service
|
||||||
ARG SERVICE_NAME=horses-service
|
ARG SERVICE_NAME=horses-service
|
||||||
ARG SERVICE_PORT=8085
|
ARG SERVICE_PORT=8084
|
||||||
|
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
# Build Stage
|
# Build Stage
|
||||||
|
|||||||
@@ -5,14 +5,19 @@
|
|||||||
# Based on Spring Boot Service Template with Masterdata-specific configuration
|
# Based on Spring Boot Service Template with Masterdata-specific configuration
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
|
|
||||||
# Build arguments
|
# === CENTRALIZED BUILD ARGUMENTS ===
|
||||||
ARG GRADLE_VERSION=8.14
|
# Values sourced from docker/versions.toml and docker/build-args/
|
||||||
ARG JAVA_VERSION=21
|
# Global arguments (docker/build-args/global.env)
|
||||||
ARG ALPINE_VERSION=3.19
|
ARG GRADLE_VERSION
|
||||||
ARG SPRING_PROFILES_ACTIVE=docker
|
ARG JAVA_VERSION
|
||||||
|
ARG BUILD_DATE
|
||||||
|
ARG VERSION
|
||||||
|
|
||||||
|
# Service-specific arguments (docker/build-args/services.env)
|
||||||
|
ARG SPRING_PROFILES_ACTIVE
|
||||||
ARG SERVICE_PATH=masterdata/masterdata-service
|
ARG SERVICE_PATH=masterdata/masterdata-service
|
||||||
ARG SERVICE_NAME=masterdata-service
|
ARG SERVICE_NAME=masterdata-service
|
||||||
ARG SERVICE_PORT=8087
|
ARG SERVICE_PORT=8086
|
||||||
|
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
# Build Stage
|
# Build Stage
|
||||||
|
|||||||
@@ -5,14 +5,19 @@
|
|||||||
# Based on Spring Boot Service Template with Members-specific configuration
|
# Based on Spring Boot Service Template with Members-specific configuration
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
|
|
||||||
# Build arguments
|
# === CENTRALIZED BUILD ARGUMENTS ===
|
||||||
ARG GRADLE_VERSION=8.14
|
# Values sourced from docker/versions.toml and docker/build-args/
|
||||||
ARG JAVA_VERSION=21
|
# Global arguments (docker/build-args/global.env)
|
||||||
ARG ALPINE_VERSION=3.19
|
ARG GRADLE_VERSION
|
||||||
ARG SPRING_PROFILES_ACTIVE=docker
|
ARG JAVA_VERSION
|
||||||
|
ARG BUILD_DATE
|
||||||
|
ARG VERSION
|
||||||
|
|
||||||
|
# Service-specific arguments (docker/build-args/services.env)
|
||||||
|
ARG SPRING_PROFILES_ACTIVE
|
||||||
ARG SERVICE_PATH=members/members-service
|
ARG SERVICE_PATH=members/members-service
|
||||||
ARG SERVICE_NAME=members-service
|
ARG SERVICE_NAME=members-service
|
||||||
ARG SERVICE_PORT=8084
|
ARG SERVICE_PORT=8083
|
||||||
|
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
# Build Stage
|
# Build Stage
|
||||||
|
|||||||
@@ -6,12 +6,16 @@
|
|||||||
# Version: 2.0.0 - Enhanced optimization and security
|
# Version: 2.0.0 - Enhanced optimization and security
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
|
|
||||||
# Build arguments for flexibility
|
# === CENTRALIZED BUILD ARGUMENTS ===
|
||||||
ARG GRADLE_VERSION=9.0.0
|
# Values sourced from docker/versions.toml and docker/build-args/
|
||||||
ARG JAVA_VERSION=21
|
# Global arguments (docker/build-args/global.env)
|
||||||
ARG SPRING_PROFILES_ACTIVE=default
|
ARG GRADLE_VERSION
|
||||||
|
ARG JAVA_VERSION
|
||||||
ARG BUILD_DATE
|
ARG BUILD_DATE
|
||||||
ARG VERSION=1.0.0
|
ARG VERSION
|
||||||
|
|
||||||
|
# Service-specific arguments (docker/build-args/services.env)
|
||||||
|
ARG SPRING_PROFILES_ACTIVE
|
||||||
|
|
||||||
# Build stage: compile the ping-service JAR inside Docker
|
# Build stage: compile the ping-service JAR inside Docker
|
||||||
FROM gradle:${GRADLE_VERSION}-jdk${JAVA_VERSION}-alpine AS builder
|
FROM gradle:${GRADLE_VERSION}-jdk${JAVA_VERSION}-alpine AS builder
|
||||||
|
|||||||
@@ -1,13 +1,22 @@
|
|||||||
# ===================================================================
|
# ===================================================================
|
||||||
# Multi-stage Dockerfile Template for Kotlin Multiplatform Web Client
|
# Multi-stage Dockerfile Template for Kotlin Multiplatform Web Client
|
||||||
# Features: Kotlin/JS compilation, Nginx serving, development support
|
# Features: Kotlin/JS compilation, Nginx serving, development support, centralized version management
|
||||||
|
# Version: 3.0.0 - Central Version Management Implementation
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
|
# IMPORTANT: Build arguments are now managed centrally via docker/versions.toml
|
||||||
|
# Use: docker-compose build or scripts/docker-build.sh for automated version injection
|
||||||
|
|
||||||
# Build arguments
|
# === CENTRALIZED BUILD ARGUMENTS ===
|
||||||
ARG GRADLE_VERSION=8.14
|
# Values sourced from docker/versions.toml and docker/build-args/
|
||||||
ARG JAVA_VERSION=21
|
# Global arguments (docker/build-args/global.env)
|
||||||
ARG NGINX_VERSION=alpine
|
ARG GRADLE_VERSION
|
||||||
ARG NODE_VERSION=20.11.0
|
ARG JAVA_VERSION
|
||||||
|
ARG BUILD_DATE
|
||||||
|
ARG VERSION
|
||||||
|
|
||||||
|
# Client-specific arguments (docker/build-args/clients.env)
|
||||||
|
ARG NODE_VERSION
|
||||||
|
ARG NGINX_VERSION
|
||||||
|
|
||||||
# Client-specific build arguments (can be overridden at build time)
|
# Client-specific build arguments (can be overridden at build time)
|
||||||
ARG CLIENT_PATH=client/web-app
|
ARG CLIENT_PATH=client/web-app
|
||||||
|
|||||||
@@ -2,14 +2,22 @@
|
|||||||
|
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
# Multi-stage Dockerfile Template for Spring Boot Services
|
# Multi-stage Dockerfile Template for Spring Boot Services
|
||||||
# Features: Security hardening, monitoring support, optimal caching
|
# Features: Security hardening, monitoring support, optimal caching, centralized version management
|
||||||
|
# Version: 3.0.0 - Central Version Management Implementation
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
|
# IMPORTANT: Build arguments are now managed centrally via docker/versions.toml
|
||||||
|
# Use: docker-compose build or scripts/docker-build.sh for automated version injection
|
||||||
|
|
||||||
# Build arguments
|
# === CENTRALIZED BUILD ARGUMENTS ===
|
||||||
ARG GRADLE_VERSION=8.14
|
# Values sourced from docker/versions.toml and docker/build-args/
|
||||||
ARG JAVA_VERSION=21
|
# Global arguments (docker/build-args/global.env)
|
||||||
ARG ALPINE_VERSION=3.19
|
ARG GRADLE_VERSION
|
||||||
ARG SPRING_PROFILES_ACTIVE=default
|
ARG JAVA_VERSION
|
||||||
|
ARG BUILD_DATE
|
||||||
|
ARG VERSION
|
||||||
|
|
||||||
|
# Service-specific arguments (docker/build-args/services.env or infrastructure.env)
|
||||||
|
ARG SPRING_PROFILES_ACTIVE
|
||||||
ARG SERVICE_PATH=.
|
ARG SERVICE_PATH=.
|
||||||
ARG SERVICE_NAME=spring-boot-service
|
ARG SERVICE_NAME=spring-boot-service
|
||||||
ARG SERVICE_PORT=8080
|
ARG SERVICE_PORT=8080
|
||||||
|
|||||||
@@ -1,96 +0,0 @@
|
|||||||
# Dockerfile für das Meldestelle API Gateway
|
|
||||||
# Multi-Stage Build für optimierte Containerisierung
|
|
||||||
|
|
||||||
FROM eclipse-temurin:21-jdk-alpine AS build
|
|
||||||
|
|
||||||
# Arbeitsverzeichnis setzen
|
|
||||||
WORKDIR /workspace
|
|
||||||
|
|
||||||
# Gradle Wrapper und Build-Dateien kopieren
|
|
||||||
COPY gradle gradle/
|
|
||||||
COPY gradlew gradlew.bat gradle.properties settings.gradle.kts ./
|
|
||||||
COPY build.gradle.kts ./
|
|
||||||
|
|
||||||
# Platform und Core Module kopieren (Dependencies)
|
|
||||||
COPY platform platform/
|
|
||||||
COPY core core/
|
|
||||||
|
|
||||||
# Infrastructure Module kopieren (für Dependencies)
|
|
||||||
COPY infrastructure infrastructure/
|
|
||||||
|
|
||||||
# Client Module kopieren (für Dependencies)
|
|
||||||
COPY client client/
|
|
||||||
|
|
||||||
# Documentation Module kopieren (für Dependencies)
|
|
||||||
COPY docs docs/
|
|
||||||
|
|
||||||
# Temporary Module kopieren (für Dependencies)
|
|
||||||
COPY temp temp/
|
|
||||||
|
|
||||||
# Gateway Module bauen
|
|
||||||
RUN ./gradlew :infrastructure:gateway:bootJar -x test --no-daemon
|
|
||||||
|
|
||||||
# JAR-Datei für Layer-Extraktion extrahieren
|
|
||||||
RUN mkdir -p build/dependency && \
|
|
||||||
(cd build/dependency; java -Djarmode=layertools -jar /workspace/infrastructure/gateway/build/libs/*.jar extract)
|
|
||||||
|
|
||||||
# Runtime Stage - optimiert für Produktion
|
|
||||||
FROM eclipse-temurin:21-jre-alpine
|
|
||||||
|
|
||||||
# Metadaten für Container
|
|
||||||
LABEL maintainer="Meldestelle Development Team" \
|
|
||||||
org.opencontainers.image.title="Meldestelle API Gateway" \
|
|
||||||
org.opencontainers.image.description="Spring Cloud Gateway für die Meldestelle Microservices" \
|
|
||||||
org.opencontainers.image.version="1.0.0" \
|
|
||||||
org.opencontainers.image.vendor="Österreichischer Pferdesportverband"
|
|
||||||
|
|
||||||
# Non-root User für Security
|
|
||||||
RUN addgroup -g 1001 gateway && \
|
|
||||||
adduser -D -u 1001 -G gateway gateway
|
|
||||||
|
|
||||||
# Arbeitsverzeichnis und Berechtigungen
|
|
||||||
WORKDIR /app
|
|
||||||
RUN chown gateway:gateway /app
|
|
||||||
|
|
||||||
# System-Updates für Security
|
|
||||||
RUN apk update && \
|
|
||||||
apk add --no-cache tzdata curl && \
|
|
||||||
rm -rf /var/cache/apk/*
|
|
||||||
|
|
||||||
# Zeitzone setzen
|
|
||||||
ENV TZ=Europe/Vienna
|
|
||||||
|
|
||||||
USER gateway
|
|
||||||
|
|
||||||
# Spring Boot Layer für besseres Caching
|
|
||||||
COPY --from=build --chown=gateway:gateway /workspace/build/dependency/dependencies/ ./
|
|
||||||
COPY --from=build --chown=gateway:gateway /workspace/build/dependency/spring-boot-loader/ ./
|
|
||||||
COPY --from=build --chown=gateway:gateway /workspace/build/dependency/snapshot-dependencies/ ./
|
|
||||||
COPY --from=build --chown=gateway:gateway /workspace/build/dependency/application/ ./
|
|
||||||
|
|
||||||
# Logs-Verzeichnis erstellen
|
|
||||||
RUN mkdir -p logs && chown gateway:gateway logs
|
|
||||||
|
|
||||||
# JVM-Parameter für Container-Umgebung (optimized for Java 21)
|
|
||||||
ENV JAVA_OPTS="-XX:MaxRAMPercentage=80.0 \
|
|
||||||
-XX:+UseG1GC \
|
|
||||||
-XX:+UseStringDeduplication \
|
|
||||||
-XX:+UseContainerSupport \
|
|
||||||
-Djava.security.egd=file:/dev/./urandom \
|
|
||||||
-Djava.awt.headless=true \
|
|
||||||
-Dfile.encoding=UTF-8 \
|
|
||||||
-Duser.timezone=Europe/Vienna"
|
|
||||||
|
|
||||||
# Spring Profile und Port (configurable)
|
|
||||||
ENV SPRING_PROFILES_ACTIVE=${SPRING_PROFILES_ACTIVE:-dev}
|
|
||||||
ENV SERVER_PORT=${GATEWAY_PORT:-8081}
|
|
||||||
|
|
||||||
# Health Check
|
|
||||||
HEALTHCHECK --interval=15s --timeout=5s --start-period=30s --retries=3 \
|
|
||||||
CMD curl -f http://localhost:${GATEWAY_PORT:-8081}/actuator/health || exit 1
|
|
||||||
|
|
||||||
# Gateway Port exposieren
|
|
||||||
EXPOSE ${GATEWAY_PORT:-8081}
|
|
||||||
|
|
||||||
# Anwendung starten
|
|
||||||
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS org.springframework.boot.loader.launch.JarLauncher"]
|
|
||||||
-309
@@ -1,309 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# ===================================================================
|
|
||||||
# Service Startup and Health Check Test Script
|
|
||||||
# Meldestelle Project - Docker Services Testing
|
|
||||||
# ===================================================================
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# Colors for output
|
|
||||||
RED='\033[0;31m'
|
|
||||||
GREEN='\033[0;32m'
|
|
||||||
YELLOW='\033[1;33m'
|
|
||||||
BLUE='\033[0;34m'
|
|
||||||
NC='\033[0m' # No Color
|
|
||||||
|
|
||||||
# Configuration
|
|
||||||
TIMEOUT_SECONDS=300
|
|
||||||
HEALTH_CHECK_INTERVAL=10
|
|
||||||
MAX_RETRIES=30
|
|
||||||
|
|
||||||
# NEU: Alle Compose-Dateien zentral definieren
|
|
||||||
COMPOSE_FILES="-f docker-compose.yml -f docker-compose.services.yml -f docker-compose.clients.yml"
|
|
||||||
|
|
||||||
|
|
||||||
# Logging functions
|
|
||||||
log_info() {
|
|
||||||
echo -e "${BLUE}[INFO]${NC} $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
log_success() {
|
|
||||||
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
log_warning() {
|
|
||||||
echo -e "${YELLOW}[WARNING]${NC} $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
log_error() {
|
|
||||||
echo -e "${RED}[ERROR]${NC} $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Function to wait for service health check
|
|
||||||
wait_for_health_check() {
|
|
||||||
local service_name=$1
|
|
||||||
local health_url=$2
|
|
||||||
local max_attempts=$3
|
|
||||||
local attempt=1
|
|
||||||
|
|
||||||
log_info "Waiting for $service_name health check at $health_url"
|
|
||||||
|
|
||||||
while [ $attempt -le $max_attempts ]; do
|
|
||||||
# ALT: if curl -f -s --max-time 5 "$health_url" > /dev/null 2>&1; then
|
|
||||||
# NEU: Die Option -L wurde hinzugefügt, um HTTP-Redirects zu folgen.
|
|
||||||
if curl -f -s -L --max-time 5 "$health_url" > /dev/null 2>&1; then
|
|
||||||
log_success "$service_name is healthy (attempt $attempt/$max_attempts)"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
log_info "$service_name health check failed (attempt $attempt/$max_attempts), retrying in $HEALTH_CHECK_INTERVAL seconds..."
|
|
||||||
sleep $HEALTH_CHECK_INTERVAL
|
|
||||||
((attempt++))
|
|
||||||
done
|
|
||||||
|
|
||||||
log_error "$service_name failed to become healthy after $max_attempts attempts"
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Function to check service logs for errors
|
|
||||||
check_service_logs() {
|
|
||||||
local service_name=$1
|
|
||||||
local container_name=$2
|
|
||||||
|
|
||||||
log_info "Checking $service_name logs for errors..."
|
|
||||||
|
|
||||||
# Get last 50 lines of logs
|
|
||||||
local logs=$(docker logs --tail 50 "$container_name" 2>&1 || echo "")
|
|
||||||
|
|
||||||
# Check for common error patterns
|
|
||||||
if echo "$logs" | grep -qi "error\|exception\|failed\|fatal"; then
|
|
||||||
log_warning "$service_name has error messages in logs:"
|
|
||||||
echo "$logs" | grep -i "error\|exception\|failed\|fatal" | tail -5
|
|
||||||
else
|
|
||||||
log_success "$service_name logs look clean"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Function to test infrastructure services
|
|
||||||
test_all_services() {
|
|
||||||
log_info "========================================="
|
|
||||||
log_info "Starting All Meldestelle Services"
|
|
||||||
log_info "========================================="
|
|
||||||
|
|
||||||
# Start ALL services using all compose files
|
|
||||||
log_info "Starting full environment with docker-compose..."
|
|
||||||
# ALT: docker compose up -d
|
|
||||||
docker compose $COMPOSE_FILES up -d
|
|
||||||
|
|
||||||
# Give services time to initialize
|
|
||||||
log_info "Waiting 45 seconds for services to initialize..."
|
|
||||||
sleep 45
|
|
||||||
|
|
||||||
# =========================================
|
|
||||||
# CHECK INFRASTRUCTURE
|
|
||||||
# =========================================
|
|
||||||
log_info "--- Checking Infrastructure Services ---"
|
|
||||||
local infra_services=(
|
|
||||||
"postgres:http://localhost:5432:PostgreSQL"
|
|
||||||
"redis:redis://localhost:6379:Redis"
|
|
||||||
"consul:http://localhost:8500/v1/status/leader:Consul"
|
|
||||||
"prometheus:http://localhost:9090/-/healthy:Prometheus"
|
|
||||||
"grafana:http://localhost:3000/api/health:Grafana"
|
|
||||||
"keycloak:http://localhost:8180/:Keycloak"
|
|
||||||
)
|
|
||||||
|
|
||||||
for service_info in "${infra_services[@]}"; do
|
|
||||||
# Parse service info: service_name:health_url:description
|
|
||||||
# Extract service name (everything before first colon)
|
|
||||||
service_name=$(echo "$service_info" | cut -d':' -f1)
|
|
||||||
|
|
||||||
# Extract health_url (everything after first colon, before last colon)
|
|
||||||
# For "postgres:http://localhost:5432:PostgreSQL" -> "http://localhost:5432"
|
|
||||||
temp_url=$(echo "$service_info" | cut -d':' -f2-)
|
|
||||||
health_url=$(echo "$temp_url" | sed 's/:[^:]*$//')
|
|
||||||
|
|
||||||
# Extract description (everything after last colon)
|
|
||||||
description=$(echo "$service_info" | sed 's/.*://')
|
|
||||||
|
|
||||||
# Special handling for PostgreSQL and Redis (no HTTP health checks)
|
|
||||||
if [ "$service_name" = "postgres" ]; then
|
|
||||||
log_info "Testing PostgreSQL connection..."
|
|
||||||
if docker exec meldestelle-postgres pg_isready -U meldestelle -d meldestelle > /dev/null 2>&1; then
|
|
||||||
log_success "PostgreSQL is ready"
|
|
||||||
else
|
|
||||||
log_error "PostgreSQL is not ready"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
elif [ "$service_name" = "redis" ]; then
|
|
||||||
log_info "Testing Redis connection..."
|
|
||||||
if docker exec meldestelle-redis redis-cli ping > /dev/null 2>&1; then
|
|
||||||
log_success "Redis is ready"
|
|
||||||
else
|
|
||||||
log_error "Redis is not ready"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
wait_for_health_check "$description" "$health_url" $MAX_RETRIES || return 1
|
|
||||||
fi
|
|
||||||
check_service_logs "$description" "meldestelle-$service_name"
|
|
||||||
done
|
|
||||||
log_success "All infrastructure services are healthy!"
|
|
||||||
|
|
||||||
# =========================================
|
|
||||||
# CHECK API GATEWAY
|
|
||||||
# =========================================
|
|
||||||
log_info "--- Checking API Gateway ---"
|
|
||||||
wait_for_health_check "API Gateway" "http://localhost:8081/actuator/health" $MAX_RETRIES || return 1
|
|
||||||
check_service_logs "API Gateway" "meldestelle-api-gateway"
|
|
||||||
log_success "API Gateway is healthy!"
|
|
||||||
|
|
||||||
# =========================================
|
|
||||||
# CHECK APPLICATION SERVICES
|
|
||||||
# =========================================
|
|
||||||
log_info "--- Checking Application Services ---"
|
|
||||||
local app_services=(
|
|
||||||
"ping-service:http://localhost:8082/actuator/health:Ping Service"
|
|
||||||
)
|
|
||||||
# Note: Add other services like members-service here when they are enabled
|
|
||||||
|
|
||||||
for service_info in "${app_services[@]}"; do
|
|
||||||
IFS=':' read -r service_name health_url description <<< "$service_info"
|
|
||||||
wait_for_health_check "$description" "$health_url" $MAX_RETRIES || return 1
|
|
||||||
check_service_logs "$description" "meldestelle-$service_name"
|
|
||||||
done
|
|
||||||
log_success "All application services are healthy!"
|
|
||||||
|
|
||||||
# =========================================
|
|
||||||
# CHECK CLIENT SERVICES
|
|
||||||
# =========================================
|
|
||||||
log_info "--- Checking Client Services ---"
|
|
||||||
local client_services=(
|
|
||||||
"web-app:http://localhost:4000/health:Web Application"
|
|
||||||
"auth-server:http://localhost:8087/actuator/health:Auth Server"
|
|
||||||
)
|
|
||||||
# Note: Add other client services here when enabled
|
|
||||||
|
|
||||||
for service_info in "${client_services[@]}"; do
|
|
||||||
# ... (parsing logic remains the same)
|
|
||||||
service_name=$(echo "$service_info" | cut -d':' -f1)
|
|
||||||
health_url=$(echo "$service_info" | cut -d':' -f2)
|
|
||||||
description=$(echo "$service_info" | cut -d':' -f3)
|
|
||||||
wait_for_health_check "$description" "$health_url" $MAX_RETRIES || return 1
|
|
||||||
# Use the container name from docker-compose.clients.yml (e.g., meldestelle-web-app)
|
|
||||||
check_service_logs "$description" "meldestelle-$service_name"
|
|
||||||
done
|
|
||||||
log_success "All client services are healthy!"
|
|
||||||
}
|
|
||||||
|
|
||||||
# ENTFERNT: test_api_gateway, test_application_services, test_client_services wurden in test_all_services integriert.
|
|
||||||
|
|
||||||
# Function to test network connectivity
|
|
||||||
test_network_connectivity() {
|
|
||||||
log_info "========================================="
|
|
||||||
log_info "Testing Network Connectivity"
|
|
||||||
log_info "========================================="
|
|
||||||
|
|
||||||
# Test internal network connectivity between services
|
|
||||||
log_info "Testing service-to-service connectivity..."
|
|
||||||
|
|
||||||
# Test API Gateway can reach backend services
|
|
||||||
if docker exec meldestelle-api-gateway curl -f -s --max-time 5 http://ping-service:8082/actuator/health > /dev/null 2>&1; then
|
|
||||||
log_success "API Gateway can reach Ping Service"
|
|
||||||
else
|
|
||||||
log_error "API Gateway cannot reach Ping Service"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Test application service can reach infrastructure
|
|
||||||
if docker exec meldestelle-ping-service curl -f -s --max-time 5 http://consul:8500/v1/status/leader > /dev/null 2>&1; then
|
|
||||||
log_success "Application services can reach Consul"
|
|
||||||
else
|
|
||||||
log_error "Application services cannot reach Consul"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
log_success "Network connectivity tests passed!"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Function to generate test report
|
|
||||||
generate_test_report() {
|
|
||||||
log_info "========================================="
|
|
||||||
log_info "Test Report Summary"
|
|
||||||
log_info "========================================="
|
|
||||||
|
|
||||||
# Get running containers
|
|
||||||
local running_containers=$(docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" | grep meldestelle)
|
|
||||||
|
|
||||||
echo "Running Meldestelle Services:"
|
|
||||||
echo "$running_containers"
|
|
||||||
|
|
||||||
# Check resource usage
|
|
||||||
log_info "Resource usage summary:"
|
|
||||||
docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}" $(docker ps -q --filter "name=meldestelle")
|
|
||||||
}
|
|
||||||
|
|
||||||
# Function to cleanup
|
|
||||||
cleanup() {
|
|
||||||
log_info "========================================="
|
|
||||||
log_info "Cleaning up test environment"
|
|
||||||
log_info "========================================="
|
|
||||||
|
|
||||||
log_info "Stopping and removing all test containers..."
|
|
||||||
|
|
||||||
# Use the same files to tear down the environment
|
|
||||||
docker compose $COMPOSE_FILES down --remove-orphans -v
|
|
||||||
|
|
||||||
# # Stop and remove containers if they exist
|
|
||||||
# local containers=("meldestelle-postgres" "meldestelle-redis" "meldestelle-consul" "meldestelle-prometheus" "meldestelle-grafana" "meldestelle-keycloak" "meldestelle-api-gateway")
|
|
||||||
#
|
|
||||||
# for container in "${containers[@]}"; do
|
|
||||||
# if docker ps -a --format '{{.Names}}' | grep -q "^${container}$"; then
|
|
||||||
# log_info "Stopping and removing $container"
|
|
||||||
# docker stop "$container" >/dev/null 2>&1 || true
|
|
||||||
# docker rm "$container" >/dev/null 2>&1 || true
|
|
||||||
# fi
|
|
||||||
# done
|
|
||||||
|
|
||||||
# Remove network if it exists
|
|
||||||
docker network rm meldestelle-network >/dev/null 2>&1 || true
|
|
||||||
|
|
||||||
log_info "Cleanup completed"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Main test execution
|
|
||||||
main() {
|
|
||||||
log_info "========================================="
|
|
||||||
log_info "Starting Meldestelle Services Test Suite"
|
|
||||||
log_info "========================================="
|
|
||||||
|
|
||||||
# Set trap to cleanup on exit
|
|
||||||
trap cleanup EXIT
|
|
||||||
|
|
||||||
# Run tests in sequence
|
|
||||||
test_all_services || exit 1
|
|
||||||
test_network_connectivity || exit 1
|
|
||||||
|
|
||||||
# Generate report
|
|
||||||
generate_test_report
|
|
||||||
|
|
||||||
log_success "========================================="
|
|
||||||
log_success "All tests passed successfully!"
|
|
||||||
log_success "All services are running and healthy!"
|
|
||||||
log_success "========================================="
|
|
||||||
}
|
|
||||||
|
|
||||||
# Parse command line arguments
|
|
||||||
case "${1:-}" in
|
|
||||||
"all")
|
|
||||||
test_all_services
|
|
||||||
;;
|
|
||||||
"network")
|
|
||||||
test_network_connectivity
|
|
||||||
;;
|
|
||||||
"cleanup")
|
|
||||||
cleanup
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
main
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
Executable
+184
@@ -0,0 +1,184 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# ===================================================================
|
||||||
|
# Docker Build Script with Centralized Version Management
|
||||||
|
# Automatically sources versions from docker/versions.toml via environment files
|
||||||
|
# ===================================================================
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Script directory and project root
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||||||
|
DOCKER_DIR="$PROJECT_ROOT/docker"
|
||||||
|
BUILD_ARGS_DIR="$DOCKER_DIR/build-args"
|
||||||
|
|
||||||
|
# Colors for output
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
# Function to print colored output
|
||||||
|
print_info() {
|
||||||
|
echo -e "${BLUE}[INFO]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_success() {
|
||||||
|
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_warning() {
|
||||||
|
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_error() {
|
||||||
|
echo -e "${RED}[ERROR]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to load environment files
|
||||||
|
load_env_files() {
|
||||||
|
print_info "Loading centralized Docker version environment files..."
|
||||||
|
|
||||||
|
# Load global environment variables
|
||||||
|
if [[ -f "$BUILD_ARGS_DIR/global.env" ]]; then
|
||||||
|
export $(grep -v '^#' "$BUILD_ARGS_DIR/global.env" | xargs)
|
||||||
|
print_info "✓ Loaded global.env"
|
||||||
|
else
|
||||||
|
print_error "Global environment file not found: $BUILD_ARGS_DIR/global.env"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Load category-specific environment variables
|
||||||
|
for env_file in services.env clients.env infrastructure.env; do
|
||||||
|
if [[ -f "$BUILD_ARGS_DIR/$env_file" ]]; then
|
||||||
|
export $(grep -v '^#' "$BUILD_ARGS_DIR/$env_file" | xargs)
|
||||||
|
print_info "✓ Loaded $env_file"
|
||||||
|
else
|
||||||
|
print_warning "Optional environment file not found: $BUILD_ARGS_DIR/$env_file"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Set BUILD_DATE if not already set
|
||||||
|
export BUILD_DATE=${BUILD_DATE:-$(date -u +'%Y-%m-%dT%H:%M:%SZ')}
|
||||||
|
|
||||||
|
# Map to Docker Compose environment variables
|
||||||
|
export DOCKER_GRADLE_VERSION="${GRADLE_VERSION}"
|
||||||
|
export DOCKER_JAVA_VERSION="${JAVA_VERSION}"
|
||||||
|
export DOCKER_NODE_VERSION="${NODE_VERSION}"
|
||||||
|
export DOCKER_NGINX_VERSION="${NGINX_VERSION}"
|
||||||
|
export DOCKER_APP_VERSION="${VERSION}"
|
||||||
|
export DOCKER_SPRING_PROFILES_DEFAULT="${SPRING_PROFILES_ACTIVE:-default}"
|
||||||
|
export DOCKER_SPRING_PROFILES_DOCKER="docker"
|
||||||
|
|
||||||
|
print_success "All environment files loaded successfully!"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to show current versions
|
||||||
|
show_versions() {
|
||||||
|
print_info "Current centralized Docker versions:"
|
||||||
|
echo " Gradle Version: ${DOCKER_GRADLE_VERSION:-not set}"
|
||||||
|
echo " Java Version: ${DOCKER_JAVA_VERSION:-not set}"
|
||||||
|
echo " Node Version: ${DOCKER_NODE_VERSION:-not set}"
|
||||||
|
echo " Nginx Version: ${DOCKER_NGINX_VERSION:-not set}"
|
||||||
|
echo " App Version: ${DOCKER_APP_VERSION:-not set}"
|
||||||
|
echo " Build Date: ${BUILD_DATE:-not set}"
|
||||||
|
echo " Spring Profile (Default): ${DOCKER_SPRING_PROFILES_DEFAULT:-not set}"
|
||||||
|
echo " Spring Profile (Docker): ${DOCKER_SPRING_PROFILES_DOCKER:-not set}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to build specific category
|
||||||
|
build_category() {
|
||||||
|
local category=$1
|
||||||
|
local compose_file=""
|
||||||
|
|
||||||
|
case $category in
|
||||||
|
"infrastructure")
|
||||||
|
compose_file="docker-compose.yml"
|
||||||
|
;;
|
||||||
|
"services")
|
||||||
|
compose_file="docker-compose.yml -f docker-compose.services.yml"
|
||||||
|
;;
|
||||||
|
"clients")
|
||||||
|
compose_file="docker-compose.yml -f docker-compose.clients.yml"
|
||||||
|
;;
|
||||||
|
"all")
|
||||||
|
compose_file="docker-compose.yml -f docker-compose.services.yml -f docker-compose.clients.yml"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
print_error "Invalid category: $category"
|
||||||
|
print_info "Valid categories: infrastructure, services, clients, all"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
print_info "Building $category with centralized versions..."
|
||||||
|
cd "$PROJECT_ROOT"
|
||||||
|
|
||||||
|
if docker-compose -f $compose_file build; then
|
||||||
|
print_success "$category built successfully!"
|
||||||
|
else
|
||||||
|
print_error "Failed to build $category"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Help function
|
||||||
|
show_help() {
|
||||||
|
echo "Docker Build Script with Centralized Version Management"
|
||||||
|
echo ""
|
||||||
|
echo "Usage: $0 [OPTIONS] [CATEGORY]"
|
||||||
|
echo ""
|
||||||
|
echo "Categories:"
|
||||||
|
echo " infrastructure Build infrastructure services (API Gateway)"
|
||||||
|
echo " services Build application services (ping-service, etc.)"
|
||||||
|
echo " clients Build client applications (web-app, desktop-app)"
|
||||||
|
echo " all Build everything"
|
||||||
|
echo ""
|
||||||
|
echo "Options:"
|
||||||
|
echo " -v, --versions Show current versions"
|
||||||
|
echo " -h, --help Show this help message"
|
||||||
|
echo ""
|
||||||
|
echo "Examples:"
|
||||||
|
echo " $0 services # Build all services"
|
||||||
|
echo " $0 clients # Build client applications"
|
||||||
|
echo " $0 all # Build everything"
|
||||||
|
echo " $0 --versions # Show current versions"
|
||||||
|
echo ""
|
||||||
|
echo "The script automatically loads versions from:"
|
||||||
|
echo " - docker/build-args/global.env"
|
||||||
|
echo " - docker/build-args/services.env"
|
||||||
|
echo " - docker/build-args/clients.env"
|
||||||
|
echo " - docker/build-args/infrastructure.env"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Main execution
|
||||||
|
main() {
|
||||||
|
# Parse command line arguments
|
||||||
|
case $1 in
|
||||||
|
-h|--help)
|
||||||
|
show_help
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
-v|--versions)
|
||||||
|
load_env_files
|
||||||
|
show_versions
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
"")
|
||||||
|
print_error "No category specified"
|
||||||
|
show_help
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# Load environment and build
|
||||||
|
load_env_files
|
||||||
|
show_versions
|
||||||
|
echo ""
|
||||||
|
build_category "$1"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
# Run main function with all arguments
|
||||||
|
main "$@"
|
||||||
Executable
+299
@@ -0,0 +1,299 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# ===================================================================
|
||||||
|
# Docker Versions Update Utility
|
||||||
|
# Updates central docker/versions.toml and syncs to environment files
|
||||||
|
# ===================================================================
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Script directory and project root
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||||||
|
DOCKER_DIR="$PROJECT_ROOT/docker"
|
||||||
|
VERSIONS_TOML="$DOCKER_DIR/versions.toml"
|
||||||
|
BUILD_ARGS_DIR="$DOCKER_DIR/build-args"
|
||||||
|
|
||||||
|
# Colors for output
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
# Function to print colored output
|
||||||
|
print_info() {
|
||||||
|
echo -e "${BLUE}[INFO]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_success() {
|
||||||
|
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_warning() {
|
||||||
|
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_error() {
|
||||||
|
echo -e "${RED}[ERROR]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to extract version from TOML file
|
||||||
|
get_version() {
|
||||||
|
local key=$1
|
||||||
|
grep "^$key = " "$VERSIONS_TOML" | sed 's/.*= "\(.*\)"/\1/' || echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to update version in TOML file
|
||||||
|
update_version() {
|
||||||
|
local key=$1
|
||||||
|
local new_value=$2
|
||||||
|
|
||||||
|
if grep -q "^$key = " "$VERSIONS_TOML"; then
|
||||||
|
# Update existing key
|
||||||
|
sed -i.bak "s/^$key = .*/$key = \"$new_value\"/" "$VERSIONS_TOML"
|
||||||
|
print_success "Updated $key to $new_value"
|
||||||
|
else
|
||||||
|
print_error "Key $key not found in $VERSIONS_TOML"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to sync TOML to environment files
|
||||||
|
sync_to_env_files() {
|
||||||
|
print_info "Syncing versions.toml to environment files..."
|
||||||
|
|
||||||
|
# Get current versions from TOML
|
||||||
|
local gradle_version=$(get_version "gradle")
|
||||||
|
local java_version=$(get_version "java")
|
||||||
|
local node_version=$(get_version "node")
|
||||||
|
local nginx_version=$(get_version "nginx")
|
||||||
|
local app_version=$(get_version "app-version")
|
||||||
|
local spring_default=$(get_version "spring-profiles-default")
|
||||||
|
local spring_docker=$(get_version "spring-profiles-docker")
|
||||||
|
local alpine_version=$(get_version "alpine")
|
||||||
|
|
||||||
|
# Update global.env
|
||||||
|
cat > "$BUILD_ARGS_DIR/global.env" << EOF
|
||||||
|
# ===================================================================
|
||||||
|
# Global Docker Build Arguments - Used by all categories
|
||||||
|
# Source: docker/versions.toml
|
||||||
|
# Last updated: $(date -u +'%Y-%m-%d %H:%M:%S UTC')
|
||||||
|
# ===================================================================
|
||||||
|
|
||||||
|
# --- Build Tools ---
|
||||||
|
GRADLE_VERSION=$gradle_version
|
||||||
|
JAVA_VERSION=$java_version
|
||||||
|
|
||||||
|
# --- Build Metadata ---
|
||||||
|
BUILD_DATE=\$(date -u +'%Y-%m-%dT%H:%M:%SZ')
|
||||||
|
VERSION=$app_version
|
||||||
|
|
||||||
|
# --- Common Base Images ---
|
||||||
|
ALPINE_VERSION=$alpine_version
|
||||||
|
ECLIPSE_TEMURIN_JDK_VERSION=$java_version-jdk-alpine
|
||||||
|
ECLIPSE_TEMURIN_JRE_VERSION=$java_version-jre-alpine
|
||||||
|
EOF
|
||||||
|
print_success "Updated global.env"
|
||||||
|
|
||||||
|
# Update clients.env
|
||||||
|
cat > "$BUILD_ARGS_DIR/clients.env" << EOF
|
||||||
|
# ===================================================================
|
||||||
|
# Clients Docker Build Arguments - dockerfiles/clients/*
|
||||||
|
# Source: docker/versions.toml [categories.clients]
|
||||||
|
# Last updated: $(date -u +'%Y-%m-%d %H:%M:%S UTC')
|
||||||
|
# ===================================================================
|
||||||
|
|
||||||
|
# --- Include Global Arguments ---
|
||||||
|
# Source global.env for GRADLE_VERSION, JAVA_VERSION, BUILD_DATE, VERSION
|
||||||
|
|
||||||
|
# --- Client-Specific Build Tools ---
|
||||||
|
NODE_VERSION=$node_version
|
||||||
|
NGINX_VERSION=$nginx_version
|
||||||
|
|
||||||
|
# --- Client Build Configuration ---
|
||||||
|
CLIENT_PATH=client
|
||||||
|
CLIENT_MODULE=client
|
||||||
|
CLIENT_NAME=meldestelle-client
|
||||||
|
|
||||||
|
# --- Web Application Specific ---
|
||||||
|
WEB_APP_PORT=4000
|
||||||
|
WEB_APP_BUILD_TARGET=wasmJsBrowserDistribution
|
||||||
|
|
||||||
|
# --- Desktop Application Specific ---
|
||||||
|
DESKTOP_APP_VNC_PORT=5901
|
||||||
|
DESKTOP_APP_NOVNC_PORT=6080
|
||||||
|
DESKTOP_APP_BUILD_TARGET=composeDesktop
|
||||||
|
|
||||||
|
# --- Client Environment ---
|
||||||
|
NODE_ENV=production
|
||||||
|
APP_TITLE=Meldestelle
|
||||||
|
APP_VERSION=$app_version
|
||||||
|
|
||||||
|
# --- Development Configuration ---
|
||||||
|
WEBPACK_DEV_SERVER_HOST=0.0.0.0
|
||||||
|
WEBPACK_DEV_SERVER_PORT=4000
|
||||||
|
EOF
|
||||||
|
print_success "Updated clients.env"
|
||||||
|
|
||||||
|
# Update services.env
|
||||||
|
cat > "$BUILD_ARGS_DIR/services.env" << EOF
|
||||||
|
# ===================================================================
|
||||||
|
# Services Docker Build Arguments - dockerfiles/services/*
|
||||||
|
# Source: docker/versions.toml [categories.services]
|
||||||
|
# Last updated: $(date -u +'%Y-%m-%d %H:%M:%S UTC')
|
||||||
|
# ===================================================================
|
||||||
|
|
||||||
|
# --- Include Global Arguments ---
|
||||||
|
# Source global.env for GRADLE_VERSION, JAVA_VERSION, BUILD_DATE, VERSION
|
||||||
|
|
||||||
|
# --- Spring Boot Services Configuration ---
|
||||||
|
SPRING_PROFILES_ACTIVE=$spring_docker
|
||||||
|
|
||||||
|
# --- Service-Specific Arguments ---
|
||||||
|
SERVICE_PATH=.
|
||||||
|
SERVICE_NAME=spring-boot-service
|
||||||
|
SERVICE_PORT=8080
|
||||||
|
|
||||||
|
# --- Service Port Mapping (matches gradle.properties) ---
|
||||||
|
PING_SERVICE_PORT=8082
|
||||||
|
MEMBERS_SERVICE_PORT=8083
|
||||||
|
HORSES_SERVICE_PORT=8084
|
||||||
|
EVENTS_SERVICE_PORT=8085
|
||||||
|
MASTERDATA_SERVICE_PORT=8086
|
||||||
|
|
||||||
|
# --- Services List (for automation scripts) ---
|
||||||
|
# ping-service, members-service, horses-service, events-service, masterdata-service
|
||||||
|
EOF
|
||||||
|
print_success "Updated services.env"
|
||||||
|
|
||||||
|
# Update infrastructure.env
|
||||||
|
cat > "$BUILD_ARGS_DIR/infrastructure.env" << EOF
|
||||||
|
# ===================================================================
|
||||||
|
# Infrastructure Docker Build Arguments - dockerfiles/infrastructure/*
|
||||||
|
# Source: docker/versions.toml [categories.infrastructure]
|
||||||
|
# Last updated: $(date -u +'%Y-%m-%d %H:%M:%S UTC')
|
||||||
|
# ===================================================================
|
||||||
|
|
||||||
|
# --- Include Global Arguments ---
|
||||||
|
# Source global.env for GRADLE_VERSION, JAVA_VERSION, BUILD_DATE, VERSION
|
||||||
|
|
||||||
|
# --- Infrastructure Services Configuration ---
|
||||||
|
SPRING_PROFILES_ACTIVE=$spring_default
|
||||||
|
|
||||||
|
# --- Infrastructure Service Ports (matches gradle.properties) ---
|
||||||
|
GATEWAY_PORT=8081
|
||||||
|
AUTH_SERVER_PORT=8087
|
||||||
|
MONITORING_SERVER_PORT=8088
|
||||||
|
|
||||||
|
# --- API Gateway Specific ---
|
||||||
|
GATEWAY_SERVICE_PATH=infrastructure/gateway
|
||||||
|
GATEWAY_SERVICE_NAME=api-gateway
|
||||||
|
|
||||||
|
# --- Auth Server Specific ---
|
||||||
|
AUTH_SERVER_PATH=infrastructure/auth/auth-server
|
||||||
|
AUTH_SERVER_SERVICE_NAME=auth-server
|
||||||
|
|
||||||
|
# --- Monitoring Server Specific ---
|
||||||
|
MONITORING_SERVER_PATH=infrastructure/monitoring/monitoring-server
|
||||||
|
MONITORING_SERVER_SERVICE_NAME=monitoring-server
|
||||||
|
|
||||||
|
# --- Infrastructure Dependencies ---
|
||||||
|
CONSUL_ENABLED=true
|
||||||
|
CONSUL_HOST=consul
|
||||||
|
CONSUL_PORT=8500
|
||||||
|
|
||||||
|
# --- Database Configuration for Infrastructure Services ---
|
||||||
|
DB_HOST=postgres
|
||||||
|
DB_PORT=5432
|
||||||
|
DB_NAME=meldestelle
|
||||||
|
EOF
|
||||||
|
print_success "Updated infrastructure.env"
|
||||||
|
|
||||||
|
print_success "All environment files synced successfully!"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to show current versions
|
||||||
|
show_current_versions() {
|
||||||
|
print_info "Current Docker versions:"
|
||||||
|
echo " Gradle: $(get_version "gradle")"
|
||||||
|
echo " Java: $(get_version "java")"
|
||||||
|
echo " Node.js: $(get_version "node")"
|
||||||
|
echo " Nginx: $(get_version "nginx")"
|
||||||
|
echo " Alpine: $(get_version "alpine")"
|
||||||
|
echo " App Version: $(get_version "app-version")"
|
||||||
|
echo " Spring Profile (Default): $(get_version "spring-profiles-default")"
|
||||||
|
echo " Spring Profile (Docker): $(get_version "spring-profiles-docker")"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to show help
|
||||||
|
show_help() {
|
||||||
|
echo "Docker Versions Update Utility"
|
||||||
|
echo ""
|
||||||
|
echo "Usage: $0 [COMMAND] [OPTIONS]"
|
||||||
|
echo ""
|
||||||
|
echo "Commands:"
|
||||||
|
echo " show Show current versions"
|
||||||
|
echo " sync Sync versions.toml to environment files"
|
||||||
|
echo " update <key> <version> Update specific version"
|
||||||
|
echo ""
|
||||||
|
echo "Available keys for update:"
|
||||||
|
echo " gradle Gradle version"
|
||||||
|
echo " java Java version"
|
||||||
|
echo " node Node.js version"
|
||||||
|
echo " nginx Nginx version"
|
||||||
|
echo " alpine Alpine Linux version"
|
||||||
|
echo " app-version Application version"
|
||||||
|
echo " spring-profiles-default Default Spring profile"
|
||||||
|
echo " spring-profiles-docker Docker Spring profile"
|
||||||
|
echo ""
|
||||||
|
echo "Examples:"
|
||||||
|
echo " $0 show # Show current versions"
|
||||||
|
echo " $0 update gradle 9.1.0 # Update Gradle to 9.1.0"
|
||||||
|
echo " $0 update java 22 # Update Java to version 22"
|
||||||
|
echo " $0 sync # Sync versions to environment files"
|
||||||
|
echo ""
|
||||||
|
echo "After updating versions, run 'sync' to update environment files"
|
||||||
|
echo "or use scripts/docker-build.sh to build with new versions."
|
||||||
|
}
|
||||||
|
|
||||||
|
# Main execution
|
||||||
|
main() {
|
||||||
|
# Check if versions.toml exists
|
||||||
|
if [[ ! -f "$VERSIONS_TOML" ]]; then
|
||||||
|
print_error "Versions file not found: $VERSIONS_TOML"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
case $1 in
|
||||||
|
"show")
|
||||||
|
show_current_versions
|
||||||
|
;;
|
||||||
|
"sync")
|
||||||
|
sync_to_env_files
|
||||||
|
;;
|
||||||
|
"update")
|
||||||
|
if [[ $# -lt 3 ]]; then
|
||||||
|
print_error "Usage: $0 update <key> <version>"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
update_version "$2" "$3"
|
||||||
|
sync_to_env_files
|
||||||
|
;;
|
||||||
|
"-h"|"--help"|"help")
|
||||||
|
show_help
|
||||||
|
;;
|
||||||
|
"")
|
||||||
|
print_error "No command specified"
|
||||||
|
show_help
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
print_error "Unknown command: $1"
|
||||||
|
show_help
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
# Run main function with all arguments
|
||||||
|
main "$@"
|
||||||
Executable
+420
@@ -0,0 +1,420 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# Full System Integration Test Script
|
||||||
|
# =============================================================================
|
||||||
|
# Comprehensive testing of all Meldestelle services including infrastructure,
|
||||||
|
# application services, client applications, and inter-service connectivity.
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# Load common utilities
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
# shellcheck source=../utils/common.sh
|
||||||
|
source "$SCRIPT_DIR/../utils/common.sh" || {
|
||||||
|
echo "Error: Could not load common utilities"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# Configuration
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
readonly COMPOSE_FILES="-f docker-compose.yml -f docker-compose.services.yml -f docker-compose.clients.yml"
|
||||||
|
readonly TIMEOUT_SECONDS=300
|
||||||
|
readonly HEALTH_CHECK_INTERVAL=10
|
||||||
|
readonly MAX_RETRIES=30
|
||||||
|
|
||||||
|
# Project root and Docker configuration
|
||||||
|
readonly PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
||||||
|
readonly DOCKER_DIR="$PROJECT_ROOT/docker"
|
||||||
|
readonly BUILD_ARGS_DIR="$DOCKER_DIR/build-args"
|
||||||
|
|
||||||
|
# Service endpoints (from common configuration)
|
||||||
|
readonly SERVICES_CONFIG=(
|
||||||
|
"postgres:5432:PostgreSQL:pg_isready -U meldestelle"
|
||||||
|
"redis:6379:Redis:redis-cli ping"
|
||||||
|
"consul:8500:Consul:http://localhost:8500/v1/status/leader"
|
||||||
|
"api-gateway:8081:API Gateway:http://localhost:8081/actuator/health"
|
||||||
|
"ping-service:8082:Ping Service:http://localhost:8082/actuator/health"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Integration with central Docker version management
|
||||||
|
load_docker_versions() {
|
||||||
|
if [[ -f "$BUILD_ARGS_DIR/global.env" ]]; then
|
||||||
|
source "$BUILD_ARGS_DIR/global.env"
|
||||||
|
log_info "Loaded centralized Docker versions"
|
||||||
|
else
|
||||||
|
log_warning "Centralized Docker versions not found, using defaults"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to wait for service health check using common utilities
|
||||||
|
wait_for_service_with_retry() {
|
||||||
|
local service_name=$1
|
||||||
|
local health_check=$2
|
||||||
|
local max_attempts=${3:-$MAX_RETRIES}
|
||||||
|
|
||||||
|
log_info "Waiting for $service_name to become healthy..."
|
||||||
|
|
||||||
|
if retry_with_backoff "$max_attempts" "$health_check" "Waiting for $service_name"; then
|
||||||
|
log_success "$service_name is healthy"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
log_error "$service_name failed to become healthy after $max_attempts attempts"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# HTTP health check function
|
||||||
|
http_health_check() {
|
||||||
|
local url=$1
|
||||||
|
curl -f -s -L --max-time 5 "$url" > /dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
# PostgreSQL health check function
|
||||||
|
postgres_health_check() {
|
||||||
|
docker exec meldestelle-postgres pg_isready -U meldestelle -d meldestelle > /dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Redis health check function
|
||||||
|
redis_health_check() {
|
||||||
|
docker exec meldestelle-redis redis-cli ping > /dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to check service logs for errors
|
||||||
|
check_service_logs() {
|
||||||
|
local service_name=$1
|
||||||
|
local container_name=$2
|
||||||
|
|
||||||
|
log_info "Checking $service_name logs for errors..."
|
||||||
|
|
||||||
|
# Get last 50 lines of logs
|
||||||
|
local logs=$(docker logs --tail 50 "$container_name" 2>&1 || echo "")
|
||||||
|
|
||||||
|
# Check for common error patterns
|
||||||
|
if echo "$logs" | grep -qi "error\|exception\|failed\|fatal"; then
|
||||||
|
log_warning "$service_name has error messages in logs:"
|
||||||
|
echo "$logs" | grep -i "error\|exception\|failed\|fatal" | tail -5
|
||||||
|
else
|
||||||
|
log_success "$service_name logs look clean"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# Enhanced Test Categories and Selective Execution
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# Function to test infrastructure services only
|
||||||
|
test_infrastructure_services() {
|
||||||
|
log_section "Testing Infrastructure Services"
|
||||||
|
|
||||||
|
# Load Docker versions
|
||||||
|
load_docker_versions
|
||||||
|
|
||||||
|
# Start infrastructure services only
|
||||||
|
log_info "Starting infrastructure services..."
|
||||||
|
cd "$PROJECT_ROOT"
|
||||||
|
docker compose -f docker-compose.yml up -d
|
||||||
|
|
||||||
|
# Wait for initialization
|
||||||
|
log_info "Waiting 30 seconds for infrastructure services to initialize..."
|
||||||
|
sleep 30
|
||||||
|
|
||||||
|
# Test PostgreSQL
|
||||||
|
log_info "Testing PostgreSQL connection..."
|
||||||
|
wait_for_service_with_retry "PostgreSQL" postgres_health_check || return 1
|
||||||
|
|
||||||
|
# Test Redis
|
||||||
|
log_info "Testing Redis connection..."
|
||||||
|
wait_for_service_with_retry "Redis" redis_health_check || return 1
|
||||||
|
|
||||||
|
# Test Consul
|
||||||
|
log_info "Testing Consul..."
|
||||||
|
wait_for_service_with_retry "Consul" "http_health_check http://localhost:8500/v1/status/leader" || return 1
|
||||||
|
|
||||||
|
# Test Prometheus
|
||||||
|
log_info "Testing Prometheus..."
|
||||||
|
wait_for_service_with_retry "Prometheus" "http_health_check http://localhost:9090/-/healthy" || return 1
|
||||||
|
|
||||||
|
# Test Grafana
|
||||||
|
log_info "Testing Grafana..."
|
||||||
|
wait_for_service_with_retry "Grafana" "http_health_check http://localhost:3000/api/health" || return 1
|
||||||
|
|
||||||
|
# Test Keycloak
|
||||||
|
log_info "Testing Keycloak..."
|
||||||
|
wait_for_service_with_retry "Keycloak" "http_health_check http://localhost:8180/" || return 1
|
||||||
|
|
||||||
|
log_success "All infrastructure services are healthy!"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to test application services
|
||||||
|
test_application_services() {
|
||||||
|
log_section "Testing Application Services"
|
||||||
|
|
||||||
|
# Start application services
|
||||||
|
log_info "Starting application services..."
|
||||||
|
cd "$PROJECT_ROOT"
|
||||||
|
docker compose $COMPOSE_FILES up -d
|
||||||
|
|
||||||
|
# Wait for initialization
|
||||||
|
log_info "Waiting 45 seconds for application services to initialize..."
|
||||||
|
sleep 45
|
||||||
|
|
||||||
|
# Test API Gateway
|
||||||
|
log_info "Testing API Gateway..."
|
||||||
|
wait_for_service_with_retry "API Gateway" "http_health_check http://localhost:8081/actuator/health" || return 1
|
||||||
|
|
||||||
|
# Test Ping Service
|
||||||
|
log_info "Testing Ping Service..."
|
||||||
|
wait_for_service_with_retry "Ping Service" "http_health_check http://localhost:8082/actuator/health" || return 1
|
||||||
|
|
||||||
|
log_success "All application services are healthy!"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to test client applications
|
||||||
|
test_client_applications() {
|
||||||
|
log_section "Testing Client Applications"
|
||||||
|
|
||||||
|
# Start client applications
|
||||||
|
log_info "Starting client applications..."
|
||||||
|
cd "$PROJECT_ROOT"
|
||||||
|
docker compose -f docker-compose.yml -f docker-compose.clients.yml up -d
|
||||||
|
|
||||||
|
# Wait for initialization
|
||||||
|
log_info "Waiting 60 seconds for client applications to initialize..."
|
||||||
|
sleep 60
|
||||||
|
|
||||||
|
# Test Web Application
|
||||||
|
log_info "Testing Web Application..."
|
||||||
|
wait_for_service_with_retry "Web App" "http_health_check http://localhost:4000/health" || return 1
|
||||||
|
|
||||||
|
# Test Desktop Application (VNC interface)
|
||||||
|
log_info "Testing Desktop Application VNC interface..."
|
||||||
|
wait_for_service_with_retry "Desktop App" "http_health_check http://localhost:6080/" || return 1
|
||||||
|
|
||||||
|
log_success "All client applications are healthy!"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to test network connectivity
|
||||||
|
test_network_connectivity() {
|
||||||
|
log_section "Testing Network Connectivity"
|
||||||
|
|
||||||
|
# Test service-to-service connectivity
|
||||||
|
log_info "Testing service-to-service connectivity..."
|
||||||
|
|
||||||
|
# Test API Gateway can reach backend services
|
||||||
|
if docker exec meldestelle-api-gateway curl -f -s --max-time 5 http://ping-service:8082/actuator/health > /dev/null 2>&1; then
|
||||||
|
log_success "API Gateway can reach Ping Service"
|
||||||
|
else
|
||||||
|
log_error "API Gateway cannot reach Ping Service"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Test application service can reach infrastructure
|
||||||
|
if docker exec meldestelle-ping-service curl -f -s --max-time 5 http://consul:8500/v1/status/leader > /dev/null 2>&1; then
|
||||||
|
log_success "Application services can reach Consul"
|
||||||
|
else
|
||||||
|
log_error "Application services cannot reach Consul"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_success "Network connectivity tests passed!"
|
||||||
|
}
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# Enhanced Reporting and Monitoring
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# Function to generate integration report
|
||||||
|
generate_integration_report() {
|
||||||
|
log_section "Integration Test Report"
|
||||||
|
|
||||||
|
# Service status matrix
|
||||||
|
log_info "Service Status Matrix:"
|
||||||
|
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" --filter "name=meldestelle"
|
||||||
|
|
||||||
|
# Performance metrics
|
||||||
|
log_info "Performance Metrics:"
|
||||||
|
docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}" $(docker ps -q --filter "name=meldestelle") 2>/dev/null || true
|
||||||
|
|
||||||
|
# Resource usage summary
|
||||||
|
local containers=$(docker ps --filter "name=meldestelle" --format "{{.Names}}" | wc -l)
|
||||||
|
log_info "Total running containers: $containers"
|
||||||
|
|
||||||
|
# Test summary
|
||||||
|
print_test_summary
|
||||||
|
}
|
||||||
|
|
||||||
|
# Enhanced cleanup function using common utilities
|
||||||
|
cleanup() {
|
||||||
|
log_section "Cleaning up test environment"
|
||||||
|
|
||||||
|
log_info "Stopping and removing all test containers..."
|
||||||
|
cd "$PROJECT_ROOT"
|
||||||
|
|
||||||
|
# Use the same files to tear down the environment
|
||||||
|
docker compose $COMPOSE_FILES down --remove-orphans -v 2>/dev/null || true
|
||||||
|
|
||||||
|
# Remove network if it exists
|
||||||
|
docker network rm meldestelle-network >/dev/null 2>&1 || true
|
||||||
|
|
||||||
|
log_success "Cleanup completed"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to run full system integration test
|
||||||
|
run_full_integration_test() {
|
||||||
|
log_section "Full System Integration Test"
|
||||||
|
|
||||||
|
# Load Docker versions
|
||||||
|
load_docker_versions
|
||||||
|
|
||||||
|
# Start ALL services using all compose files
|
||||||
|
log_info "Starting full environment with all services..."
|
||||||
|
cd "$PROJECT_ROOT"
|
||||||
|
docker compose $COMPOSE_FILES up -d
|
||||||
|
|
||||||
|
# Give services time to initialize
|
||||||
|
log_info "Waiting 60 seconds for all services to initialize..."
|
||||||
|
sleep 60
|
||||||
|
|
||||||
|
# Run comprehensive tests
|
||||||
|
test_infrastructure_services || return 1
|
||||||
|
test_application_services || return 1
|
||||||
|
test_client_applications || return 1
|
||||||
|
test_network_connectivity || return 1
|
||||||
|
|
||||||
|
# Generate comprehensive report
|
||||||
|
generate_integration_report
|
||||||
|
|
||||||
|
log_success "Full system integration test completed successfully!"
|
||||||
|
}
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# Command Line Interface and Help System
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# Function to show help
|
||||||
|
show_help() {
|
||||||
|
cat << EOF
|
||||||
|
Full System Integration Test Script
|
||||||
|
|
||||||
|
USAGE:
|
||||||
|
$0 [OPTIONS] [CATEGORY]
|
||||||
|
|
||||||
|
CATEGORIES:
|
||||||
|
infrastructure Test infrastructure services only (PostgreSQL, Redis, Consul, etc.)
|
||||||
|
services Test application services (API Gateway, Ping Service, etc.)
|
||||||
|
clients Test client applications (Web App, Desktop App)
|
||||||
|
network Test inter-service network connectivity
|
||||||
|
all Run full system integration test (default)
|
||||||
|
cleanup Clean up test environment only
|
||||||
|
|
||||||
|
OPTIONS:
|
||||||
|
-h, --help Show this help message
|
||||||
|
-v, --verbose Enable verbose logging
|
||||||
|
--no-cleanup Skip cleanup on exit
|
||||||
|
--cleanup-only Only run cleanup and exit
|
||||||
|
|
||||||
|
EXAMPLES:
|
||||||
|
$0 # Run full integration test
|
||||||
|
$0 infrastructure # Test infrastructure services only
|
||||||
|
$0 services # Test application services only
|
||||||
|
$0 clients # Test client applications only
|
||||||
|
$0 network # Test network connectivity only
|
||||||
|
$0 cleanup # Clean up test environment
|
||||||
|
$0 --help # Show this help
|
||||||
|
|
||||||
|
ENVIRONMENT VARIABLES:
|
||||||
|
CLEANUP_SERVICES=false Skip cleanup on exit
|
||||||
|
REMOVE_CONTAINERS=true Remove containers during cleanup
|
||||||
|
MAX_RETRIES=30 Maximum retry attempts for health checks
|
||||||
|
HEALTH_CHECK_INTERVAL=10 Seconds between health check attempts
|
||||||
|
|
||||||
|
The script automatically loads versions from the centralized Docker version
|
||||||
|
management system and integrates with the common utilities for consistent
|
||||||
|
logging, error handling, and cleanup procedures.
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# Main Execution Function
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
# Main execution function with enhanced argument parsing
|
||||||
|
main() {
|
||||||
|
local category="${1:-all}"
|
||||||
|
local cleanup_on_exit=true
|
||||||
|
|
||||||
|
# Parse options
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case $1 in
|
||||||
|
-h|--help)
|
||||||
|
show_help
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
-v|--verbose)
|
||||||
|
set -x
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--no-cleanup)
|
||||||
|
cleanup_on_exit=false
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--cleanup-only)
|
||||||
|
cleanup
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
-*)
|
||||||
|
log_error "Unknown option: $1"
|
||||||
|
show_help
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
category="$1"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# Set cleanup trap if requested
|
||||||
|
if [[ "$cleanup_on_exit" == "true" ]]; then
|
||||||
|
trap cleanup EXIT
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Execute based on category
|
||||||
|
log_section "Meldestelle Integration Test Suite"
|
||||||
|
log_info "Category: $category"
|
||||||
|
log_info "Cleanup on exit: $cleanup_on_exit"
|
||||||
|
|
||||||
|
case "$category" in
|
||||||
|
"infrastructure")
|
||||||
|
test_infrastructure_services || exit 1
|
||||||
|
;;
|
||||||
|
"services")
|
||||||
|
test_application_services || exit 1
|
||||||
|
;;
|
||||||
|
"clients")
|
||||||
|
test_client_applications || exit 1
|
||||||
|
;;
|
||||||
|
"network")
|
||||||
|
test_network_connectivity || exit 1
|
||||||
|
;;
|
||||||
|
"all")
|
||||||
|
run_full_integration_test || exit 1
|
||||||
|
;;
|
||||||
|
"cleanup")
|
||||||
|
cleanup
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
log_error "Unknown category: $category"
|
||||||
|
show_help
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
log_success "Integration test completed successfully!"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Execute main function with all arguments
|
||||||
|
main "$@"
|
||||||
@@ -1,94 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# ===================================================================
|
|
||||||
# Docker Compose Test Script
|
|
||||||
# Tests all three docker-compose files separately
|
|
||||||
# ===================================================================
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
echo "=== Docker Compose Test Script ==="
|
|
||||||
echo "Testing all three compose files for the Meldestelle project"
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
# Function to cleanup containers
|
|
||||||
cleanup() {
|
|
||||||
echo "Cleaning up containers..."
|
|
||||||
docker-compose down -v --remove-orphans 2>/dev/null || true
|
|
||||||
docker-compose -f docker-compose.services.yml down -v --remove-orphans 2>/dev/null || true
|
|
||||||
docker-compose -f docker-compose.clients.yml down -v --remove-orphans 2>/dev/null || true
|
|
||||||
docker system prune -f 2>/dev/null || true
|
|
||||||
}
|
|
||||||
|
|
||||||
# Function to test a compose file
|
|
||||||
test_compose_file() {
|
|
||||||
local compose_file=$1
|
|
||||||
local description=$2
|
|
||||||
|
|
||||||
echo "=== Testing $description ==="
|
|
||||||
echo "File: $compose_file"
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
# Test compose file syntax
|
|
||||||
echo "1. Testing syntax..."
|
|
||||||
if docker-compose -f "$compose_file" config >/dev/null 2>&1; then
|
|
||||||
echo "✓ Syntax OK"
|
|
||||||
else
|
|
||||||
echo "✗ Syntax ERROR"
|
|
||||||
docker-compose -f "$compose_file" config
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Test if we can start the services (dry-run)
|
|
||||||
echo "2. Testing service definitions..."
|
|
||||||
if docker-compose -f "$compose_file" up --dry-run >/dev/null 2>&1; then
|
|
||||||
echo "✓ Service definitions OK"
|
|
||||||
else
|
|
||||||
echo "✗ Service definitions ERROR"
|
|
||||||
docker-compose -f "$compose_file" up --dry-run
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
}
|
|
||||||
|
|
||||||
# Trap to ensure cleanup on exit
|
|
||||||
trap cleanup EXIT
|
|
||||||
|
|
||||||
echo "Starting Docker Compose tests..."
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
# Test 1: Main infrastructure file
|
|
||||||
test_compose_file "docker-compose.yml" "Infrastructure Services (docker-compose.yml)"
|
|
||||||
|
|
||||||
# Test 2: Services file
|
|
||||||
test_compose_file "docker-compose.services.yml" "Application Services (docker-compose.services.yml)"
|
|
||||||
|
|
||||||
# Test 3: Clients file
|
|
||||||
test_compose_file "docker-compose.clients.yml" "Client Applications (docker-compose.clients.yml)"
|
|
||||||
|
|
||||||
echo "=== Test Summary ==="
|
|
||||||
echo "All tests completed. Check output above for any errors."
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
# Additional check: Test combined files
|
|
||||||
echo "=== Testing Combined Files ==="
|
|
||||||
echo "Testing services with infrastructure..."
|
|
||||||
if docker-compose -f docker-compose.yml -f docker-compose.services.yml config >/dev/null 2>&1; then
|
|
||||||
echo "✓ Infrastructure + Services combination OK"
|
|
||||||
else
|
|
||||||
echo "✗ Infrastructure + Services combination ERROR"
|
|
||||||
docker-compose -f docker-compose.yml -f docker-compose.services.yml config
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo "Testing full stack..."
|
|
||||||
if docker-compose -f docker-compose.yml -f docker-compose.services.yml -f docker-compose.clients.yml config >/dev/null 2>&1; then
|
|
||||||
echo "✓ Full stack combination OK"
|
|
||||||
else
|
|
||||||
echo "✗ Full stack combination ERROR"
|
|
||||||
docker-compose -f docker-compose.yml -f docker-compose.services.yml -f docker-compose.clients.yml config
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo "=== Test completed ==="
|
|
||||||
Reference in New Issue
Block a user