diff --git a/.dockerignore b/.dockerignore index fc8fcb65..d5ece207 100644 --- a/.dockerignore +++ b/.dockerignore @@ -70,10 +70,8 @@ Thumbs.db # =================================================================== # Environment and Configuration files # =================================================================== -config/.env -.env.local -.env.*.local -.env.example +# .env +# .env.example # =================================================================== # Docker and Container files diff --git a/.env b/.env new file mode 100644 index 00000000..c6dedef2 --- /dev/null +++ b/.env @@ -0,0 +1,110 @@ +# ========================================== +# Meldestelle – Docker Compose Environment +# Single Source of Truth (SSoT) +# ========================================== + +# --- PROJECT --- +PROJECT_NAME=meldestelle +RESTART_POLICY=no + +# Postgres +POSTGRES_IMAGE=postgres:16-alpine +POSTGRES_USER=pg-user +POSTGRES_PASSWORD=pg-password +POSTGRES_DB=pg-meldestelle-db +POSTGRES_PORT=5432:5432 +POSTGRES_DB_URL=jdbc:postgresql://postgres:5432/pg-meldestelle-db + +# --- REDIS --- +# Optional password for Redis; leave empty to disable authentication in dev +REDIS_IMAGE=redis:7.4-alpine +REDIS_PASSWORD=redis-password +REDIS_PORT=6379:6379 +REDIS_SERVER_HOSTNAME=redis +REDIS_SERVER_PORT=6379 +REDIS_SERVER_CONNECT_TIMEOUT=5s + +# --- KEYCLOAK --- +KEYCLOAK_IMAGE_TAG=26.4 +KC_ADMIN_USERNAME=kc-admin +KC_ADMIN_PASSWORD=kc-password +# Type der Datenbank (postgres, h2, mariadb, mysql, oracle, mssql) +KC_DB=postgres +# DB Schema 01-init-keycloak-schema.sql +KC_DB_SCHEMA=keycloak +# DB Verbindungsparameter +# KC_DB_URL=jdbc:postgresql://postgres:5432/pg-meldestelle-db +KC_HOSTNAME=localhost +KC_PORT=8180:8080 +KC_DEBUG_PORT=9000:9000 + +# --- PGADMIN --- +PGADMIN_IMAGE=dpage/pgadmin4:8 +PGADMIN_EMAIL=meldestelle@mo-code.at +PGADMIN_PASSWORD=pgadmin +PGADMIN_PORT=8888:80 + +# --- PROMETHEUS --- +PROMETHEUS_IMAGE=prom/prometheus:v3.7.3 +PROMETHEUS_PORT=9090:9090 + +# --- GRAFANA --- +GF_IMAGE=grafana/grafana:12.3 +GF_ADMIN_USER=gf-admin +GF_ADMIN_PASSWORD=gf-password +GF_PORT=3000:3000 + +# --- CONSUL --- +CONSUL_IMAGE=hashicorp/consul:1.22.1 +CONSUL_PORT=8500:8500 +CONSUL_UDP_PORT=8600:8600/udp +# Zentrale App-Config für Consul (interner Host/Port im Compose-Netz) +CONSUL_HOST=consul +CONSUL_HTTP_PORT=8500 +# SPRING-CLOUD-CONSUL +SCLOUD_CONSUL_HOSTNAME=consul +SCLOUD_CONSUL_PORT=8500 + +# --- API-GATEWAY --- +GATEWAY_PORT=8081:8081 +GATEWAY_DEBUG_PORT=5005:5005 +GATEWAY_SERVER_PORT=8081 +GATEWAY_SPRING_PROFILES_ACTIVE=docker +GATEWAY_DEBUG=true +# Service-Registrierungsname in Consul (Anzeige in der UI) +GATEWAY_SERVICE_NAME=api-gateway +# TODO Check Keycloak-URI +# SPRING_SECURITY_OAUTH2_RESOURCESERVER_JWT +SSEC_ISSUER_URI=http://keycloak:8080/realms/meldestelle +SSEC_JWK_SET_URI=http://keycloak:8080/realms/meldestelle/protocol/openid-connect/certs +# SPRING-CLOUD-CONSUL +GATEWAY_CONSUL_HOSTNAME=api-gateway +GATEWAY_CONSUL_PREFER_IP=true + +# --- PING-SERVICE --- +PING_SPRING_PROFILES_ACTIVE=docker +PING_PORT=8082:8082 +PING_DEBUG_PORT=5006:5006 +PING_SERVER_PORT=8082 +PING_DEBUG=true +PING_SERVICE_NAME=ping-service +PING_CONSUL_HOSTNAME=ping-service +PING_CONSUL_PREFER_IP=true + +# --- WEB-APP --- +WEB_APP_PORT=4000:80 + +# --- DESKTOP-APP --- +DESKTOP_APP_VNC_PORT=5900:5900 +DESKTOP_APP_NOVNC_PORT=6080:6080 + +# Docker build versions (optional overrides) +DOCKER_VERSION=1.0.0-SNAPSHOT +DOCKER_BUILD_DATE=2025-12-04T15:00:00Z +DOCKER_GRADLE_VERSION=9.1.0 +DOCKER_JAVA_VERSION=21 +DOCKER_NODE_VERSION=22.21.0 +DOCKER_NGINX_VERSION=1.28.0-alpine +WEB_BUILD_PROFILE=dev + + diff --git a/.gitignore b/.gitignore index 55a23116..adbd975c 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,9 @@ out/ .gradle/ **/build/ +# Enviroments +#.env + # Kotlin .kotlin/ @@ -26,8 +29,6 @@ logs/ # Kotlin/Java *.class -config/.env - # Generated diagrams build/diagrams/ diff --git a/config/versions.toml b/config/versions.toml index 752e2d80..1da74328 100644 --- a/config/versions.toml +++ b/config/versions.toml @@ -19,7 +19,7 @@ eclipse-temurin-jre = "21-jre-alpine" # --- Datastore Images --- postgres = "16-alpine" -redis = "7-alpine" +redis = "7.4-alpine" # --- Additional Infrastructure Images --- consul = "1.15" diff --git a/docker-compose.yaml b/docker-compose.yaml index 6bcf6bec..bb328723 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -7,19 +7,19 @@ services: # --- DATABASE: PostgreSQL --- postgres: - image: "postgres:16-alpine" - container_name: "${PROJECT_NAME}-postgres" - restart: "${RESTART_POLICY}" + image: "${POSTGRES_IMAGE:-postgres:16-alpine}" + container_name: "${PROJECT_NAME:-meldestelle}-postgres" + restart: "${RESTART_POLICY:-no}" ports: - - "${POSTGRES_PORT}" + - "${POSTGRES_PORT:-5432:5432}" environment: - POSTGRES_USER: "${POSTGRES_USER}" - POSTGRES_PASSWORD: "${POSTGRES_PASSWORD}" - POSTGRES_DB: "${POSTGRES_DB}" + POSTGRES_USER: "${POSTGRES_USER:-pg-user}" + POSTGRES_PASSWORD: "${POSTGRES_PASSWORD:-pg-password}" + POSTGRES_DB: "${POSTGRES_DB:-pg-meldestelle-db}" volumes: - "postgres-data:/var/lib/postgresql/data" - - "../config/backend/infrastructure/postgres:/docker-entrypoint-initdb.d:Z" - - "../config/backend/infrastructure/postgres/postgresql.conf:/etc/postgresql/postgresql.conf:Z" + - "./config/backend/infrastructure/postgres:/docker-entrypoint-initdb.d:Z" + - "./config/backend/infrastructure/postgres/postgresql.conf:/etc/postgresql/postgresql.conf:Z" command: [ "postgres", "-c", "config_file=/etc/postgresql/postgresql.conf" ] healthcheck: test: [ "CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}" ] @@ -34,17 +34,17 @@ services: # --- CACHE: Redis --- redis: - image: "redis:8.4-alpine" - container_name: "${PROJECT_NAME}-redis" - restart: "${RESTART_POLICY}" + image: "${REDIS_IMAGE:-redis:7.4-alpine}" + container_name: "${PROJECT_NAME:-meldestelle}-redis" + restart: "${RESTART_POLICY:-no}" ports: - - "${REDIS_PORT}" + - "${REDIS_PORT:-6379:6379}" volumes: - "redis-data:/data" - - "../config/backend/infrastructure/redis/redis.conf:/usr/local/etc/redis/redis.conf:Z" - command: [ "sh", "-lc", "exec redis-server /usr/local/etc/redis/redis.conf ${REDIS_PASSWORD:+--requirepass $REDIS_PASSWORD}" ] + - "./config/backend/infrastructure/redis/redis.conf:/usr/local/etc/redis/redis.conf:Z" + command: [ "sh", "-lc", "exec redis-server /usr/local/etc/redis/redis.conf --protected-mode no ${REDIS_PASSWORD:+--requirepass $REDIS_PASSWORD}" ] healthcheck: - test: [ "CMD-SHELL", "redis-cli -a \"$REDIS_PASSWORD\" ping | grep PONG" ] + test: [ "CMD-SHELL", "[ -z \"$REDIS_PASSWORD\" ] && redis-cli ping | grep PONG || redis-cli -a \"$REDIS_PASSWORD\" ping | grep PONG" ] interval: "5s" timeout: "5s" retries: "3" @@ -56,43 +56,38 @@ services: # --- IAM: Keycloak --- keycloak: image: "meldestelle-keycloak:latest" - container_name: "${PROJECT_NAME}-keycloak" - restart: "${RESTART_POLICY}" + container_name: "${PROJECT_NAME:-meldestelle}-keycloak" + restart: "${RESTART_POLICY:-no}" build: - context: "config/backend/infrastructure/keycloak" + context: "./config/backend/infrastructure/keycloak" args: - KEYCLOAK_IMAGE_TAG: "26.4" + KEYCLOAK_IMAGE_TAG: "${KEYCLOAK_IMAGE_TAG:-26.4}" + BUILD_DATE: "${DOCKER_BUILD_DATE}" + labels: + - "org.opencontainers.image.created=${DOCKER_BUILD_DATE}" environment: - # Admin Credentials aus .env - KC_BOOTSTRAP_ADMIN_USERNAME: "${KC_ADMIN_USER}" - KC_BOOTSTRAP_ADMIN_PASSWORD: "${KC_ADMIN_PASSWORD}" - - # DB Verbindung (Nutzt interne Docker-Namen, daher fest 'postgres') - KC_DB: "postgres" - KC_DB_URL: "jdbc:postgresql://postgres:5432/pg-${PROJECT_NAME}-db" - KC_DB_USERNAME: "${POSTGRES_USER}" - KC_DB_PASSWORD: "${POSTGRES_PASSWORD}" - - # Hostname & Proxy (Wichtig für Dev!) - KC_HOSTNAME: "localhost" - # Erlaubte Backend-Calls via http://keycloak:8080 im Docker Netzwerk - KC_HOSTNAME_STRICT: "false" - KC_HOSTNAME_STRICT_HTTPS: "false" + KC_BOOTSTRAP_ADMIN_USERNAME: "${KC_ADMIN_USERNAME:-kc-admin}" + KC_BOOTSTRAP_ADMIN_PASSWORD: "${KC_ADMIN_PASSWORD:-kc-password}" + KC_DB: "${KC_DB:-postgres}" + KC_DB_SCHEMA: "${KC_DB_SCHEMA:-keycloak}" + KC_DB_URL: "${POSTGRES_DB_URL:-jdbc:postgresql://postgres:5432/pg-meldestelle-db}" + KC_DB_USERNAME: "${POSTGRES_USER:-pg-user}" + KC_DB_PASSWORD: "${POSTGRES_PASSWORD:-pg-password}" + KC_HOSTNAME: "${KC_HOSTNAME:-localhost}" KC_HTTP_ENABLED: "true" KC_PROXY_HEADERS: "xforwarded" - - # Health & Metrics sind schon im Image gebaut, aber env schadet nicht KC_HEALTH_ENABLED: "true" KC_METRICS_ENABLED: "true" ports: - - "${KC_PORT}" - - "9000:9000" + - "${KC_PORT:-8180:8080}" + - "${KC_DEBUG_PORT:-9000:9000}" depends_on: postgres: condition: "service_healthy" + redis: + condition: "service_healthy" volumes: - # Import Realm - - "../config/backend/infrastructure/keycloak:/opt/keycloak/data/import:Z" + - "./config/backend/infrastructure/keycloak:/opt/keycloak/data/import:Z" command: "start --optimized --import-realm" healthcheck: test: [ "CMD-SHELL", "exec 3<>/dev/tcp/127.0.0.1/9000" ] @@ -107,14 +102,14 @@ services: # --- DATENBANK-MANAGEMENT-TOOL: pgAdmin4 --- pgadmin: - image: "dpage/pgadmin4:8" - container_name: "${PROJECT_NAME}-pgadmin" - restart: "${RESTART_POLICY}" + image: "${PGADMIN_IMAGE:-dpage/pgadmin4:8}" + container_name: "${PROJECT_NAME:-meldestelle}-pgadmin" + restart: "${RESTART_POLICY:-no}" ports: - "${PGADMIN_PORT:-8888:80}" environment: - PGADMIN_DEFAULT_EMAIL: "${PGADMIN_EMAIL}" - PGADMIN_DEFAULT_PASSWORD: "${PGADMIN_PASSWORD}" + PGADMIN_DEFAULT_EMAIL: "${PGADMIN_EMAIL:-meldestelle@mo-code.at}" + PGADMIN_DEFAULT_PASSWORD: "${PGADMIN_PASSWORD:-pgadmin}" volumes: - "pgadmin-data:/var/lib/pgadmin" networks: @@ -124,14 +119,14 @@ services: # --- MONITORING: Prometheus --- prometheus: - image: "prom/prometheus:v3.7.3" - container_name: "${PROJECT_NAME}-prometheus" - restart: "${RESTART_POLICY}" + image: "${PROMETHEUS_IMAGE:-prom/prometheus:v3.7.3}" + container_name: "${PROJECT_NAME:-meldestelle}-prometheus" + restart: "${RESTART_POLICY:-no}" ports: - - "${PROMETHEUS_PORT}" + - "${PROMETHEUS_PORT:-9090:9090}" volumes: - "prometheus-data:/prometheus" - - "../config/backend/infrastructure/monitoring/prometheus:/etc/prometheus:Z" + - "./config/backend/infrastructure/monitoring/prometheus:/etc/prometheus:Z" command: - --web.enable-lifecycle - --config.file=/etc/prometheus/prometheus.yaml @@ -149,41 +144,42 @@ services: # --- MONITORING: Grafana --- grafana: - image: grafana/grafana:12.3 - container_name: ${PROJECT_NAME}-grafana - restart: "${RESTART_POLICY}" + image: "${GF_IMAGE:-grafana/grafana:12.3}" + container_name: "${PROJECT_NAME:-meldestelle}-grafana" + restart: "${RESTART_POLICY:-no}" environment: - GF_SECURITY_ADMIN_USER: ${GF_ADMIN_USER} - GF_SECURITY_ADMIN_PASSWORD: ${GF_ADMIN_PASSWORD} + GF_SECURITY_ADMIN_USER: "${GF_ADMIN_USER:-gf-admin}" + GF_SECURITY_ADMIN_PASSWORD: "${GF_ADMIN_PASSWORD:-gf-password}" ports: - - "${GF_PORT}" + - "${GF_PORT:-3000:3000}" volumes: - grafana-data:/var/lib/grafana # Provisioning (datasources/dashboards) from central config - ../config/backend/infrastructure/monitoring/grafana/provisioning:/etc/grafana/provisioning:Z - # Dashboards directory (referenced by provisioning file path: /var/lib/grafana/dashboards) + # Dashboards directory (referenced by a provisioning file path: /var/lib/grafana/dashboards) - ../config/backend/infrastructure/monitoring/grafana/dashboards:/var/lib/grafana/dashboards:Z depends_on: - - prometheus + prometheus: + condition: "service_healthy" healthcheck: test: [ "CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3000/api/health" ] - interval: 30s - timeout: 10s - retries: 3 - start_period: 30s + interval: "30s" + timeout: "10s" + retries: "3" + start_period: "30s" networks: meldestelle-network: aliases: - - grafana + - "grafana" # --- CONSUL --- consul: - image: "hashicorp/consul:1.22.1" - container_name: "${PROJECT_NAME}-consul" - restart: "${RESTART_POLICY}" + image: "${CONSUL_IMAGE:-hashicorp/consul:1.22.1}" + container_name: "${PROJECT_NAME:-meldestelle}-consul" + restart: "${RESTART_POLICY:-no}" ports: - - "${CONSUL_PORT}" - - "${CONSUL_UDP_PORT}" + - "${CONSUL_PORT:-8500:8500}" + - "${CONSUL_UDP_PORT:-8600:8600/udp}" command: "agent -server -bootstrap-expect=1 -ui -client=0.0.0.0" healthcheck: test: [ "CMD", "curl", "-f", "http://localhost:8500/v1/status/leader" ] @@ -198,56 +194,67 @@ services: # --- API-GATEWAY: Spring Cloud Gateway --- api-gateway: build: - context: .. + context: . dockerfile: backend/infrastructure/gateway/Dockerfile args: # Build-Args aus deinen .env Dateien (werden hier statisch benötigt für den Build) - GRADLE_VERSION: "9.1.0" - JAVA_VERSION: "21" - VERSION: "1.0.0-SNAPSHOT" - BUILD_DATE: "2025-12-04" - container_name: "${PROJECT_NAME}-gateway" - restart: "${RESTART_POLICY}" + GRADLE_VERSION: "${DOCKER_GRADLE_VERSION:-9.1.0}" + JAVA_VERSION: "${DOCKER_JAVA_VERSION:-21}" + VERSION: "${DOCKER_VERSION:-1.0.0-SNAPSHOT}" + BUILD_DATE: "${DOCKER_BUILD_DATE}" + labels: + - "org.opencontainers.image.created=${DOCKER_BUILD_DATE}" + container_name: "${PROJECT_NAME:-meldestelle}-gateway" + restart: "${RESTART_POLICY:-no}" ports: - - "${GATEWAY_SERVER_PORT}" - - "${GATEWAY_DEBUG_PORT}" + - "${GATEWAY_PORT:-8081:8081}" + - "${GATEWAY_DEBUG_PORT:-5005:5005}" environment: # server.port must be an integer. Do not pass host:container mapping here. - SERVER_PORT: "8081" - SPRING_PROFILES_ACTIVE: "docker" - DEBUG: "true" + SERVER_PORT: "${GATEWAY_SERVER_PORT:-8081}" + SPRING_PROFILES_ACTIVE: "${GATEWAY_SPRING_PROFILES_ACTIVE:-docker}" + DEBUG: "${GATEWAY_DEBUG:-true}" # --- KEYCLOAK --- # Container-zu-Container Kommunikation (intern) - SPRING_SECURITY_OAUTH2_RESOURCESERVER_JWT_ISSUER_URI: "http://keycloak:8080/realms/meldestelle" + SPRING_SECURITY_OAUTH2_RESOURCESERVER_JWT_ISSUER_URI: "${SSEC_ISSUER_URI:-http://keycloak:8080/realms/meldestelle}" # JWK Set Uri erzwingen, damit er nicht über den Issuer (localhost vs keycloak) stolpert - SPRING_SECURITY_OAUTH2_RESOURCESERVER_JWT_JWK_SET_URI: "http://keycloak:8080/realms/meldestelle/protocol/openid-connect/certs" + SPRING_SECURITY_OAUTH2_RESOURCESERVER_JWT_JWK_SET_URI: "${SSEC_JWK_SET_URI:-http://keycloak:8080/realms/meldestelle/protocol/openid-connect/certs}" # --- CONSUL --- - SPRING_CLOUD_CONSUL_HOST: "consul" + SPRING_CLOUD_CONSUL_HOST: "${CONSUL_HOST:-consul}" # Consul port must be an integer (container internal port) - SPRING_CLOUD_CONSUL_PORT: "8500" - # WICHTIG: Das Gateway muss wissen, wie es von anderen Containern erreicht wird (nicht localhost!) - SPRING_CLOUD_CONSUL_DISCOVERY_HOSTNAME: "api-gateway" + SPRING_CLOUD_CONSUL_PORT: "${CONSUL_HTTP_PORT:-8500}" + # Registrierungsname in Consul + SPRING_CLOUD_CONSUL_DISCOVERY_SERVICE_NAME: "${GATEWAY_SERVICE_NAME:-api-gateway}" # Wichtig für Docker: Wir wollen IP-Adressen registrieren, keine Hostnames, die DNS brauchen - SPRING_CLOUD_CONSUL_DISCOVERY_PREFER_IP_ADDRESS: "true" + SPRING_CLOUD_CONSUL_DISCOVERY_PREFER_IP_ADDRESS: "${GATEWAY_CONSUL_PREFER_IP:-true}" # --- POSTGRES --- - SPRING_DATASOURCE_URL: "jdbc:postgresql://postgres:5432/${POSTGRES_DB}" - SPRING_DATASOURCE_USERNAME: "${POSTGRES_USER}" - SPRING_DATASOURCE_PASSWORD: "${POSTGRES_PASSWORD}" + SPRING_DATASOURCE_URL: "${POSTGRES_DB_URL:-jdbc:postgresql://postgres:5432/pg-meldestelle-db}" + SPRING_DATASOURCE_USERNAME: "${POSTGRES_USER:-pg-user}" + SPRING_DATASOURCE_PASSWORD: "${POSTGRES_PASSWORD:-pg-password}" + + # --- REDIS --- + SPRING_DATA_REDIS_HOST: "${REDIS_SERVER_HOSTNAME:-redis}" + SPRING_DATA_REDIS_PORT: "${REDIS_SERVICE_PORT:-6379}" + SPRING_DATA_REDIS_PASSWORD: "${REDIS_PASSWORD:-redis-password}" + SPRING_DATA_REDIS_CONNECT_TIMEOUT: "${REDIS_SERVER_CONNECT_TIMEOUT:-5s}" # --- LOGGING --- LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_CLOUD_GATEWAY: "DEBUG" LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_SECURITY: "DEBUG" depends_on: - consul: - condition: "service_healthy" postgres: condition: "service_healthy" keycloak: condition: "service_healthy" + consul: + condition: "service_healthy" + redis: + condition: "service_healthy" + networks: meldestelle-network: aliases: @@ -258,54 +265,57 @@ services: # ========================================== ping-service: build: - context: .. + context: . dockerfile: backend/services/ping/Dockerfile args: - GRADLE_VERSION: 9.1.0 - JAVA_VERSION: 21 - VERSION: 1.0.0 - BUILD_DATE: "2025-11-29" - container_name: ${PROJECT_NAME}-ping-service - restart: "${RESTART_POLICY}" + # Build-Args aus deinen .env Dateien (werden hier statisch benötigt für den Build) + GRADLE_VERSION: "${DOCKER_GRADLE_VERSION:-9.1.0}" + JAVA_VERSION: "${DOCKER_JAVA_VERSION:-21}" + VERSION: "${DOCKER_VERSION:-1.0.0-SNAPSHOT}" + BUILD_DATE: "${DOCKER_BUILD_DATE}" + labels: + - "org.opencontainers.image.created=${DOCKER_BUILD_DATE}" + container_name: "${PROJECT_NAME:-meldestelle}-ping-service" + restart: "${RESTART_POLICY:-no}" ports: - - "${PING_PORT}" - - "${PING_DEBUG_PORT}" + - "${PING_PORT:-8082:8082}" + - "${PING_DEBUG_PORT:-5006:5006}" environment: - SPRING_PROFILES_ACTIVE: docker - DEBUG: "true" - SERVER_PORT: 8082 + SPRING_PROFILES_ACTIVE: "${PING_SPRING_PROFILES_ACTIVE:-docker}" + DEBUG: "${PING_DEBUG:-true}" + SERVER_PORT: "${PING_SERVER_PORT:-8082}" # --- CONSUL --- - SPRING_CLOUD_CONSUL_HOST: consul - SPRING_CLOUD_CONSUL_PORT: 8500 - SPRING_CLOUD_CONSUL_DISCOVERY_HOSTNAME: ping-service + SPRING_CLOUD_CONSUL_HOST: "${CONSUL_HOST:-consul}" + SPRING_CLOUD_CONSUL_PORT: "${CONSUL_HTTP_PORT:-8500}" + SPRING_CLOUD_CONSUL_DISCOVERY_SERVICE_NAME: "${PING_SERVICE_NAME:-ping-service}" + SPRING_CLOUD_CONSUL_DISCOVERY_PREFER_IP_ADDRESS: "${PING_CONSUL_PREFER_IP:-true}" # - DATENBANK VERBINDUNG - - SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/${POSTGRES_DB} - SPRING_DATASOURCE_USERNAME: ${POSTGRES_USER} - SPRING_DATASOURCE_PASSWORD: ${POSTGRES_PASSWORD} - SPRING_JPA_HIBERNATE_DDL_AUTO: validate + SPRING_DATASOURCE_URL: "${POSTGRES_DB_URL:-jdbc:postgresql://postgres:5432/pg-meldestelle-db}" + SPRING_DATASOURCE_USERNAME: "${POSTGRES_USER:-pg-user}" + SPRING_DATASOURCE_PASSWORD: "${POSTGRES_PASSWORD:-pg-password}" # --- REDIS --- - SPRING_DATA_REDIS_HOST: redis - SPRING_DATA_REDIS_PORT: 6379 - # Optional: if REDIS_PASSWORD is set in .env, forward it to Spring - SPRING_DATA_REDIS_PASSWORD: "${REDIS_PASSWORD}" - # Make initial connection a bit more tolerant on startup races - SPRING_DATA_REDIS_CONNECT_TIMEOUT: 5s + SPRING_DATA_REDIS_HOST: "${REDIS_SERVER_HOSTNAME:-redis}" + SPRING_DATA_REDIS_PORT: "${REDIS_SERVICE_PORT:-6379}" + SPRING_DATA_REDIS_PASSWORD: "${REDIS_PASSWORD:-redis-password}" + SPRING_DATA_REDIS_CONNECT_TIMEOUT: "${REDIS_SERVER_CONNECT_TIMEOUT:-5s}" + depends_on: - consul: - condition: service_healthy postgres: - condition: service_healthy + condition: "service_healthy" keycloak: - condition: service_healthy + condition: "service_healthy" + consul: + condition: "service_healthy" redis: - condition: service_healthy + condition: "service_healthy" + networks: meldestelle-network: aliases: - - ping-service + - "ping-service" # ========================================== # FRONTEND @@ -317,44 +327,51 @@ services: context: .. dockerfile: ../config/frontends/web-app/Dockerfile args: - GRADLE_VERSION: ${DOCKER_GRADLE_VERSION:-9.1.0} - JAVA_VERSION: ${DOCKER_JAVA_VERSION:-21} - NODE_VERSION: ${DOCKER_NODE_VERSION:-22.21.0} - NGINX_IMAGE_TAG: ${DOCKER_NGINX_VERSION:-1.28.0-alpine} - WEB_BUILD_PROFILE: ${WEB_BUILD_PROFILE:-dev} - container_name: ${PROJECT_NAME}-web-app - restart: "${RESTART_POLICY}" + GRADLE_VERSION: "${DOCKER_GRADLE_VERSION:-9.1.0}" + JAVA_VERSION: "${DOCKER_JAVA_VERSION:-21}" + NODE_VERSION: "${DOCKER_NODE_VERSION:-22.21.0}" + NGINX_IMAGE_TAG: "${DOCKER_NGINX_VERSION:-1.28.0-alpine}" + WEB_BUILD_PROFILE: "${WEB_BUILD_PROFILE:-dev}" + BUILD_DATE: "${DOCKER_BUILD_DATE}" + labels: + - "org.opencontainers.image.created=${DOCKER_BUILD_DATE}" + container_name: "${PROJECT_NAME:-meldestelle}-web-app" + restart: "${RESTART_POLICY:-no}" ports: - - "${WEB_APP_PORT}" + - "${WEB_APP_PORT:-4000:80}" volumes: # Mount production nginx config (can be adjusted per env) - - ../config/nginx/nginx.prod.conf:/etc/nginx/nginx.conf:Z,ro + - ../config/frontends/web-app/nginx.conf:/etc/nginx/nginx.conf:Z,ro depends_on: api-gateway: - condition: service_started + condition: "service_started" networks: meldestelle-network: aliases: - - web-app + - "web-app" desktop-app: build: context: .. dockerfile: ../config/frontends/desktop-app/Dockerfile - container_name: ${PROJECT_NAME}-desktop-app - restart: "${RESTART_POLICY}" + args: + BUILD_DATE: "${DOCKER_BUILD_DATE}" + labels: + - "org.opencontainers.image.created=${DOCKER_BUILD_DATE}" + container_name: "${PROJECT_NAME:-meldestelle}-desktop-app" + restart: "${RESTART_POLICY:-no}" environment: - API_BASE_URL: http://api-gateway:8081 + API_BASE_URL: "http://api-gateway:8081" ports: - - "${DESKTOP_APP_VNC_PORT}" - - "${DESKTOP_APP_NOVNC_PORT}" + - "${DESKTOP_APP_VNC_PORT:-5900:5900}" + - "${DESKTOP_APP_NOVNC_PORT:-6080:6080}" depends_on: api-gateway: - condition: service_started + condition: "service_started" networks: meldestelle-network: aliases: - - desktop-app + - "desktop-app" volumes: postgres-data: diff --git a/gradle.properties b/gradle.properties index a3feea9e..84e06a23 100644 --- a/gradle.properties +++ b/gradle.properties @@ -60,19 +60,6 @@ org.jetbrains.compose.experimental.wasm.enabled=true org.gradle.java.installations.auto-download=true org.gradle.java.installations.auto-detect=true -# ============================================================================= -# Infrastructure Port Management -# ============================================================================= -infrastructure.gateway.port=8081 -infrastructure.consul.port=8500 - -# Service Port Ranges -services.port.start=8082 -services.port.ping=8082 -services.port.members=8083 -services.port.horses=8084 -services.port.events=8085 - # Development Environment Support dev.port.offset=0 # Set dev.port.offset=100 for second developer @@ -82,4 +69,5 @@ enableWasm=false # Dokka Gradle plugin V2 mode (with helpers for V1 compatibility) # See https://kotl.in/dokka-gradle-migration -org.jetbrains.dokka.experimental.gradle.pluginMode=V2EnabledWithHelpers +# org.jetbrains.dokka.experimental.gradle.pluginMode=V2EnabledWithHelpers +org.jetbrains.dokka.experimental.gradle.pluginMode=V2Enabled