refactoring

This commit is contained in:
2025-09-14 19:47:08 +02:00
parent 143ac7ba3e
commit f256d42d97
15 changed files with 1305 additions and 384 deletions
+9 -9
View File
@@ -13,16 +13,9 @@
.ONESHELL: .ONESHELL:
# Choose docker compose CLI (prefers new plugin) # Modern Docker Compose CLI (plugin-based)
DOCKER_COMPOSE_PLUGIN := $(shell docker compose version >/dev/null 2>&1 && echo 1 || echo 0) # Defaults to 'docker compose' as the legacy standalone tool is deprecated
DOCKER_COMPOSE_LEGACY := $(shell command -v docker-compose >/dev/null 2>&1 && echo 1 || echo 0)
ifeq ($(DOCKER_COMPOSE_PLUGIN),1)
COMPOSE = docker compose COMPOSE = docker compose
else ifeq ($(DOCKER_COMPOSE_LEGACY),1)
COMPOSE = docker-compose
else
COMPOSE = docker compose
endif
# Default target # Default target
.DEFAULT_GOAL := help .DEFAULT_GOAL := help
@@ -190,6 +183,13 @@ env-test: ## Switch to test environment
@echo "✅ Test environment activated (.env -> config/.env.test)" @echo "✅ Test environment activated (.env -> config/.env.test)"
@echo "Optimized for automated testing with alternative ports" @echo "Optimized for automated testing with alternative ports"
validate: ## Validate Docker Compose configuration and environment
@echo "🔍 Validating configuration..."
@if [ ! -f .env ]; then echo "❌ No .env file found! Run 'make env-dev' first."; exit 1; fi
@echo "✅ Environment file exists"
@$(COMPOSE) config --quiet && echo "✅ Docker Compose configuration is valid" || echo "❌ Docker Compose configuration has errors"
@echo "✅ Validation completed"
# =================================================================== # ===================================================================
# Production Commands # Production Commands
# =================================================================== # ===================================================================
+4 -4
View File
@@ -61,12 +61,12 @@ Die folgenden Services sind vollständig konfiguriert:
2. **Services starten:** 2. **Services starten:**
```bash ```bash
docker-compose up -d docker compose up -d
``` ```
3. **Services überprüfen:** 3. **Services überprüfen:**
```bash ```bash
docker-compose ps docker compose ps
``` ```
### Anpassungen ### Anpassungen
@@ -92,8 +92,8 @@ Vollständige Dokumentation finden Sie in:
Bei Problemen: Bei Problemen:
1. Überprüfen Sie die aktive Umgebungskonfiguration: `ls -la .env` 1. Überprüfen Sie die aktive Umgebungskonfiguration: `ls -la .env`
2. Validieren Sie die Docker-Compose-Konfiguration: `docker-compose config` 2. Validieren Sie die Docker-Compose-Konfiguration: `docker compose config`
3. Überprüfen Sie die Service-Logs: `docker-compose logs -f` 3. Überprüfen Sie die Service-Logs: `docker compose logs -f`
4. Konsultieren Sie `config/README.md` für detaillierte Konfigurationsrichtlinien 4. Konsultieren Sie `config/README.md` für detaillierte Konfigurationsrichtlinien
## Nächste Schritte ## Nächste Schritte
+18 -18
View File
@@ -134,13 +134,13 @@ PROMETHEUS_HOSTNAME=metrics.ihredomain.com
```bash ```bash
# Produktionsumgebung starten # Produktionsumgebung starten
docker-compose -f docker-compose.prod.yml --env-file .env.prod up -d docker compose -f docker-compose.prod.yml --env-file .env.prod up -d
# Status überprüfen # Status überprüfen
docker-compose -f docker-compose.prod.yml ps docker compose -f docker-compose.prod.yml ps
# Logs überwachen # Logs überwachen
docker-compose -f docker-compose.prod.yml logs -f docker compose -f docker-compose.prod.yml logs -f
``` ```
## 🔧 Konfiguration ## 🔧 Konfiguration
@@ -230,10 +230,10 @@ Standard-Dashboards für:
```bash ```bash
# Service-Logs anzeigen # Service-Logs anzeigen
docker-compose -f docker-compose.prod.yml logs [service-name] docker compose -f docker-compose.prod.yml logs [service-name]
# Logs in Echtzeit verfolgen # Logs in Echtzeit verfolgen
docker-compose -f docker-compose.prod.yml logs -f [service-name] docker compose -f docker-compose.prod.yml logs -f [service-name]
# Log-Rotation konfigurieren # Log-Rotation konfigurieren
# Fügen Sie zu /etc/docker/daemon.json hinzu: # Fügen Sie zu /etc/docker/daemon.json hinzu:
@@ -277,7 +277,7 @@ docker-compose -f docker-compose.prod.yml logs -f [service-name]
cat > backup-db.sh << 'EOF' cat > backup-db.sh << 'EOF'
#!/bin/bash #!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S) DATE=$(date +%Y%m%d_%H%M%S)
docker-compose -f docker-compose.prod.yml exec -T postgres \ docker compose -f docker-compose.prod.yml exec -T postgres \
pg_dump -U meldestelle_prod meldestelle_prod | \ pg_dump -U meldestelle_prod meldestelle_prod | \
gzip > backups/db_backup_$DATE.sql.gz gzip > backups/db_backup_$DATE.sql.gz
find backups/ -name "db_backup_*.sql.gz" -mtime +30 -delete find backups/ -name "db_backup_*.sql.gz" -mtime +30 -delete
@@ -293,11 +293,11 @@ echo "0 2 * * * /path/to/backup-db.sh" | crontab -
```bash ```bash
# Redis-Daten sichern # Redis-Daten sichern
docker-compose -f docker-compose.prod.yml exec redis \ docker compose -f docker-compose.prod.yml exec redis \
redis-cli --rdb /data/backup.rdb redis-cli --rdb /data/backup.rdb
# Backup kopieren # Backup kopieren
docker cp $(docker-compose -f docker-compose.prod.yml ps -q redis):/data/backup.rdb \ docker cp $(docker compose -f docker-compose.prod.yml ps -q redis):/data/backup.rdb \
backups/redis_backup_$(date +%Y%m%d_%H%M%S).rdb backups/redis_backup_$(date +%Y%m%d_%H%M%S).rdb
``` ```
@@ -306,14 +306,14 @@ docker cp $(docker-compose -f docker-compose.prod.yml ps -q redis):/data/backup.
```bash ```bash
# Datenbank wiederherstellen # Datenbank wiederherstellen
gunzip -c backups/db_backup_YYYYMMDD_HHMMSS.sql.gz | \ gunzip -c backups/db_backup_YYYYMMDD_HHMMSS.sql.gz | \
docker-compose -f docker-compose.prod.yml exec -T postgres \ docker compose -f docker-compose.prod.yml exec -T postgres \
psql -U meldestelle_prod -d meldestelle_prod psql -U meldestelle_prod -d meldestelle_prod
# Redis wiederherstellen # Redis wiederherstellen
docker-compose -f docker-compose.prod.yml stop redis docker compose -f docker-compose.prod.yml stop redis
docker cp backups/redis_backup_YYYYMMDD_HHMMSS.rdb \ docker cp backups/redis_backup_YYYYMMDD_HHMMSS.rdb \
$(docker-compose -f docker-compose.prod.yml ps -q redis):/data/dump.rdb $(docker compose -f docker-compose.prod.yml ps -q redis):/data/dump.rdb
docker-compose -f docker-compose.prod.yml start redis docker compose -f docker-compose.prod.yml start redis
``` ```
## 🔄 Updates und Wartung ## 🔄 Updates und Wartung
@@ -322,23 +322,23 @@ docker-compose -f docker-compose.prod.yml start redis
```bash ```bash
# Service einzeln aktualisieren # Service einzeln aktualisieren
docker-compose -f docker-compose.prod.yml pull [service-name] docker compose -f docker-compose.prod.yml pull [service-name]
docker-compose -f docker-compose.prod.yml up -d --no-deps [service-name] docker compose -f docker-compose.prod.yml up -d --no-deps [service-name]
# Alle Services aktualisieren # Alle Services aktualisieren
docker-compose -f docker-compose.prod.yml pull docker compose -f docker-compose.prod.yml pull
docker-compose -f docker-compose.prod.yml up -d docker compose -f docker-compose.prod.yml up -d
``` ```
### Wartungsmodus ### Wartungsmodus
```bash ```bash
# Wartungsseite aktivieren # Wartungsseite aktivieren
docker-compose -f docker-compose.prod.yml stop nginx docker compose -f docker-compose.prod.yml stop nginx
# Wartungs-Nginx Container starten (mit Wartungsseite) # Wartungs-Nginx Container starten (mit Wartungsseite)
# Nach Wartung: Normalen Betrieb wiederherstellen # Nach Wartung: Normalen Betrieb wiederherstellen
docker-compose -f docker-compose.prod.yml start nginx docker compose -f docker-compose.prod.yml start nginx
``` ```
## 🚨 Troubleshooting ## 🚨 Troubleshooting
+32 -32
View File
@@ -9,9 +9,9 @@ Das Projekt wurde kürzlich auf eine modulare Architektur migriert, um die Wartb
## Systemanforderungen ## Systemanforderungen
- Java 21 - Java 21
- Kotlin 2.1.21 - Kotlin 2.2.10
- Gradle 8.14 - Gradle 8.11+ (automatischer Download über Gradle Wrapper)
- Docker und Docker Compose - Docker und Docker Compose (v2.0+)
## Infrastruktur ## Infrastruktur
@@ -90,13 +90,13 @@ Das System bietet verschiedene Docker-Konfigurationen für unterschiedliche Umge
```bash ```bash
# Infrastruktur starten # Infrastruktur starten
docker-compose up -d docker compose up -d
# Status überprüfen # Status überprüfen
docker-compose ps docker compose ps
# Logs anzeigen # Logs anzeigen
docker-compose logs -f docker compose logs -f
``` ```
Dies startet alle erforderlichen Dienste wie PostgreSQL, Redis, Keycloak, Kafka, Zipkin und optional Prometheus und Grafana. Dies startet alle erforderlichen Dienste wie PostgreSQL, Redis, Keycloak, Kafka, Zipkin und optional Prometheus und Grafana.
@@ -203,14 +203,14 @@ Es gibt noch einige offene Probleme, insbesondere bei den Client-Modulen, die Ko
#### 1. Services starten nicht #### 1. Services starten nicht
```bash ```bash
# Alle Services stoppen und neu starten # Alle Services stoppen und neu starten
docker-compose down docker compose down
docker-compose up -d docker compose up -d
# Einzelnen Service neu starten # Einzelnen Service neu starten
docker-compose restart [service-name] docker compose restart [service-name]
# Service-Logs überprüfen # Service-Logs überprüfen
docker-compose logs [service-name] docker compose logs [service-name]
``` ```
#### 2. Port bereits belegt #### 2. Port bereits belegt
@@ -228,39 +228,39 @@ nano .env
#### 3. Datenbank-Verbindungsfehler #### 3. Datenbank-Verbindungsfehler
```bash ```bash
# PostgreSQL-Status prüfen # PostgreSQL-Status prüfen
docker-compose exec postgres pg_isready -U meldestelle docker compose exec postgres pg_isready -U meldestelle
# Datenbank-Logs anzeigen # Datenbank-Logs anzeigen
docker-compose logs postgres docker compose logs postgres
# Verbindung manuell testen # Verbindung manuell testen
docker-compose exec postgres psql -U meldestelle -d meldestelle docker compose exec postgres psql -U meldestelle -d meldestelle
``` ```
#### 4. Keycloak-Authentifizierung fehlgeschlagen #### 4. Keycloak-Authentifizierung fehlgeschlagen
```bash ```bash
# Keycloak-Status prüfen # Keycloak-Status prüfen
docker-compose logs keycloak docker compose logs keycloak
# Keycloak Admin-Console öffnen # Keycloak Admin-Console öffnen
# http://localhost:8180/admin (admin/admin) # http://localhost:8180/admin (admin/admin)
# Keycloak-Datenbank zurücksetzen # Keycloak-Datenbank zurücksetzen
docker-compose down docker compose down
docker volume rm meldestelle_postgres-data docker volume rm meldestelle_postgres-data
docker-compose up -d docker compose up -d
``` ```
#### 5. Kafka-Verbindungsprobleme #### 5. Kafka-Verbindungsprobleme
```bash ```bash
# Kafka-Status prüfen # Kafka-Status prüfen
docker-compose exec kafka kafka-topics --bootstrap-server localhost:9092 --list docker compose exec kafka kafka-topics --bootstrap-server localhost:9092 --list
# Zookeeper-Status prüfen # Zookeeper-Status prüfen
docker-compose exec zookeeper nc -z localhost 2181 docker compose exec zookeeper nc -z localhost 2181
# Kafka-Logs anzeigen # Kafka-Logs anzeigen
docker-compose logs kafka zookeeper docker compose logs kafka zookeeper
``` ```
#### 6. Speicherplatz-Probleme #### 6. Speicherplatz-Probleme
@@ -292,39 +292,39 @@ docker stats
```bash ```bash
# Alle Services mit Logs starten # Alle Services mit Logs starten
docker-compose up docker compose up
# Services im Hintergrund starten # Services im Hintergrund starten
docker-compose up -d docker compose up -d
# Bestimmte Services starten # Bestimmte Services starten
docker-compose up postgres redis docker compose up postgres redis
# Services stoppen # Services stoppen
docker-compose stop docker compose stop
# Services stoppen und Container entfernen # Services stoppen und Container entfernen
docker-compose down docker compose down
# Services mit Volume-Bereinigung stoppen # Services mit Volume-Bereinigung stoppen
docker-compose down -v docker compose down -v
# Container-Shell öffnen # Container-Shell öffnen
docker-compose exec [service-name] /bin/bash docker compose exec [service-name] /bin/bash
# oder für Alpine-basierte Images: # oder für Alpine-basierte Images:
docker-compose exec [service-name] /bin/sh docker compose exec [service-name] /bin/sh
# Konfiguration validieren # Konfiguration validieren
docker-compose config docker compose config
# Service-Status anzeigen # Service-Status anzeigen
docker-compose ps docker compose ps
# Logs aller Services anzeigen # Logs aller Services anzeigen
docker-compose logs docker compose logs
# Logs eines bestimmten Services verfolgen # Logs eines bestimmten Services verfolgen
docker-compose logs -f [service-name] docker compose logs -f [service-name]
``` ```
## Dokumentation ## Dokumentation
@@ -344,4 +344,4 @@ Siehe [LICENSE](LICENSE) Datei.
## Stand ## Stand
Letzte Aktualisierung: 22. Juli 2025 Letzte Aktualisierung: 14. September 2025
+8
View File
@@ -60,6 +60,10 @@ subprojects {
environment("NODE_OPTIONS", merged) environment("NODE_OPTIONS", merged)
// Also set the legacy switch to silence warnings entirely // Also set the legacy switch to silence warnings entirely
environment("NODE_NO_WARNINGS", "1") environment("NODE_NO_WARNINGS", "1")
// Set Chrome binary path to avoid snap permission issues
environment("CHROME_BIN", "/usr/bin/google-chrome")
environment("CHROMIUM_BIN", "/usr/bin/google-chrome")
environment("PUPPETEER_EXECUTABLE_PATH", "/usr/bin/google-chrome")
} }
} }
@@ -82,6 +86,10 @@ tasks.withType<Exec>().configureEach {
val merged = if (current.isNullOrBlank()) "--no-deprecation" else "$current --no-deprecation" val merged = if (current.isNullOrBlank()) "--no-deprecation" else "$current --no-deprecation"
environment("NODE_OPTIONS", merged) environment("NODE_OPTIONS", merged)
environment("NODE_NO_WARNINGS", "1") environment("NODE_NO_WARNINGS", "1")
// Set Chrome binary path to avoid snap permission issues
environment("CHROME_BIN", "/usr/bin/google-chrome")
environment("CHROMIUM_BIN", "/usr/bin/google-chrome")
environment("PUPPETEER_EXECUTABLE_PATH", "/usr/bin/google-chrome")
} }
tasks.wrapper { tasks.wrapper {
+55
View File
@@ -1,5 +1,8 @@
import org.jetbrains.compose.desktop.application.dsl.TargetFormat import org.jetbrains.compose.desktop.application.dsl.TargetFormat
import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl
import org.gradle.api.tasks.Copy
import org.gradle.api.tasks.Sync
import org.gradle.api.file.DuplicatesStrategy
plugins { plugins {
alias(libs.plugins.kotlin.multiplatform) alias(libs.plugins.kotlin.multiplatform)
@@ -11,12 +14,33 @@ plugins {
kotlin { kotlin {
jvm() jvm()
js(IR) {
// Disable browser-based tests (Karma/Chrome) to avoid ChromeHeadless issues
browser {
testTask {
// Prevent launching ChromeHeadless (snap permission issues on some systems)
enabled = false
}
}
// Run JS tests in Node.js instead (no browser needed)
nodejs {
testTask {
useMocha()
}
}
binaries.executable()
}
@OptIn(ExperimentalWasmDsl::class) @OptIn(ExperimentalWasmDsl::class)
wasmJs { wasmJs {
// Disable browser-based tests for WASM as well to avoid Karma/Chrome
browser { browser {
commonWebpackConfig { commonWebpackConfig {
outputFileName = "composeApp.js" outputFileName = "composeApp.js"
} }
testTask {
enabled = false
}
} }
binaries.executable() binaries.executable()
} }
@@ -50,6 +74,37 @@ kotlin {
} }
} }
// ------------------------------------------------------------------
// Fix duplicate Skiko runtime files being copied from jsMain and jsTest
// during JS test packaging by excluding them from jsTest resources and
// making Sync tasks ignore duplicates.
// ------------------------------------------------------------------
// Exclude Skiko runtime files from jsTest processed resources
// to prevent overwriting logs during test packaging.
@Suppress("UNUSED_VARIABLE")
val configureJsTestResources = run {
// Configure only if the task exists (JS target present)
tasks.matching { it.name == "jsTestProcessResources" && it is Copy }.configureEach {
(this as Copy).exclude("skiko.*", "skikod8.mjs")
}
}
// Also apply the same exclusion for WASM JS test resources, if present
@Suppress("UNUSED_VARIABLE")
val configureWasmJsTestResources = run {
tasks.matching { it.name == "wasmJsTestProcessResources" && it is Copy }.configureEach {
(this as Copy).exclude("skiko.*", "skikod8.mjs")
}
}
// Ensure Kotlin/JS generated Sync tasks do not overwrite duplicates noisily
@Suppress("UNUSED_VARIABLE")
val configureJsCompileSync = run {
tasks.matching { it.name.endsWith("CompileSync") && it is Sync }.configureEach {
(this as Sync).duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
}
compose.desktop { compose.desktop {
application { application {
@@ -0,0 +1,7 @@
package at.mocode
class JSPlatform: Platform {
override val name: String = "JavaScript"
}
actual fun getPlatform(): Platform = JSPlatform()
+166 -162
View File
@@ -8,181 +8,181 @@
# =================================================================== # ===================================================================
services: services:
# =================================================================== # ===================================================================
# Web Application (Compose for Web) # Web Application (Compose for Web)
# =================================================================== # ===================================================================
web-app: web-app:
build: build:
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) # Global build arguments (from docker/build-args/global.env)
GRADLE_VERSION: ${DOCKER_GRADLE_VERSION:-9.0.0} GRADLE_VERSION: ${DOCKER_GRADLE_VERSION:-9.0.0}
JAVA_VERSION: ${DOCKER_JAVA_VERSION:-21} JAVA_VERSION: ${DOCKER_JAVA_VERSION:-21}
BUILD_DATE: ${BUILD_DATE} BUILD_DATE: ${BUILD_DATE}
VERSION: ${DOCKER_APP_VERSION:-1.0.0} VERSION: ${DOCKER_APP_VERSION:-1.0.0}
# Client-specific arguments (from docker/build-args/clients.env) # Client-specific arguments (from docker/build-args/clients.env)
NODE_VERSION: ${DOCKER_NODE_VERSION:-20.11.0} NODE_VERSION: ${DOCKER_NODE_VERSION:-20.11.0}
NGINX_VERSION: ${DOCKER_NGINX_VERSION:-1.25-alpine} NGINX_VERSION: ${DOCKER_NGINX_VERSION:-1.25-alpine}
# Application-specific arguments # 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
container_name: meldestelle-web-app container_name: meldestelle-web-app
environment: environment:
NODE_ENV: ${NODE_ENV:-production} NODE_ENV: ${NODE_ENV:-production}
API_BASE_URL: http://api-gateway:${GATEWAY_PORT:-8081} API_BASE_URL: http://api-gateway:${GATEWAY_PORT:-8081}
WS_URL: ws://api-gateway:${GATEWAY_PORT:-8081}/ws WS_URL: ws://api-gateway:${GATEWAY_PORT:-8081}/ws
APP_TITLE: ${APP_NAME:-Meldestelle} APP_TITLE: ${APP_NAME:-Meldestelle}
APP_VERSION: ${APP_VERSION:-1.0.0} APP_VERSION: ${APP_VERSION:-1.0.0}
# Development specific # Development specific
WEBPACK_DEV_SERVER_HOST: 0.0.0.0 WEBPACK_DEV_SERVER_HOST: 0.0.0.0
WEBPACK_DEV_SERVER_PORT: 4000 WEBPACK_DEV_SERVER_PORT: 4000
ports: ports:
- "4000:4000" - "4000:4000"
networks: networks:
- meldestelle-network - meldestelle-network
healthcheck: healthcheck:
test: ["CMD", "curl", "--fail", "http://localhost:4000/health"] test: ["CMD", "curl", "--fail", "http://localhost:4000/health"]
interval: 30s interval: 30s
timeout: 10s timeout: 10s
retries: 3 retries: 3
start_period: 60s start_period: 60s
restart: unless-stopped restart: unless-stopped
labels: labels:
- "traefik.enable=true" - "traefik.enable=true"
- "traefik.http.routers.web-app.rule=Host(`localhost`) && PathPrefix(`/`)" - "traefik.http.routers.web-app.rule=Host(`localhost`) && PathPrefix(`/`)"
- "traefik.http.services.web-app.loadbalancer.server.port=4000" - "traefik.http.services.web-app.loadbalancer.server.port=4000"
# =================================================================== # ===================================================================
# Desktop Application (Compose Desktop with VNC) # Desktop Application (Compose Desktop with VNC)
# =================================================================== # ===================================================================
desktop-app: # desktop-app:
build: # build:
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) # # Global build arguments (from docker/build-args/global.env)
GRADLE_VERSION: ${DOCKER_GRADLE_VERSION:-9.0.0} # GRADLE_VERSION: ${DOCKER_GRADLE_VERSION:-9.0.0}
JAVA_VERSION: ${DOCKER_JAVA_VERSION:-21} # JAVA_VERSION: ${DOCKER_JAVA_VERSION:-21}
BUILD_DATE: ${BUILD_DATE} # BUILD_DATE: ${BUILD_DATE}
VERSION: ${DOCKER_APP_VERSION:-1.0.0} # VERSION: ${DOCKER_APP_VERSION:-1.0.0}
# Client-specific arguments (from docker/build-args/clients.env) # # Client-specific arguments (from docker/build-args/clients.env)
NODE_VERSION: ${DOCKER_NODE_VERSION:-20.11.0} # NODE_VERSION: ${DOCKER_NODE_VERSION:-20.11.0}
# Application-specific arguments # # 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
container_name: meldestelle-desktop-app # container_name: meldestelle-desktop-app
environment: # environment:
NODE_ENV: ${NODE_ENV:-production} # NODE_ENV: ${NODE_ENV:-production}
API_BASE_URL: http://api-gateway:${GATEWAY_PORT:-8081} # API_BASE_URL: http://api-gateway:${GATEWAY_PORT:-8081}
APP_TITLE: ${APP_NAME:-Meldestelle} # APP_TITLE: ${APP_NAME:-Meldestelle}
APP_VERSION: ${APP_VERSION:-1.0.0} # APP_VERSION: ${APP_VERSION:-1.0.0}
# VNC Configuration # # VNC Configuration
DISPLAY: ":99" # DISPLAY: ":99"
VNC_PORT: "5901" # VNC_PORT: "5901"
NOVNC_PORT: "6080" # NOVNC_PORT: "6080"
ports: # ports:
- "6080:6080" # Web-based VNC (noVNC) # - "6080:6080" # Web-based VNC (noVNC)
- "5901:5901" # VNC direct access # - "5901:5901" # VNC direct access
networks: # networks:
- meldestelle-network # - meldestelle-network
healthcheck: # healthcheck:
test: ["CMD", "/opt/health-check.sh"] # test: [ "CMD", "/opt/health-check.sh" ]
interval: 30s # interval: 30s
timeout: 10s # timeout: 10s
retries: 3 # retries: 3
start_period: 60s # start_period: 60s
restart: unless-stopped # restart: unless-stopped
labels: # labels:
- "traefik.enable=true" # - "traefik.enable=true"
- "traefik.http.routers.desktop-app.rule=Host(`localhost`) && PathPrefix(`/desktop`)" # - "traefik.http.routers.desktop-app.rule=Host(`localhost`) && PathPrefix(`/desktop`)"
- "traefik.http.services.desktop-app.loadbalancer.server.port=6080" # - "traefik.http.services.desktop-app.loadbalancer.server.port=6080"
# =================================================================== # ===================================================================
# Auth Server (Custom Keycloak Extension) # Auth Server (Custom Keycloak Extension)
# =================================================================== # ===================================================================
auth-server: # auth-server:
build: # build:
context: . # context: .
dockerfile: dockerfiles/infrastructure/auth-server/Dockerfile # dockerfile: dockerfiles/infrastructure/auth-server/Dockerfile
args: # args:
# Global build arguments (from docker/build-args/global.env) # # Global build arguments (from docker/build-args/global.env)
GRADLE_VERSION: ${DOCKER_GRADLE_VERSION:-9.0.0} # GRADLE_VERSION: ${DOCKER_GRADLE_VERSION:-9.0.0}
JAVA_VERSION: ${DOCKER_JAVA_VERSION:-21} # JAVA_VERSION: ${DOCKER_JAVA_VERSION:-21}
BUILD_DATE: ${BUILD_DATE} # BUILD_DATE: ${BUILD_DATE}
VERSION: ${DOCKER_APP_VERSION:-1.0.0} # VERSION: ${DOCKER_APP_VERSION:-1.0.0}
# Infrastructure-specific arguments (from docker/build-args/infrastructure.env) # # Infrastructure-specific arguments (from docker/build-args/infrastructure.env)
SPRING_PROFILES_ACTIVE: ${DOCKER_SPRING_PROFILES_DEFAULT:-default} # SPRING_PROFILES_ACTIVE: ${DOCKER_SPRING_PROFILES_DEFAULT:-default}
container_name: meldestelle-auth-server # container_name: meldestelle-auth-server
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:8080 # 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}
DB_HOST: postgres # DB_HOST: postgres
DB_PORT: 5432 # DB_PORT: 5432
DB_NAME: ${POSTGRES_DB:-meldestelle} # DB_NAME: ${POSTGRES_DB:-meldestelle}
DB_USER: ${POSTGRES_USER:-meldestelle} # DB_USER: ${POSTGRES_USER:-meldestelle}
DB_PASSWORD: ${POSTGRES_PASSWORD:-meldestelle} # DB_PASSWORD: ${POSTGRES_PASSWORD:-meldestelle}
JWT_SECRET: ${JWT_SECRET:-meldestelle-jwt-secret-key-for-development-change-in-production} # JWT_SECRET: ${JWT_SECRET:-meldestelle-jwt-secret-key-for-development-change-in-production}
JWT_ISSUER: ${JWT_ISSUER:-meldestelle-api} # JWT_ISSUER: ${JWT_ISSUER:-meldestelle-api}
JWT_AUDIENCE: ${JWT_AUDIENCE:-meldestelle-clients} # JWT_AUDIENCE: ${JWT_AUDIENCE:-meldestelle-clients}
ports: # ports:
- "${AUTH_SERVICE_PORT:-8087}:${AUTH_SERVICE_PORT:-8087}" # - "${AUTH_SERVICE_PORT:-8087}:${AUTH_SERVICE_PORT:-8087}"
networks: # networks:
- meldestelle-network # - meldestelle-network
healthcheck: # healthcheck:
test: ["CMD", "curl", "--fail", "http://localhost:${AUTH_SERVICE_PORT:-8087}/actuator/health"] # test: ["CMD", "curl", "--fail", "http://localhost:${AUTH_SERVICE_PORT:-8087}/actuator/health"]
interval: 30s # interval: 30s
timeout: 10s # timeout: 10s
retries: 3 # retries: 3
start_period: 60s # start_period: 60s
restart: unless-stopped # restart: unless-stopped
# =================================================================== # ===================================================================
# Monitoring Server (Custom Grafana Extensions) # Monitoring Server (Custom Grafana Extensions)
# =================================================================== # ===================================================================
monitoring-server: # monitoring-server:
build: # build:
context: . # context: .
dockerfile: dockerfiles/infrastructure/monitoring-server/Dockerfile # dockerfile: dockerfiles/infrastructure/monitoring-server/Dockerfile
args: # args:
# Global build arguments (from docker/build-args/global.env) # # Global build arguments (from docker/build-args/global.env)
GRADLE_VERSION: ${DOCKER_GRADLE_VERSION:-9.0.0} # GRADLE_VERSION: ${DOCKER_GRADLE_VERSION:-9.0.0}
JAVA_VERSION: ${DOCKER_JAVA_VERSION:-21} # JAVA_VERSION: ${DOCKER_JAVA_VERSION:-21}
BUILD_DATE: ${BUILD_DATE} # BUILD_DATE: ${BUILD_DATE}
VERSION: ${DOCKER_APP_VERSION:-1.0.0} # VERSION: ${DOCKER_APP_VERSION:-1.0.0}
# Infrastructure-specific arguments (from docker/build-args/infrastructure.env) # # Infrastructure-specific arguments (from docker/build-args/infrastructure.env)
SPRING_PROFILES_ACTIVE: ${DOCKER_SPRING_PROFILES_DEFAULT:-default} # SPRING_PROFILES_ACTIVE: ${DOCKER_SPRING_PROFILES_DEFAULT:-default}
container_name: meldestelle-monitoring-server # container_name: meldestelle-monitoring-server
environment: # environment:
SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE:-dev} # SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE:-dev}
SERVER_PORT: 8088 # SERVER_PORT: 8088
GRAFANA_URL: http://grafana:3000 # GRAFANA_URL: http://grafana:3000
PROMETHEUS_URL: http://prometheus:9090 # PROMETHEUS_URL: http://prometheus:9090
GRAFANA_ADMIN_USER: ${GF_SECURITY_ADMIN_USER:-admin} # GRAFANA_ADMIN_USER: ${GF_SECURITY_ADMIN_USER:-admin}
GRAFANA_ADMIN_PASSWORD: ${GF_SECURITY_ADMIN_PASSWORD:-admin} # GRAFANA_ADMIN_PASSWORD: ${GF_SECURITY_ADMIN_PASSWORD:-admin}
METRICS_AUTH_USERNAME: ${METRICS_AUTH_USERNAME:-admin} # METRICS_AUTH_USERNAME: ${METRICS_AUTH_USERNAME:-admin}
METRICS_AUTH_PASSWORD: ${METRICS_AUTH_PASSWORD:-metrics} # METRICS_AUTH_PASSWORD: ${METRICS_AUTH_PASSWORD:-metrics}
ports: # ports:
- "8088:8088" # - "8088:8088"
networks: # networks:
- meldestelle-network # - meldestelle-network
healthcheck: # healthcheck:
test: ["CMD", "curl", "--fail", "http://localhost:8088/actuator/health"] # test: ["CMD", "curl", "--fail", "http://localhost:8088/actuator/health"]
interval: 30s # interval: 30s
timeout: 10s # timeout: 10s
retries: 3 # retries: 3
start_period: 60s # start_period: 60s
restart: unless-stopped # restart: unless-stopped
volumes: # volumes:
- monitoring-data:/app/data # - monitoring-data:/app/data
- ./docker/monitoring:/app/config:ro # - ./docker/monitoring:/app/config:ro
# =================================================================== # ===================================================================
# Volumes für Client-spezifische Daten # Volumes für Client-spezifische Daten
@@ -190,6 +190,10 @@ services:
volumes: volumes:
monitoring-data: monitoring-data:
driver: local driver: local
desktop-app-gradle-cache:
driver: local
web-app-gradle-cache:
driver: local
# =================================================================== # ===================================================================
# Networks (shared network from main compose file) # Networks (shared network from main compose file)
+128 -121
View File
@@ -42,7 +42,7 @@ services:
networks: networks:
- meldestelle-network - meldestelle-network
healthcheck: healthcheck:
test: ["CMD", "curl", "--fail", "http://localhost:${PING_SERVICE_PORT:-8082}/actuator/health"] test: [ "CMD", "curl", "--fail", "http://localhost:${PING_SERVICE_PORT:-8082}/actuator/health" ]
interval: 15s interval: 15s
timeout: 5s timeout: 5s
retries: 3 retries: 3
@@ -52,134 +52,134 @@ services:
# =================================================================== # ===================================================================
# Members Service # Members Service
# =================================================================== # ===================================================================
# members-service: # members-service:
# build: # build:
# context: . # context: .
# dockerfile: dockerfiles/services/members-service/Dockerfile # dockerfile: dockerfiles/services/members-service/Dockerfile
# container_name: meldestelle-members-service # container_name: meldestelle-members-service
# environment: # environment:
# SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE:-dev} # SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE:-dev}
# SERVER_PORT: ${MEMBERS_SERVICE_PORT:-8083} # SERVER_PORT: ${MEMBERS_SERVICE_PORT:-8083}
# CONSUL_HOST: consul # CONSUL_HOST: consul
# CONSUL_PORT: ${CONSUL_PORT:-8500} # CONSUL_PORT: ${CONSUL_PORT:-8500}
# CONSUL_ENABLED: ${CONSUL_ENABLED:-true} # CONSUL_ENABLED: ${CONSUL_ENABLED:-true}
# DB_HOST: postgres # DB_HOST: postgres
# DB_PORT: 5432 # DB_PORT: 5432
# DB_NAME: ${POSTGRES_DB:-meldestelle} # DB_NAME: ${POSTGRES_DB:-meldestelle}
# DB_USER: ${POSTGRES_USER:-meldestelle} # DB_USER: ${POSTGRES_USER:-meldestelle}
# DB_PASSWORD: ${POSTGRES_PASSWORD:-meldestelle} # DB_PASSWORD: ${POSTGRES_PASSWORD:-meldestelle}
# REDIS_EVENT_STORE_HOST: redis # REDIS_EVENT_STORE_HOST: redis
# REDIS_EVENT_STORE_PORT: 6379 # REDIS_EVENT_STORE_PORT: 6379
# REDIS_EVENT_STORE_PASSWORD: ${REDIS_PASSWORD:-} # REDIS_EVENT_STORE_PASSWORD: ${REDIS_PASSWORD:-}
# KAFKA_BOOTSTRAP_SERVERS: kafka:29092 # KAFKA_BOOTSTRAP_SERVERS: kafka:29092
# ports: # ports:
# - "${MEMBERS_SERVICE_PORT:-8083}:${MEMBERS_SERVICE_PORT:-8083}" # - "${MEMBERS_SERVICE_PORT:-8083}:${MEMBERS_SERVICE_PORT:-8083}"
# depends_on: # depends_on:
# consul: # consul:
# condition: service_healthy # condition: service_healthy
# postgres: # postgres:
# condition: service_healthy # condition: service_healthy
# redis: # redis:
# condition: service_healthy # condition: service_healthy
# kafka: # kafka:
# condition: service_healthy # condition: service_healthy
# networks: # networks:
# - meldestelle-network # - meldestelle-network
# healthcheck: # healthcheck:
# test: ["CMD", "curl", "--fail", "http://localhost:${MEMBERS_SERVICE_PORT:-8083}/actuator/health"] # test: ["CMD", "curl", "--fail", "http://localhost:${MEMBERS_SERVICE_PORT:-8083}/actuator/health"]
# interval: 15s # interval: 15s
# timeout: 5s # timeout: 5s
# retries: 3 # retries: 3
# start_period: 30s # start_period: 30s
# restart: unless-stopped # restart: unless-stopped
# =================================================================== # ===================================================================
# Horses Service # Horses Service
# =================================================================== # ===================================================================
# horses-service: # horses-service:
# build: # build:
# context: . # context: .
# dockerfile: dockerfiles/services/horses-service/Dockerfile # dockerfile: dockerfiles/services/horses-service/Dockerfile
# container_name: meldestelle-horses-service # container_name: meldestelle-horses-service
# environment: # environment:
# SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE:-dev} # SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE:-dev}
# SERVER_PORT: ${HORSES_SERVICE_PORT:-8084} # SERVER_PORT: ${HORSES_SERVICE_PORT:-8084}
# CONSUL_HOST: consul # CONSUL_HOST: consul
# CONSUL_PORT: ${CONSUL_PORT:-8500} # CONSUL_PORT: ${CONSUL_PORT:-8500}
# CONSUL_ENABLED: ${CONSUL_ENABLED:-true} # CONSUL_ENABLED: ${CONSUL_ENABLED:-true}
# DB_HOST: postgres # DB_HOST: postgres
# DB_PORT: 5432 # DB_PORT: 5432
# DB_NAME: ${POSTGRES_DB:-meldestelle} # DB_NAME: ${POSTGRES_DB:-meldestelle}
# DB_USER: ${POSTGRES_USER:-meldestelle} # DB_USER: ${POSTGRES_USER:-meldestelle}
# DB_PASSWORD: ${POSTGRES_PASSWORD:-meldestelle} # DB_PASSWORD: ${POSTGRES_PASSWORD:-meldestelle}
# REDIS_EVENT_STORE_HOST: redis # REDIS_EVENT_STORE_HOST: redis
# REDIS_EVENT_STORE_PORT: 6379 # REDIS_EVENT_STORE_PORT: 6379
# REDIS_EVENT_STORE_PASSWORD: ${REDIS_PASSWORD:-} # REDIS_EVENT_STORE_PASSWORD: ${REDIS_PASSWORD:-}
# KAFKA_BOOTSTRAP_SERVERS: kafka:29092 # KAFKA_BOOTSTRAP_SERVERS: kafka:29092
# ports: # ports:
# - "${HORSES_SERVICE_PORT:-8084}:${HORSES_SERVICE_PORT:-8084}" # - "${HORSES_SERVICE_PORT:-8084}:${HORSES_SERVICE_PORT:-8084}"
# depends_on: # depends_on:
# consul: # consul:
# condition: service_healthy # condition: service_healthy
# postgres: # postgres:
# condition: service_healthy # condition: service_healthy
# redis: # redis:
# condition: service_healthy # condition: service_healthy
# kafka: # kafka:
# condition: service_healthy # condition: service_healthy
# networks: # networks:
# - meldestelle-network # - meldestelle-network
# healthcheck: # healthcheck:
# test: ["CMD", "curl", "--fail", "http://localhost:${HORSES_SERVICE_PORT:-8084}/actuator/health"] # test: ["CMD", "curl", "--fail", "http://localhost:${HORSES_SERVICE_PORT:-8084}/actuator/health"]
# interval: 15s # interval: 15s
# timeout: 5s # timeout: 5s
# retries: 3 # retries: 3
# start_period: 30s # start_period: 30s
# restart: unless-stopped # restart: unless-stopped
# =================================================================== # ===================================================================
# Events Service # Events Service
# =================================================================== # ===================================================================
# events-service: # events-service:
# build: # build:
# context: . # context: .
# dockerfile: dockerfiles/services/events-service/Dockerfile # dockerfile: dockerfiles/services/events-service/Dockerfile
# container_name: meldestelle-events-service # container_name: meldestelle-events-service
# environment: # environment:
# SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE:-dev} # SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE:-dev}
# SERVER_PORT: ${EVENTS_SERVICE_PORT:-8085} # SERVER_PORT: ${EVENTS_SERVICE_PORT:-8085}
# CONSUL_HOST: consul # CONSUL_HOST: consul
# CONSUL_PORT: ${CONSUL_PORT:-8500} # CONSUL_PORT: ${CONSUL_PORT:-8500}
# CONSUL_ENABLED: ${CONSUL_ENABLED:-true} # CONSUL_ENABLED: ${CONSUL_ENABLED:-true}
# DB_HOST: postgres # DB_HOST: postgres
# DB_PORT: 5432 # DB_PORT: 5432
# DB_NAME: ${POSTGRES_DB:-meldestelle} # DB_NAME: ${POSTGRES_DB:-meldestelle}
# DB_USER: ${POSTGRES_USER:-meldestelle} # DB_USER: ${POSTGRES_USER:-meldestelle}
# DB_PASSWORD: ${POSTGRES_PASSWORD:-meldestelle} # DB_PASSWORD: ${POSTGRES_PASSWORD:-meldestelle}
# REDIS_EVENT_STORE_HOST: redis # REDIS_EVENT_STORE_HOST: redis
# REDIS_EVENT_STORE_PORT: 6379 # REDIS_EVENT_STORE_PORT: 6379
# REDIS_EVENT_STORE_PASSWORD: ${REDIS_PASSWORD:-} # REDIS_EVENT_STORE_PASSWORD: ${REDIS_PASSWORD:-}
# KAFKA_BOOTSTRAP_SERVERS: kafka:29092 # KAFKA_BOOTSTRAP_SERVERS: kafka:29092
# ports: # ports:
# - "${EVENTS_SERVICE_PORT:-8085}:${EVENTS_SERVICE_PORT:-8085}" # - "${EVENTS_SERVICE_PORT:-8085}:${EVENTS_SERVICE_PORT:-8085}"
# depends_on: # depends_on:
# consul: # consul:
# condition: service_healthy # condition: service_healthy
# postgres: # postgres:
# condition: service_healthy # condition: service_healthy
# redis: # redis:
# condition: service_healthy # condition: service_healthy
# kafka: # kafka:
# condition: service_healthy # condition: service_healthy
# networks: # networks:
# - meldestelle-network # - meldestelle-network
# healthcheck: # healthcheck:
# test: ["CMD", "curl", "--fail", "http://localhost:${EVENTS_SERVICE_PORT:-8085}/actuator/health"] # test: ["CMD", "curl", "--fail", "http://localhost:${EVENTS_SERVICE_PORT:-8085}/actuator/health"]
# interval: 15s # interval: 15s
# timeout: 5s # timeout: 5s
# retries: 3 # retries: 3
# start_period: 30s # start_period: 30s
# restart: unless-stopped # restart: unless-stopped
# =================================================================== # ===================================================================
# Masterdata Service # Masterdata Service
@@ -225,6 +225,13 @@ services:
# start_period: 30s # start_period: 30s
# restart: unless-stopped # restart: unless-stopped
# ===================================================================
# Volumes
# ===================================================================
volumes:
ping-service-gradle-cache:
driver: local
# =================================================================== # ===================================================================
# Networks (shared network from main compose file) # Networks (shared network from main compose file)
# =================================================================== # ===================================================================
+2
View File
@@ -255,6 +255,8 @@ volumes:
driver: local driver: local
grafana-data: grafana-data:
driver: local driver: local
api-gateway-gradle-cache:
driver: local
# =================================================================== # ===================================================================
# Networks # Networks
+9 -4
View File
@@ -81,6 +81,10 @@ LABEL service="desktop-app" \
environment="production" \ environment="production" \
description="Meldestelle Compose Desktop Application with VNC" description="Meldestelle Compose Desktop Application with VNC"
# Set non-interactive mode and timezone for package installations
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Etc/UTC
# Install system dependencies # Install system dependencies
RUN apt-get update && apt-get install -y \ RUN apt-get update && apt-get install -y \
openjdk-21-jre-headless \ openjdk-21-jre-headless \
@@ -92,15 +96,16 @@ RUN apt-get update && apt-get install -y \
curl \ curl \
wget \ wget \
supervisor \ supervisor \
tigervnc-common \
tigervnc-standalone-server \
&& rm -rf /var/lib/apt/lists/* && rm -rf /var/lib/apt/lists/*
# Create application user # Create application user
RUN useradd -m -s /bin/bash appuser && \ RUN useradd -m -s /bin/bash appuser && \
mkdir -p /home/appuser/.vnc mkdir -p /home/appuser/.vnc
# Set up VNC # Set up VNC password using a separate RUN command
RUN mkdir -p /home/appuser/.vnc && \ RUN echo "meldestelle" | vncpasswd -f > /home/appuser/.vnc/passwd && \
echo "meldestelle" | vncpasswd -f > /home/appuser/.vnc/passwd && \
chmod 600 /home/appuser/.vnc/passwd && \ chmod 600 /home/appuser/.vnc/passwd && \
chown -R appuser:appuser /home/appuser/.vnc chown -R appuser:appuser /home/appuser/.vnc
@@ -125,7 +130,7 @@ RUN echo '#!/bin/bash' > /opt/start-vnc.sh && \
echo 'sleep 2' >> /opt/start-vnc.sh && \ echo 'sleep 2' >> /opt/start-vnc.sh && \
echo '' >> /opt/start-vnc.sh && \ echo '' >> /opt/start-vnc.sh && \
echo '# Start VNC server' >> /opt/start-vnc.sh && \ echo '# Start VNC server' >> /opt/start-vnc.sh && \
echo 'x11vnc -display :99 -nopw -listen localhost -xkb -ncache 10 -ncache_cr -rfbport $VNC_PORT &' >> /opt/start-vnc.sh && \ echo 'x11vnc -display :99 -rfbauth /home/appuser/.vnc/passwd -listen localhost -xkb -ncache 10 -ncache_cr -rfbport $VNC_PORT &' >> /opt/start-vnc.sh && \
echo 'sleep 2' >> /opt/start-vnc.sh && \ echo 'sleep 2' >> /opt/start-vnc.sh && \
echo '' >> /opt/start-vnc.sh && \ echo '' >> /opt/start-vnc.sh && \
echo '# Start noVNC' >> /opt/start-vnc.sh && \ echo '# Start noVNC' >> /opt/start-vnc.sh && \
+13 -13
View File
@@ -58,19 +58,19 @@ ENV GRADLE_OPTS="-Dorg.gradle.caching=true \
ENV GRADLE_USER_HOME=/home/gradle/.gradle ENV GRADLE_USER_HOME=/home/gradle/.gradle
# Install Node.js for Kotlin/Wasm npm operations # Install Node.js for Kotlin/Wasm npm operations
ARG NODE_VERSION #ARG NODE_VERSION
RUN apk add --no-cache \ #RUN apk add --no-cache \
nodejs \ # nodejs \
npm \ # npm \
curl && \ # curl && \
# Verify installation \ # # Verify installation \
node --version && \ # node --version && \
npm --version && \ # npm --version && \
# Create Gradle Node.js directory structure and symlinks \ # # Create Gradle Node.js directory structure and symlinks \
mkdir -p /home/gradle/.gradle/nodejs/node-v22.0.0-linux-x64/bin && \ # mkdir -p /home/gradle/.gradle/nodejs/node-v22.0.0-linux-x64/bin && \
ln -sf /usr/bin/node /home/gradle/.gradle/nodejs/node-v22.0.0-linux-x64/bin/node && \ # ln -sf /usr/bin/node /home/gradle/.gradle/nodejs/node-v22.0.0-linux-x64/bin/node && \
ln -sf /usr/bin/npm /home/gradle/.gradle/nodejs/node-v22.0.0-linux-x64/bin/npm && \ # ln -sf /usr/bin/npm /home/gradle/.gradle/nodejs/node-v22.0.0-linux-x64/bin/npm && \
chown -R gradle:gradle /home/gradle/.gradle # chown -R gradle:gradle /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/
+1 -1
View File
@@ -84,7 +84,7 @@ http {
# API proxy (if needed for backend communication) # API proxy (if needed for backend communication)
location /api/ { location /api/ {
proxy_pass http://localhost:8081/; proxy_pass http://api-gateway:8081/;
proxy_set_header Host $host; proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+2 -2
View File
@@ -12,8 +12,8 @@ org.gradle.vfs.watch=true
# Für bessere Performance # Für bessere Performance
org.gradle.configuration-cache=true org.gradle.configuration-cache=true
# Browser für Tests konfigurieren # Browser für Tests konfigurieren - verwende Chrome mit Puppeteer
kotlin.js.browser.karma.useChromeHeadless=false kotlin.js.browser.karma.useChromeHeadless=true
# Security and Reproducibility # Security and Reproducibility
org.gradle.dependency.verification=lenient org.gradle.dependency.verification=lenient
+851 -18
View File
File diff suppressed because it is too large Load Diff