fixing docker-compose
This commit is contained in:
@@ -1,10 +0,0 @@
|
|||||||
# Database Configuration
|
|
||||||
POSTGRES_USER=mytestuser
|
|
||||||
POSTGRES_PASSWORD=mytestpassword
|
|
||||||
POSTGRES_DB=mypingtest
|
|
||||||
|
|
||||||
# Debug Configuration
|
|
||||||
DEBUG=true
|
|
||||||
|
|
||||||
# JVM Configuration
|
|
||||||
JAVA_OPTS='-Xmx1g -XX:+UseG1GC -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005'
|
|
||||||
@@ -1,354 +0,0 @@
|
|||||||
# Ping Service Testing Setup - Trace-Bullet Backend Testing
|
|
||||||
|
|
||||||
## Übersicht
|
|
||||||
|
|
||||||
Dieses Docker Compose Setup ermöglicht das isolierte Testen des **Ping Service Backends** im Rahmen der Trace-Bullet Implementierung. Es stellt eine minimale, aber vollständige Testumgebung bereit, die alle notwendigen Abhängigkeiten enthält, ohne die Hauptentwicklungsumgebung zu beeinträchtigen.
|
|
||||||
|
|
||||||
## Architektur
|
|
||||||
|
|
||||||
```
|
|
||||||
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
|
||||||
│ Ping Service │ │ Consul │ │ PostgreSQL │
|
|
||||||
│ Port: 8082 │◄──►│ Port: 8501 │ │ Port: 5433 │
|
|
||||||
│ (Test Target) │ │ (Discovery) │ │ (Database) │
|
|
||||||
└─────────────────┘ └─────────────────┘ └─────────────────┘
|
|
||||||
│ │ │
|
|
||||||
▼ ▼ ▼
|
|
||||||
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
|
||||||
│ Prometheus │ │ Redis │ │ Test Runner │
|
|
||||||
│ Port: 9091 │ │ Port: 6380 │ │ (Automated) │
|
|
||||||
│ (Monitoring) │ │ (Cache) │ │ (Tests) │
|
|
||||||
└─────────────────┘ └─────────────────┘ └─────────────────┘
|
|
||||||
```
|
|
||||||
|
|
||||||
## Enthaltene Services
|
|
||||||
|
|
||||||
### 1. **Ping Service** (Hauptkomponente)
|
|
||||||
- **Port**: 8082
|
|
||||||
- **Debug Port**: 5005 (falls DEBUG=true)
|
|
||||||
- **Health Check**: `/actuator/health`
|
|
||||||
- **Metriken**: `/actuator/prometheus`
|
|
||||||
- **Circuit Breaker**: `/actuator/circuitbreakers`
|
|
||||||
|
|
||||||
### 2. **PostgreSQL Test-Datenbank**
|
|
||||||
- **Port**: 5433 (um Konflikte mit der Hauptdatenbank zu vermeiden)
|
|
||||||
- **Database**: `pingtest`
|
|
||||||
- **User**: `testuser`
|
|
||||||
- **Password**: `testpass`
|
|
||||||
|
|
||||||
### 3. **Redis Cache**
|
|
||||||
- **Port**: 6380 (um Konflikte zu vermeiden)
|
|
||||||
- **Verwendung**: Event Store und Caching
|
|
||||||
|
|
||||||
### 4. **Consul Service Discovery**
|
|
||||||
- **Port**: 8501 (um Konflikte zu vermeiden)
|
|
||||||
- **Web UI**: http://localhost:8501
|
|
||||||
- **Verwendung**: Service Registration und Discovery
|
|
||||||
|
|
||||||
### 5. **Prometheus Monitoring**
|
|
||||||
- **Port**: 9091 (um Konflikte zu vermeiden)
|
|
||||||
- **Web UI**: http://localhost:9091
|
|
||||||
- **Verwendung**: Metriken-Sammlung und Monitoring
|
|
||||||
|
|
||||||
### 6. **Test Runner** (Optional)
|
|
||||||
- Automatisierte Tests für alle Endpoints
|
|
||||||
- Läuft nur mit `--profile test`
|
|
||||||
|
|
||||||
## Schnellstart
|
|
||||||
|
|
||||||
### 1. Umgebung starten
|
|
||||||
```bash
|
|
||||||
# Basis-Setup starten (ohne automatische Tests)
|
|
||||||
docker-compose -f docker-compose-ping-test.yml up -d
|
|
||||||
|
|
||||||
# Mit automatischen Tests
|
|
||||||
docker-compose -f docker-compose-ping-test.yml --profile test up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. Status prüfen
|
|
||||||
```bash
|
|
||||||
# Alle Container-Status anzeigen
|
|
||||||
docker-compose -f docker-compose-ping-test.yml ps
|
|
||||||
|
|
||||||
# Logs des Ping Service anzeigen
|
|
||||||
docker-compose -f docker-compose-ping-test.yml logs -f ping-service
|
|
||||||
|
|
||||||
# Health Checks aller Services
|
|
||||||
docker-compose -f docker-compose-ping-test.yml ps --format "table {{.Service}}\t{{.Status}}\t{{.Ports}}"
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. Manuelle Tests durchführen
|
|
||||||
|
|
||||||
#### Health Check
|
|
||||||
```bash
|
|
||||||
curl http://localhost:8082/actuator/health
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Service Info
|
|
||||||
```bash
|
|
||||||
curl http://localhost:8082/actuator/info
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Circuit Breaker Status
|
|
||||||
```bash
|
|
||||||
curl http://localhost:8082/actuator/circuitbreakers
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Prometheus Metriken
|
|
||||||
```bash
|
|
||||||
curl http://localhost:8082/actuator/prometheus
|
|
||||||
```
|
|
||||||
|
|
||||||
### 4. Umgebung stoppen und aufräumen
|
|
||||||
```bash
|
|
||||||
# Services stoppen
|
|
||||||
docker-compose -f docker-compose-ping-test.yml down
|
|
||||||
|
|
||||||
# Services stoppen und Volumes löschen
|
|
||||||
docker-compose -f docker-compose-ping-test.yml down -v
|
|
||||||
|
|
||||||
# Zusätzlich Images löschen
|
|
||||||
docker-compose -f docker-compose-ping-test.yml down -v --rmi all
|
|
||||||
```
|
|
||||||
|
|
||||||
## Erweiterte Konfiguration
|
|
||||||
|
|
||||||
### Umgebungsvariablen
|
|
||||||
|
|
||||||
Erstellen Sie eine `.env.ping-test` Datei für benutzerdefinierte Konfiguration:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Database Configuration
|
|
||||||
POSTGRES_USER=mytestuser
|
|
||||||
POSTGRES_PASSWORD=mytestpassword
|
|
||||||
POSTGRES_DB=mypingtest
|
|
||||||
|
|
||||||
# Debug Configuration
|
|
||||||
DEBUG=true
|
|
||||||
|
|
||||||
# JVM Configuration
|
|
||||||
JAVA_OPTS=-Xmx1g -XX:+UseG1GC -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
|
|
||||||
```
|
|
||||||
|
|
||||||
Laden Sie die Konfiguration:
|
|
||||||
```bash
|
|
||||||
docker-compose -f docker-compose-ping-test.yml --env-file .env.ping-test up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
### Debug-Modus aktivieren
|
|
||||||
|
|
||||||
1. **Debug-Modus starten:**
|
|
||||||
```bash
|
|
||||||
DEBUG=true docker-compose -f docker-compose-ping-test.yml up -d ping-service
|
|
||||||
```
|
|
||||||
|
|
||||||
2. **IDE mit Remote Debug verbinden:**
|
|
||||||
- Host: `localhost`
|
|
||||||
- Port: `5005`
|
|
||||||
- Typ: `Attach to remote JVM`
|
|
||||||
|
|
||||||
## Monitoring und Überwachung
|
|
||||||
|
|
||||||
### Prometheus Dashboard
|
|
||||||
- URL: http://localhost:9091
|
|
||||||
- Verfügbare Metriken:
|
|
||||||
- `http_server_requests_seconds`
|
|
||||||
- `jvm_memory_used_bytes`
|
|
||||||
- `resilience4j_circuitbreaker_state`
|
|
||||||
- Custom Application Metriken
|
|
||||||
|
|
||||||
### Consul Web UI
|
|
||||||
- URL: http://localhost:8501
|
|
||||||
- Zeigt registrierte Services
|
|
||||||
- Service Health Status
|
|
||||||
- Service Discovery Informationen
|
|
||||||
|
|
||||||
## Troubleshooting
|
|
||||||
|
|
||||||
### Häufige Probleme
|
|
||||||
|
|
||||||
#### 1. **Port-Konflikte**
|
|
||||||
```bash
|
|
||||||
# Prüfen Sie, welche Ports bereits verwendet werden
|
|
||||||
netstat -tlnp | grep -E ':(8082|5433|6380|8501|9091)'
|
|
||||||
|
|
||||||
# Oder mit ss
|
|
||||||
ss -tlnp | grep -E ':(8082|5433|6380|8501|9091)'
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 2. **Service startet nicht**
|
|
||||||
```bash
|
|
||||||
# Detaillierte Logs anzeigen
|
|
||||||
docker-compose -f docker-compose-ping-test.yml logs ping-service
|
|
||||||
|
|
||||||
# Container Status prüfen
|
|
||||||
docker inspect ping-test-service
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 3. **Consul Connection Probleme**
|
|
||||||
```bash
|
|
||||||
# Consul Logs prüfen
|
|
||||||
docker-compose -f docker-compose-ping-test.yml logs consul-test
|
|
||||||
|
|
||||||
# Consul Services anzeigen
|
|
||||||
curl http://localhost:8501/v1/agent/services
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 4. **Database Connection Issues**
|
|
||||||
```bash
|
|
||||||
# PostgreSQL Logs
|
|
||||||
docker-compose -f docker-compose-ping-test.yml logs postgres-test
|
|
||||||
|
|
||||||
# Direkte Verbindung testen
|
|
||||||
docker exec -it ping-test-postgres psql -U testuser -d pingtest
|
|
||||||
```
|
|
||||||
|
|
||||||
### Performance-Optimierung
|
|
||||||
|
|
||||||
#### 1. **Speicher-Limits setzen**
|
|
||||||
```yaml
|
|
||||||
# In docker-compose-ping-test.yml ergänzen:
|
|
||||||
services:
|
|
||||||
ping-service:
|
|
||||||
deploy:
|
|
||||||
resources:
|
|
||||||
limits:
|
|
||||||
memory: 1G
|
|
||||||
reservations:
|
|
||||||
memory: 512M
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 2. **Build-Cache nutzen**
|
|
||||||
```bash
|
|
||||||
# Build mit Cache
|
|
||||||
docker-compose -f docker-compose-ping-test.yml build --parallel
|
|
||||||
|
|
||||||
# Build ohne Cache (bei Problemen)
|
|
||||||
docker-compose -f docker-compose-ping-test.yml build --no-cache ping-service
|
|
||||||
```
|
|
||||||
|
|
||||||
## Test-Szenarien
|
|
||||||
|
|
||||||
### 1. **Circuit Breaker Tests**
|
|
||||||
```bash
|
|
||||||
# Circuit Breaker Status abrufen
|
|
||||||
curl http://localhost:8082/actuator/circuitbreakers
|
|
||||||
|
|
||||||
# Mehrfache Requests senden um Circuit Breaker zu testen
|
|
||||||
for i in {1..10}; do
|
|
||||||
curl -w "Response time: %{time_total}s\n" http://localhost:8082/actuator/health
|
|
||||||
sleep 1
|
|
||||||
done
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. **Load Testing**
|
|
||||||
```bash
|
|
||||||
# Mit Apache Bench (falls installiert)
|
|
||||||
ab -n 100 -c 10 http://localhost:8082/actuator/health
|
|
||||||
|
|
||||||
# Mit curl (einfacher Loop)
|
|
||||||
for i in {1..50}; do
|
|
||||||
curl -s http://localhost:8082/actuator/health > /dev/null &
|
|
||||||
done
|
|
||||||
wait
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. **Service Discovery Tests**
|
|
||||||
```bash
|
|
||||||
# Service Registration prüfen
|
|
||||||
curl http://localhost:8501/v1/agent/services | jq .
|
|
||||||
|
|
||||||
# Health Checks in Consul
|
|
||||||
curl http://localhost:8501/v1/health/service/ping-service | jq .
|
|
||||||
```
|
|
||||||
|
|
||||||
## Continuous Integration
|
|
||||||
|
|
||||||
### GitHub Actions Beispiel
|
|
||||||
```yaml
|
|
||||||
name: Ping Service Tests
|
|
||||||
on: [push, pull_request]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
test:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Start Test Environment
|
|
||||||
run: |
|
|
||||||
docker-compose -f docker-compose-ping-test.yml up -d
|
|
||||||
|
|
||||||
- name: Wait for Services
|
|
||||||
run: |
|
|
||||||
timeout 300 bash -c 'until curl -f http://localhost:8082/actuator/health; do sleep 5; done'
|
|
||||||
|
|
||||||
- name: Run Tests
|
|
||||||
run: |
|
|
||||||
docker-compose -f docker-compose-ping-test.yml --profile test up test-runner
|
|
||||||
|
|
||||||
- name: Cleanup
|
|
||||||
run: |
|
|
||||||
docker-compose -f docker-compose-ping-test.yml down -v
|
|
||||||
```
|
|
||||||
|
|
||||||
## Best Practices
|
|
||||||
|
|
||||||
### 1. **Vor dem Testen**
|
|
||||||
- Stellen Sie sicher, dass keine anderen Services auf den Test-Ports laufen
|
|
||||||
- Überprüfen Sie verfügbaren Speicher und CPU-Ressourcen
|
|
||||||
- Löschen Sie alte Test-Volumes bei Bedarf
|
|
||||||
|
|
||||||
### 2. **Während des Testens**
|
|
||||||
- Nutzen Sie die Health Check Endpoints
|
|
||||||
- Überwachen Sie Logs in Echtzeit
|
|
||||||
- Prüfen Sie Metriken in Prometheus
|
|
||||||
|
|
||||||
### 3. **Nach dem Testen**
|
|
||||||
- Stoppen und entfernen Sie Test-Container
|
|
||||||
- Löschen Sie Test-Volumes um Speicher zu sparen
|
|
||||||
- Dokumentieren Sie gefundene Issues
|
|
||||||
|
|
||||||
## Erweiterungen
|
|
||||||
|
|
||||||
### Zusätzliche Services hinzufügen
|
|
||||||
Um weitere Services zu testen, erweitern Sie die `docker-compose-ping-test.yml`:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
services:
|
|
||||||
another-service:
|
|
||||||
build:
|
|
||||||
context: .
|
|
||||||
dockerfile: path/to/Dockerfile
|
|
||||||
depends_on:
|
|
||||||
- ping-service
|
|
||||||
networks:
|
|
||||||
- ping-test-network
|
|
||||||
```
|
|
||||||
|
|
||||||
### Grafana für erweiterte Visualisierung
|
|
||||||
```yaml
|
|
||||||
services:
|
|
||||||
grafana-test:
|
|
||||||
image: grafana/grafana:latest
|
|
||||||
ports:
|
|
||||||
- "3001:3000"
|
|
||||||
environment:
|
|
||||||
- GF_SECURITY_ADMIN_PASSWORD=admin
|
|
||||||
networks:
|
|
||||||
- ping-test-network
|
|
||||||
```
|
|
||||||
|
|
||||||
## Support
|
|
||||||
|
|
||||||
Bei Problemen oder Fragen:
|
|
||||||
1. Prüfen Sie die Logs: `docker-compose -f docker-compose-ping-test.yml logs`
|
|
||||||
2. Überprüfen Sie die Container-Status: `docker-compose -f docker-compose-ping-test.yml ps`
|
|
||||||
3. Konsultieren Sie die Hauptdokumentation in `README.md`
|
|
||||||
4. Überprüfen Sie die Service-spezifische Konfiguration in `temp/ping-service/src/main/resources/application.yml`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Erstellt für**: Meldestelle Projekt - Ping Service Trace-Bullet Testing
|
|
||||||
**Version**: 1.0.0
|
|
||||||
**Datum**: 2025-09-08
|
|
||||||
@@ -84,7 +84,10 @@ fun App() {
|
|||||||
coroutineScope.launch {
|
coroutineScope.launch {
|
||||||
pingState = PingState.Loading
|
pingState = PingState.Loading
|
||||||
try {
|
try {
|
||||||
val response: PingResponse = httpClient.get("http://localhost:8082/ping").body()
|
// Direkter Aufruf des Ping-Service
|
||||||
|
//val response: PingResponse = httpClient.get("http://localhost:8082/ping").body()
|
||||||
|
// NEU: Aufruf über das Gateway
|
||||||
|
val response: PingResponse = httpClient.get("http://localhost:8081/api/ping").body()
|
||||||
pingState = PingState.Success(response)
|
pingState = PingState.Success(response)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
pingState = PingState.Error(e.message ?: "Unknown error occurred")
|
pingState = PingState.Error(e.message ?: "Unknown error occurred")
|
||||||
@@ -136,6 +139,7 @@ fun App() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
is PingState.Error -> {
|
is PingState.Error -> {
|
||||||
Card(
|
Card(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
@@ -158,6 +162,7 @@ fun App() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
else -> {
|
else -> {
|
||||||
// Idle or Loading state - no additional display needed
|
// Idle or Loading state - no additional display needed
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ services:
|
|||||||
environment:
|
environment:
|
||||||
SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE:-dev}
|
SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE:-dev}
|
||||||
SERVER_PORT: ${AUTH_SERVICE_PORT:-8087}
|
SERVER_PORT: ${AUTH_SERVICE_PORT:-8087}
|
||||||
KEYCLOAK_SERVER_URL: http://keycloak:8081
|
KEYCLOAK_SERVER_URL: http://keycloak:8080
|
||||||
KEYCLOAK_REALM: meldestelle
|
KEYCLOAK_REALM: meldestelle
|
||||||
KEYCLOAK_CLIENT_ID: meldestelle-auth-service
|
KEYCLOAK_CLIENT_ID: meldestelle-auth-service
|
||||||
KEYCLOAK_CLIENT_SECRET: ${KEYCLOAK_CLIENT_SECRET:-auth-service-secret}
|
KEYCLOAK_CLIENT_SECRET: ${KEYCLOAK_CLIENT_SECRET:-auth-service-secret}
|
||||||
@@ -174,4 +174,4 @@ volumes:
|
|||||||
# ===================================================================
|
# ===================================================================
|
||||||
networks:
|
networks:
|
||||||
meldestelle-network:
|
meldestelle-network:
|
||||||
external: false
|
external: true
|
||||||
|
|||||||
+2
-43
@@ -67,7 +67,7 @@ services:
|
|||||||
KC_DB_USERNAME: ${POSTGRES_USER:-meldestelle}
|
KC_DB_USERNAME: ${POSTGRES_USER:-meldestelle}
|
||||||
KC_DB_PASSWORD: ${POSTGRES_PASSWORD:-meldestelle}
|
KC_DB_PASSWORD: ${POSTGRES_PASSWORD:-meldestelle}
|
||||||
ports:
|
ports:
|
||||||
- "8180:8081"
|
- "8180:8080"
|
||||||
depends_on:
|
depends_on:
|
||||||
postgres:
|
postgres:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
@@ -77,7 +77,7 @@ services:
|
|||||||
networks:
|
networks:
|
||||||
- meldestelle-network
|
- meldestelle-network
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: [ "CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:8081/" ]
|
test: [ "CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:8080/" ]
|
||||||
interval: 10s
|
interval: 10s
|
||||||
timeout: 5s
|
timeout: 5s
|
||||||
retries: 3
|
retries: 3
|
||||||
@@ -235,47 +235,6 @@ services:
|
|||||||
start_period: 30s
|
start_period: 30s
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
|
||||||
# ===================================================================
|
|
||||||
# Ping Service (Health Check & Test Service)
|
|
||||||
# ===================================================================
|
|
||||||
ping-service:
|
|
||||||
build:
|
|
||||||
context: .
|
|
||||||
dockerfile: dockerfiles/services/ping-service/Dockerfile
|
|
||||||
container_name: meldestelle-ping-service
|
|
||||||
environment:
|
|
||||||
SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE:-dev}
|
|
||||||
SERVER_PORT: ${PING_SERVICE_PORT:-8082}
|
|
||||||
CONSUL_HOST: consul
|
|
||||||
CONSUL_PORT: ${CONSUL_PORT:-8500}
|
|
||||||
CONSUL_ENABLED: true
|
|
||||||
DB_HOST: postgres
|
|
||||||
DB_PORT: 5432
|
|
||||||
DB_NAME: ${POSTGRES_DB:-meldestelle}
|
|
||||||
DB_USER: ${POSTGRES_USER:-meldestelle}
|
|
||||||
DB_PASSWORD: ${POSTGRES_PASSWORD:-meldestelle}
|
|
||||||
REDIS_EVENT_STORE_HOST: redis
|
|
||||||
REDIS_EVENT_STORE_PORT: 6379
|
|
||||||
REDIS_EVENT_STORE_PASSWORD: ${REDIS_PASSWORD:-}
|
|
||||||
ports:
|
|
||||||
- "${PING_SERVICE_PORT:-8082}:${PING_SERVICE_PORT:-8082}"
|
|
||||||
depends_on:
|
|
||||||
consul:
|
|
||||||
condition: service_healthy
|
|
||||||
postgres:
|
|
||||||
condition: service_healthy
|
|
||||||
redis:
|
|
||||||
condition: service_healthy
|
|
||||||
networks:
|
|
||||||
- meldestelle-network
|
|
||||||
healthcheck:
|
|
||||||
test: ["CMD", "curl", "--fail", "http://localhost:${PING_SERVICE_PORT:-8082}/actuator/health"]
|
|
||||||
interval: 15s
|
|
||||||
timeout: 5s
|
|
||||||
retries: 3
|
|
||||||
start_period: 30s
|
|
||||||
restart: unless-stopped
|
|
||||||
|
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
# Volumes
|
# Volumes
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
|
|||||||
@@ -18,6 +18,10 @@ TIMEOUT_SECONDS=300
|
|||||||
HEALTH_CHECK_INTERVAL=10
|
HEALTH_CHECK_INTERVAL=10
|
||||||
MAX_RETRIES=30
|
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
|
# Logging functions
|
||||||
log_info() {
|
log_info() {
|
||||||
echo -e "${BLUE}[INFO]${NC} $1"
|
echo -e "${BLUE}[INFO]${NC} $1"
|
||||||
@@ -45,7 +49,9 @@ wait_for_health_check() {
|
|||||||
log_info "Waiting for $service_name health check at $health_url"
|
log_info "Waiting for $service_name health check at $health_url"
|
||||||
|
|
||||||
while [ $attempt -le $max_attempts ]; do
|
while [ $attempt -le $max_attempts ]; do
|
||||||
if curl -f -s --max-time 5 "$health_url" > /dev/null 2>&1; then
|
# 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)"
|
log_success "$service_name is healthy (attempt $attempt/$max_attempts)"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
@@ -79,83 +85,34 @@ check_service_logs() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Function to test infrastructure services
|
# Function to test infrastructure services
|
||||||
test_infrastructure_services() {
|
test_all_services() {
|
||||||
log_info "========================================="
|
log_info "========================================="
|
||||||
log_info "Testing Infrastructure Services"
|
log_info "Starting All Meldestelle Services"
|
||||||
log_info "========================================="
|
log_info "========================================="
|
||||||
|
|
||||||
# Start infrastructure services
|
# Start ALL services using all compose files
|
||||||
log_info "Starting infrastructure services..."
|
log_info "Starting full environment with docker-compose..."
|
||||||
# Use docker directly since docker-compose has system issues
|
# ALT: docker compose up -d
|
||||||
log_info "Note: Using docker run directly due to docker-compose system issues"
|
docker compose $COMPOSE_FILES up -d
|
||||||
|
|
||||||
# Create network if it doesn't exist
|
|
||||||
docker network create meldestelle-network 2>/dev/null || true
|
|
||||||
|
|
||||||
# Start PostgreSQL
|
|
||||||
docker run -d --name meldestelle-postgres \
|
|
||||||
--network meldestelle-network \
|
|
||||||
-e POSTGRES_USER=meldestelle \
|
|
||||||
-e POSTGRES_PASSWORD=meldestelle \
|
|
||||||
-e POSTGRES_DB=meldestelle \
|
|
||||||
-p 5432:5432 \
|
|
||||||
postgres:16-alpine 2>/dev/null || log_info "PostgreSQL container already exists"
|
|
||||||
|
|
||||||
# Start Redis
|
|
||||||
docker run -d --name meldestelle-redis \
|
|
||||||
--network meldestelle-network \
|
|
||||||
-p 6379:6379 \
|
|
||||||
redis:7-alpine redis-server --appendonly yes 2>/dev/null || log_info "Redis container already exists"
|
|
||||||
|
|
||||||
# Start Consul
|
|
||||||
docker run -d --name meldestelle-consul \
|
|
||||||
--network meldestelle-network \
|
|
||||||
-p 8500:8500 \
|
|
||||||
hashicorp/consul:1.15 agent -server -ui -node=server-1 -bootstrap-expect=1 -client=0.0.0.0 2>/dev/null || log_info "Consul container already exists"
|
|
||||||
|
|
||||||
# Start Prometheus
|
|
||||||
docker run -d --name meldestelle-prometheus \
|
|
||||||
--network meldestelle-network \
|
|
||||||
-p 9090:9090 \
|
|
||||||
prom/prometheus:v2.47.0 \
|
|
||||||
--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=200h \
|
|
||||||
--web.enable-lifecycle 2>/dev/null || log_info "Prometheus container already exists"
|
|
||||||
|
|
||||||
# Start Grafana
|
|
||||||
docker run -d --name meldestelle-grafana \
|
|
||||||
--network meldestelle-network \
|
|
||||||
-p 3000:3000 \
|
|
||||||
-e GF_SECURITY_ADMIN_USER=admin \
|
|
||||||
-e GF_SECURITY_ADMIN_PASSWORD=admin \
|
|
||||||
grafana/grafana:10.1.0 2>/dev/null || log_info "Grafana container already exists"
|
|
||||||
|
|
||||||
# Start Keycloak
|
|
||||||
docker run -d --name meldestelle-keycloak \
|
|
||||||
--network meldestelle-network \
|
|
||||||
-p 8180:8080 \
|
|
||||||
-e KEYCLOAK_ADMIN=admin \
|
|
||||||
-e KEYCLOAK_ADMIN_PASSWORD=admin \
|
|
||||||
quay.io/keycloak/keycloak:23.0 start-dev 2>/dev/null || log_info "Keycloak container already exists"
|
|
||||||
|
|
||||||
# Give services time to initialize
|
# Give services time to initialize
|
||||||
log_info "Waiting 30 seconds for services to initialize..."
|
log_info "Waiting 45 seconds for services to initialize..."
|
||||||
sleep 30
|
sleep 45
|
||||||
|
|
||||||
# Wait for services to be ready
|
# =========================================
|
||||||
local services=(
|
# CHECK INFRASTRUCTURE
|
||||||
|
# =========================================
|
||||||
|
log_info "--- Checking Infrastructure Services ---"
|
||||||
|
local infra_services=(
|
||||||
"postgres:http://localhost:5432:PostgreSQL"
|
"postgres:http://localhost:5432:PostgreSQL"
|
||||||
"redis:redis://localhost:6379:Redis"
|
"redis:redis://localhost:6379:Redis"
|
||||||
"consul:http://localhost:8500/v1/status/leader:Consul"
|
"consul:http://localhost:8500/v1/status/leader:Consul"
|
||||||
"prometheus:http://localhost:9090/-/healthy:Prometheus"
|
"prometheus:http://localhost:9090/-/healthy:Prometheus"
|
||||||
"grafana:http://localhost:3000/api/health:Grafana"
|
"grafana:http://localhost:3000/api/health:Grafana"
|
||||||
"keycloak:http://localhost:8180/health/ready:Keycloak"
|
"keycloak:http://localhost:8180/:Keycloak"
|
||||||
)
|
)
|
||||||
|
|
||||||
for service_info in "${services[@]}"; do
|
for service_info in "${infra_services[@]}"; do
|
||||||
# Parse service info: service_name:health_url:description
|
# Parse service info: service_name:health_url:description
|
||||||
# Extract service name (everything before first colon)
|
# Extract service name (everything before first colon)
|
||||||
service_name=$(echo "$service_info" | cut -d':' -f1)
|
service_name=$(echo "$service_info" | cut -d':' -f1)
|
||||||
@@ -188,95 +145,58 @@ test_infrastructure_services() {
|
|||||||
else
|
else
|
||||||
wait_for_health_check "$description" "$health_url" $MAX_RETRIES || return 1
|
wait_for_health_check "$description" "$health_url" $MAX_RETRIES || return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
check_service_logs "$description" "meldestelle-$service_name"
|
check_service_logs "$description" "meldestelle-$service_name"
|
||||||
done
|
done
|
||||||
|
|
||||||
log_success "All infrastructure services are healthy!"
|
log_success "All infrastructure services are healthy!"
|
||||||
}
|
|
||||||
|
|
||||||
# Function to test API Gateway
|
# =========================================
|
||||||
test_api_gateway() {
|
# CHECK API GATEWAY
|
||||||
log_info "========================================="
|
# =========================================
|
||||||
log_info "Testing API Gateway"
|
log_info "--- Checking API Gateway ---"
|
||||||
log_info "========================================="
|
|
||||||
|
|
||||||
# Start API Gateway
|
|
||||||
log_info "Starting API Gateway..."
|
|
||||||
docker-compose up -d api-gateway
|
|
||||||
|
|
||||||
# Wait for API Gateway to be ready
|
|
||||||
wait_for_health_check "API Gateway" "http://localhost:8081/actuator/health" $MAX_RETRIES || return 1
|
wait_for_health_check "API Gateway" "http://localhost:8081/actuator/health" $MAX_RETRIES || return 1
|
||||||
|
|
||||||
# Check specific actuator endpoints
|
|
||||||
local endpoints=("health" "info" "metrics")
|
|
||||||
for endpoint in "${endpoints[@]}"; do
|
|
||||||
local url="http://localhost:8081/actuator/$endpoint"
|
|
||||||
if curl -f -s --max-time 5 "$url" > /dev/null 2>&1; then
|
|
||||||
log_success "API Gateway $endpoint endpoint is accessible"
|
|
||||||
else
|
|
||||||
log_warning "API Gateway $endpoint endpoint is not accessible at $url"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
check_service_logs "API Gateway" "meldestelle-api-gateway"
|
check_service_logs "API Gateway" "meldestelle-api-gateway"
|
||||||
log_success "API Gateway is healthy!"
|
log_success "API Gateway is healthy!"
|
||||||
}
|
|
||||||
|
|
||||||
# Function to test application services
|
# =========================================
|
||||||
test_application_services() {
|
# CHECK APPLICATION SERVICES
|
||||||
log_info "========================================="
|
# =========================================
|
||||||
log_info "Testing Application Services"
|
log_info "--- Checking Application Services ---"
|
||||||
log_info "========================================="
|
|
||||||
|
|
||||||
# Start application services
|
|
||||||
log_info "Starting application services..."
|
|
||||||
docker-compose -f docker-compose.yml -f docker-compose.services.yml up -d
|
|
||||||
|
|
||||||
# Define application services with their health check URLs
|
|
||||||
local app_services=(
|
local app_services=(
|
||||||
"ping-service:http://localhost:8082/actuator/health:Ping Service"
|
"ping-service:http://localhost:8082/actuator/health:Ping Service"
|
||||||
"members-service:http://localhost:8083/actuator/health:Members Service"
|
|
||||||
"horses-service:http://localhost:8084/actuator/health:Horses Service"
|
|
||||||
"events-service:http://localhost:8085/actuator/health:Events Service"
|
|
||||||
"masterdata-service:http://localhost:8086/actuator/health:Masterdata Service"
|
|
||||||
)
|
)
|
||||||
|
# Note: Add other services like members-service here when they are enabled
|
||||||
|
|
||||||
for service_info in "${app_services[@]}"; do
|
for service_info in "${app_services[@]}"; do
|
||||||
IFS=':' read -r service_name health_url description <<< "$service_info"
|
IFS=':' read -r service_name health_url description <<< "$service_info"
|
||||||
wait_for_health_check "$description" "$health_url" $MAX_RETRIES || return 1
|
wait_for_health_check "$description" "$health_url" $MAX_RETRIES || return 1
|
||||||
check_service_logs "$description" "meldestelle-$service_name"
|
check_service_logs "$description" "meldestelle-$service_name"
|
||||||
done
|
done
|
||||||
|
|
||||||
log_success "All application services are healthy!"
|
log_success "All application services are healthy!"
|
||||||
}
|
|
||||||
|
|
||||||
# Function to test client services
|
# =========================================
|
||||||
test_client_services() {
|
# CHECK CLIENT SERVICES
|
||||||
log_info "========================================="
|
# =========================================
|
||||||
log_info "Testing Client Services"
|
log_info "--- Checking Client Services ---"
|
||||||
log_info "========================================="
|
|
||||||
|
|
||||||
# Start client services
|
|
||||||
log_info "Starting client services..."
|
|
||||||
docker-compose -f docker-compose.yml -f docker-compose.services.yml -f docker-compose.clients.yml up -d
|
|
||||||
|
|
||||||
# Define client services with their health check URLs
|
|
||||||
local client_services=(
|
local client_services=(
|
||||||
"web-app:http://localhost:3000/health:Web Application"
|
"web-app:http://localhost:4000/health:Web Application"
|
||||||
"auth-server:http://localhost:8087/actuator/health:Auth Server"
|
"auth-server:http://localhost:8087/actuator/health:Auth Server"
|
||||||
"monitoring-server:http://localhost:8088/actuator/health:Monitoring Server"
|
|
||||||
)
|
)
|
||||||
|
# Note: Add other client services here when enabled
|
||||||
|
|
||||||
for service_info in "${client_services[@]}"; do
|
for service_info in "${client_services[@]}"; do
|
||||||
IFS=':' read -r service_name health_url description <<< "$service_info"
|
# ... (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
|
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"
|
check_service_logs "$description" "meldestelle-$service_name"
|
||||||
done
|
done
|
||||||
|
|
||||||
log_success "All client services are healthy!"
|
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
|
# Function to test network connectivity
|
||||||
test_network_connectivity() {
|
test_network_connectivity() {
|
||||||
log_info "========================================="
|
log_info "========================================="
|
||||||
@@ -328,18 +248,21 @@ cleanup() {
|
|||||||
log_info "Cleaning up test environment"
|
log_info "Cleaning up test environment"
|
||||||
log_info "========================================="
|
log_info "========================================="
|
||||||
|
|
||||||
log_info "Stopping and removing test containers..."
|
log_info "Stopping and removing all test containers..."
|
||||||
|
|
||||||
# Stop and remove containers if they exist
|
# Use the same files to tear down the environment
|
||||||
local containers=("meldestelle-postgres" "meldestelle-redis" "meldestelle-consul" "meldestelle-prometheus" "meldestelle-grafana" "meldestelle-keycloak" "meldestelle-api-gateway")
|
docker compose $COMPOSE_FILES down --remove-orphans -v
|
||||||
|
|
||||||
for container in "${containers[@]}"; do
|
# # Stop and remove containers if they exist
|
||||||
if docker ps -a --format '{{.Names}}' | grep -q "^${container}$"; then
|
# local containers=("meldestelle-postgres" "meldestelle-redis" "meldestelle-consul" "meldestelle-prometheus" "meldestelle-grafana" "meldestelle-keycloak" "meldestelle-api-gateway")
|
||||||
log_info "Stopping and removing $container"
|
#
|
||||||
docker stop "$container" >/dev/null 2>&1 || true
|
# for container in "${containers[@]}"; do
|
||||||
docker rm "$container" >/dev/null 2>&1 || true
|
# if docker ps -a --format '{{.Names}}' | grep -q "^${container}$"; then
|
||||||
fi
|
# log_info "Stopping and removing $container"
|
||||||
done
|
# docker stop "$container" >/dev/null 2>&1 || true
|
||||||
|
# docker rm "$container" >/dev/null 2>&1 || true
|
||||||
|
# fi
|
||||||
|
# done
|
||||||
|
|
||||||
# Remove network if it exists
|
# Remove network if it exists
|
||||||
docker network rm meldestelle-network >/dev/null 2>&1 || true
|
docker network rm meldestelle-network >/dev/null 2>&1 || true
|
||||||
@@ -357,10 +280,7 @@ main() {
|
|||||||
trap cleanup EXIT
|
trap cleanup EXIT
|
||||||
|
|
||||||
# Run tests in sequence
|
# Run tests in sequence
|
||||||
test_infrastructure_services || exit 1
|
test_all_services || exit 1
|
||||||
test_api_gateway || exit 1
|
|
||||||
test_application_services || exit 1
|
|
||||||
test_client_services || exit 1
|
|
||||||
test_network_connectivity || exit 1
|
test_network_connectivity || exit 1
|
||||||
|
|
||||||
# Generate report
|
# Generate report
|
||||||
@@ -374,17 +294,8 @@ main() {
|
|||||||
|
|
||||||
# Parse command line arguments
|
# Parse command line arguments
|
||||||
case "${1:-}" in
|
case "${1:-}" in
|
||||||
"infrastructure")
|
"all")
|
||||||
test_infrastructure_services
|
test_all_services
|
||||||
;;
|
|
||||||
"gateway")
|
|
||||||
test_api_gateway
|
|
||||||
;;
|
|
||||||
"services")
|
|
||||||
test_application_services
|
|
||||||
;;
|
|
||||||
"clients")
|
|
||||||
test_client_services
|
|
||||||
;;
|
;;
|
||||||
"network")
|
"network")
|
||||||
test_network_connectivity
|
test_network_connectivity
|
||||||
@@ -22,7 +22,7 @@ source "$SCRIPT_DIR/../utils/common.sh" || {
|
|||||||
|
|
||||||
readonly GATEWAY_MODULE="infrastructure:gateway"
|
readonly GATEWAY_MODULE="infrastructure:gateway"
|
||||||
readonly GATEWAY_JAR="infrastructure/gateway/build/libs/gateway-1.0.0.jar"
|
readonly GATEWAY_JAR="infrastructure/gateway/build/libs/gateway-1.0.0.jar"
|
||||||
readonly GATEWAY_PORT="${GATEWAY_PORT:-8080}"
|
readonly GATEWAY_PORT="${GATEWAY_PORT:-8081}"
|
||||||
readonly GATEWAY_HOST="${GATEWAY_HOST:-localhost}"
|
readonly GATEWAY_HOST="${GATEWAY_HOST:-localhost}"
|
||||||
readonly GATEWAY_BASE_URL="http://${GATEWAY_HOST}:${GATEWAY_PORT}"
|
readonly GATEWAY_BASE_URL="http://${GATEWAY_HOST}:${GATEWAY_PORT}"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user