95fe3e0573
* chore(MP-21): snapshot pre-refactor state (Epic 1)
* chore(MP-22): scaffold new repo structure, relocate Docker Compose, move frontend/backend modules, update Makefile; add docs mapping and env template
* MP-22 Epic 2: Erfolgreich umgesetzt und verifiziert
* MP-23 Epic 3: Gradle/Build Governance zentralisieren
* MP-23 Epic 3: Gradle/Build Governance zentralisieren
* chore(devops)!: Docker-SSoT (.env) konsolidiert, Compose-Mounts ergänzt, Makefile entfernt
- ENV Single Source of Truth
- docker/.env.example neu (inkl. REDIS_PASSWORD, Ports, Build-Overrides)
- config/.env(.example) als DEPRECATED markiert (Verweis auf docker/.env[.example])
- Docker Compose vereinheitlicht (docker/docker-compose.yaml)
- Postgres: zentralen postgresql.conf mounten (../config/postgres/postgresql.conf)
und Start mit -c config_file=/etc/postgresql/postgresql.conf
- Redis: zentralen redis.conf mounten (../config/redis/redis.conf)
und Start via "redis-server … ${REDIS_PASSWORD:+--requirepass $REDIS_PASSWORD}"
- Web-Nginx: ../config/nginx/nginx.prod.conf → /etc/nginx/nginx.conf (ro)
- Monitoring: Prometheus/Grafana nutzen ../config/monitoring/* als SSoT
- Frontend/DI/Network (MP-23 Grundlage)
- :frontend:core:network Modul mit Koin `apiClient` (Ktor + JSON/Retry/Timeout/Logging)
- Plattform-Basis-URL-Auflösung (JVM: ENV API_BASE_URL; JS: globalThis.API_BASE_URL / Same-Origin)
- Web index.html setzt API_BASE_URL (Query `?apiBaseUrl=…` > Same-Origin > Fallback)
- Build/Gradle & Module-Refs
- settings.gradle.kts: neue Frontend-/Backend-Pfade bereits inkludiert
- Features/Shell: Abhängigkeiten auf :frontend:shared / :frontend:core:* angepasst
- Ping-API-Refs auf :backend:services:ping:ping-api vereinheitlicht
- Dockerfiles angepasst
- backend/infrastructure/gateway/Dockerfile → Tasks/Pfade auf :backend:gateway
- backend/services/ping/Dockerfile → Tasks/Pfade auf :backend:services:ping:ping-service
- Static Analysis / Guards
- config/detekt/detekt.yml hinzugefügt
- Leichter Arch-Guard (Frontend) gegen manuelle Authorization-Header vorbereitet
- Doku
- docs/ARCHITECTURE.md (Struktur, Mapping, Next Steps) ergänzt
- docs/adr/README.md angelegt
BREAKING CHANGES:
- Makefile komplett entfernt (bitte direkt `docker compose` verwenden)
- ENV-Quelle ist jetzt docker/.env (statt config/.env oder Root)
- Compose-Datei unter docker/docker-compose.yaml (nicht mehr compose.yaml im Repo-Root)
Verifikation (lokal):
- ENV anlegen: `cp docker/.env.example docker/.env` (Werte anpassen)
- Compose prüfen: `docker compose --env-file docker/.env -f docker/docker-compose.yaml config`
- Infrastruktur: `docker compose --env-file docker/.env -f docker/docker-compose.yaml -p meldestelle up -d postgres redis keycloak web-app`
- Services bauen: `docker compose --env-file docker/.env -f docker/docker-compose.yaml -p meldestelle build api-gateway ping-service --no-cache --progress=plain`
Refs: MP-22 (Epic 2), MP-23 (Epic 3)
* chore(devops)!: Docker-SSoT (.env) konsolidiert, Compose-Mounts ergänzt, Makefile entfernt
- ENV Single Source of Truth
- docker/.env.example neu (inkl. REDIS_PASSWORD, Ports, Build-Overrides)
- config/.env(.example) als DEPRECATED markiert (Verweis auf docker/.env[.example])
- Docker Compose vereinheitlicht (docker/docker-compose.yaml)
- Postgres: zentralen postgresql.conf mounten (../config/postgres/postgresql.conf)
und Start mit -c config_file=/etc/postgresql/postgresql.conf
- Redis: zentralen redis.conf mounten (../config/redis/redis.conf)
und Start via "redis-server … ${REDIS_PASSWORD:+--requirepass $REDIS_PASSWORD}"
- Web-Nginx: ../config/nginx/nginx.prod.conf → /etc/nginx/nginx.conf (ro)
- Monitoring: Prometheus/Grafana nutzen ../config/monitoring/* als SSoT
- Frontend/DI/Network (MP-23 Grundlage)
- :frontend:core:network Modul mit Koin `apiClient` (Ktor + JSON/Retry/Timeout/Logging)
- Plattform-Basis-URL-Auflösung (JVM: ENV API_BASE_URL; JS: globalThis.API_BASE_URL / Same-Origin)
- Web index.html setzt API_BASE_URL (Query `?apiBaseUrl=…` > Same-Origin > Fallback)
- Build/Gradle & Module-Refs
- settings.gradle.kts: neue Frontend-/Backend-Pfade bereits inkludiert
- Features/Shell: Abhängigkeiten auf :frontend:shared / :frontend:core:* angepasst
- Ping-API-Refs auf :backend:services:ping:ping-api vereinheitlicht
- Dockerfiles angepasst
- backend/infrastructure/gateway/Dockerfile → Tasks/Pfade auf :backend:gateway
- backend/services/ping/Dockerfile → Tasks/Pfade auf :backend:services:ping:ping-service
- Static Analysis / Guards
- config/detekt/detekt.yml hinzugefügt
- Leichter Arch-Guard (Frontend) gegen manuelle Authorization-Header vorbereitet
- Doku
- docs/ARCHITECTURE.md (Struktur, Mapping, Next Steps) ergänzt
- docs/adr/README.md angelegt
BREAKING CHANGES:
- Makefile komplett entfernt (bitte direkt `docker compose` verwenden)
- ENV-Quelle ist jetzt docker/.env (statt config/.env oder Root)
- Compose-Datei unter docker/docker-compose.yaml (nicht mehr compose.yaml im Repo-Root)
Verifikation (lokal):
- ENV anlegen: `cp docker/.env.example docker/.env` (Werte anpassen)
- Compose prüfen: `docker compose --env-file docker/.env -f docker/docker-compose.yaml config`
- Infrastruktur: `docker compose --env-file docker/.env -f docker/docker-compose.yaml -p meldestelle up -d postgres redis keycloak web-app`
- Services bauen: `docker compose --env-file docker/.env -f docker/docker-compose.yaml -p meldestelle build api-gateway ping-service --no-cache --progress=plain`
Refs: MP-22 (Epic 2), MP-23 (Epic 3)
* chore(devops)!: Docker-SSoT (.env) konsolidiert, Compose-Mounts ergänzt, Makefile entfernt
- ENV Single Source of Truth
- docker/.env.example neu (inkl. REDIS_PASSWORD, Ports, Build-Overrides)
- config/.env(.example) als DEPRECATED markiert (Verweis auf docker/.env[.example])
- Docker Compose vereinheitlicht (docker/docker-compose.yaml)
- Postgres: zentralen postgresql.conf mounten (../config/postgres/postgresql.conf)
und Start mit -c config_file=/etc/postgresql/postgresql.conf
- Redis: zentralen redis.conf mounten (../config/redis/redis.conf)
und Start via "redis-server … ${REDIS_PASSWORD:+--requirepass $REDIS_PASSWORD}"
- Web-Nginx: ../config/nginx/nginx.prod.conf → /etc/nginx/nginx.conf (ro)
- Monitoring: Prometheus/Grafana nutzen ../config/monitoring/* als SSoT
- Frontend/DI/Network (MP-23 Grundlage)
- :frontend:core:network Modul mit Koin `apiClient` (Ktor + JSON/Retry/Timeout/Logging)
- Plattform-Basis-URL-Auflösung (JVM: ENV API_BASE_URL; JS: globalThis.API_BASE_URL / Same-Origin)
- Web index.html setzt API_BASE_URL (Query `?apiBaseUrl=…` > Same-Origin > Fallback)
- Build/Gradle & Module-Refs
- settings.gradle.kts: neue Frontend-/Backend-Pfade bereits inkludiert
- Features/Shell: Abhängigkeiten auf :frontend:shared / :frontend:core:* angepasst
- Ping-API-Refs auf :backend:services:ping:ping-api vereinheitlicht
- Dockerfiles angepasst
- backend/infrastructure/gateway/Dockerfile → Tasks/Pfade auf :backend:gateway
- backend/services/ping/Dockerfile → Tasks/Pfade auf :backend:services:ping:ping-service
- Static Analysis / Guards
- config/detekt/detekt.yml hinzugefügt
- Leichter Arch-Guard (Frontend) gegen manuelle Authorization-Header vorbereitet
- Doku
- docs/ARCHITECTURE.md (Struktur, Mapping, Next Steps) ergänzt
- docs/adr/README.md angelegt
BREAKING CHANGES:
- Makefile komplett entfernt (bitte direkt `docker compose` verwenden)
- ENV-Quelle ist jetzt docker/.env (statt config/.env oder Root)
- Compose-Datei unter docker/docker-compose.yaml (nicht mehr compose.yaml im Repo-Root)
Verifikation (lokal):
- ENV anlegen: `cp docker/.env.example docker/.env` (Werte anpassen)
- Compose prüfen: `docker compose --env-file docker/.env -f docker/docker-compose.yaml config`
- Infrastruktur: `docker compose --env-file docker/.env -f docker/docker-compose.yaml -p meldestelle up -d postgres redis keycloak web-app`
- Services bauen: `docker compose --env-file docker/.env -f docker/docker-compose.yaml -p meldestelle build api-gateway ping-service --no-cache --progress=plain`
Refs: MP-22 (Epic 2), MP-23 (Epic 3)
* chore(ci): Workflows an Docker-SSoT & neue Struktur angepasst, minimaler SSoT-Guard
- ssot-guard.yml: Option B (minimal) → `docker compose -f docker/docker-compose.yaml config` als Lint
- integration-tests.yml: `./gradlew staticAnalysis` vor Integrationstests
- docs-kdoc-sync.yml: Dokka-Task Fallback (dokkaGfmAll || dokkaGfm), YouTrack-Sync nur wenn Script vorhanden
- deploy-proxmox.yml: Compose-Pfade auf docker/docker-compose.yaml + `--env-file docker/.env`; Build/Test Schritte vereinheitlicht
- ci-main.yml: SSoT-Skripte per `if: hashFiles(...)` guarded, Compose-Lint Fallback; OpenAPI‑Pfad → backend/gateway; ADR‑Pfade → docs/adr/**; `staticAnalysis` in Build integriert
- youtrack-sync.yml: unverändert (funktional)
Refs: MP-22, MP-23
* chore(ci): Workflows an Docker-SSoT & neue Struktur angepasst, minimaler SSoT-Guard
- ssot-guard.yml: Option B (minimal) → `docker compose -f docker/docker-compose.yaml config` als Lint
- integration-tests.yml: `./gradlew staticAnalysis` vor Integrationstests
- docs-kdoc-sync.yml: Dokka-Task Fallback (dokkaGfmAll || dokkaGfm), YouTrack-Sync nur wenn Script vorhanden
- deploy-proxmox.yml: Compose-Pfade auf docker/docker-compose.yaml + `--env-file docker/.env`; Build/Test Schritte vereinheitlicht
- ci-main.yml: SSoT-Skripte per `if: hashFiles(...)` guarded, Compose-Lint Fallback; OpenAPI‑Pfad → backend/gateway; ADR‑Pfade → docs/adr/**; `staticAnalysis` in Build integriert
- youtrack-sync.yml: unverändert (funktional)
Refs: MP-22, MP-23
* fix(ci): create .env from example before validating compose config
* fix(ci): update ssot-guard filename (.yaml) and sync workflow state
* fixing
* fix(webpack): correct sql.js fallback configuration for webpack 5
338 lines
10 KiB
YAML
338 lines
10 KiB
YAML
name: ${COMPOSE_PROJECT_NAME:-meldestelle}
|
|
|
|
services:
|
|
# ==========================================
|
|
# CORE INFRASTRUCTURE
|
|
# ==========================================
|
|
postgres:
|
|
image: postgres:16-alpine
|
|
container_name: ${COMPOSE_PROJECT_NAME}-postgres
|
|
restart: unless-stopped
|
|
ports:
|
|
- "${POSTGRES_PORT}"
|
|
environment:
|
|
POSTGRES_USER: ${POSTGRES_USER}
|
|
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
|
POSTGRES_DB: ${POSTGRES_DB}
|
|
volumes:
|
|
- postgres-data:/var/lib/postgresql/data
|
|
- ./core/postgres:/docker-entrypoint-initdb.d:Z
|
|
# Central postgres.conf from config (optional)
|
|
- ../config/postgres/postgresql.conf:/etc/postgresql/postgresql.conf:Z
|
|
# Use central postgresql.conf if present
|
|
command: ["postgres", "-c", "config_file=/etc/postgresql/postgresql.conf"]
|
|
healthcheck:
|
|
test: [ "CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}" ]
|
|
interval: 5s
|
|
timeout: 5s
|
|
retries: 5
|
|
start_period: 10s
|
|
networks:
|
|
meldestelle-network:
|
|
aliases:
|
|
- postgres
|
|
|
|
redis:
|
|
image: redis:8.4-alpine
|
|
container_name: ${COMPOSE_PROJECT_NAME}-redis
|
|
restart: unless-stopped
|
|
ports:
|
|
- "${REDIS_PORT}"
|
|
volumes:
|
|
- redis-data:/data
|
|
# Central redis config
|
|
- ../config/redis/redis.conf:/usr/local/etc/redis/redis.conf:Z
|
|
# Use central redis.conf and optionally add --requirepass if REDIS_PASSWORD is set
|
|
command: ["sh", "-lc", "exec redis-server /usr/local/etc/redis/redis.conf ${REDIS_PASSWORD:+--requirepass $REDIS_PASSWORD}"]
|
|
healthcheck:
|
|
test: [ "CMD", "redis-cli" ]
|
|
interval: 5s
|
|
timeout: 5s
|
|
retries: 3
|
|
networks:
|
|
meldestelle-network:
|
|
aliases:
|
|
- redis
|
|
|
|
# ==========================================
|
|
# SECURITY
|
|
# ==========================================
|
|
keycloak:
|
|
image: quay.io/keycloak/keycloak:26.4
|
|
container_name: ${COMPOSE_PROJECT_NAME}-keycloak
|
|
restart: unless-stopped
|
|
environment:
|
|
KC_HEALTH_ENABLED: true
|
|
KC_METRICS_ENABLED: true
|
|
# 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/${POSTGRES_DB}
|
|
KC_DB_USERNAME: ${POSTGRES_USER}
|
|
KC_DB_PASSWORD: ${POSTGRES_PASSWORD}
|
|
KC_HOSTNAME: ${KC_HOSTNAME}
|
|
ports:
|
|
- "${KC_PORT}"
|
|
depends_on:
|
|
postgres:
|
|
condition: service_healthy
|
|
volumes:
|
|
- ./core/keycloak:/opt/keycloak/data/import:Z
|
|
command: start-dev --import-realm
|
|
healthcheck:
|
|
test: [ "CMD-SHELL", "exec 3<>/dev/tcp/127.0.0.1/9000" ]
|
|
interval: 10s
|
|
timeout: 5s
|
|
retries: 5
|
|
start_period: 60s
|
|
networks:
|
|
meldestelle-network:
|
|
aliases:
|
|
- keycloak
|
|
|
|
# ==========================================
|
|
# MONITORING & TOOLS
|
|
# ==========================================
|
|
pgadmin:
|
|
image: dpage/pgadmin4:8
|
|
container_name: ${COMPOSE_PROJECT_NAME}-pgadmin
|
|
restart: unless-stopped
|
|
ports:
|
|
- "${PGADMIN_PORT:-8888:80}"
|
|
environment:
|
|
PGADMIN_DEFAULT_EMAIL: ${PGADMIN_EMAIL}
|
|
PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_PASSWORD}
|
|
volumes:
|
|
- pgadmin-data:/var/lib/pgadmin
|
|
networks:
|
|
meldestelle-network:
|
|
aliases:
|
|
- pgadmin
|
|
|
|
prometheus:
|
|
image: prom/prometheus:v3.7.3
|
|
container_name: ${COMPOSE_PROJECT_NAME}-prometheus
|
|
restart: unless-stopped
|
|
ports:
|
|
- "${PROMETHEUS_PORT}"
|
|
volumes:
|
|
- prometheus-data:/prometheus
|
|
# Use central config as single source of truth
|
|
- ../config/monitoring/prometheus:/etc/prometheus:Z
|
|
command:
|
|
- --config.file=/etc/prometheus/prometheus.yml
|
|
- --storage.tsdb.retention.time=15d
|
|
healthcheck:
|
|
test: [ "CMD", "wget", "--spider", "-q", "http://localhost:9090/-/healthy" ]
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 3
|
|
start_period: 30s
|
|
networks:
|
|
meldestelle-network:
|
|
aliases:
|
|
- prometheus
|
|
|
|
grafana:
|
|
image: grafana/grafana:12.3
|
|
container_name: ${COMPOSE_PROJECT_NAME}-grafana
|
|
restart: unless-stopped
|
|
environment:
|
|
GF_SECURITY_ADMIN_USER: ${GF_ADMIN_USER}
|
|
GF_SECURITY_ADMIN_PASSWORD: ${GF_ADMIN_PASSWORD}
|
|
ports:
|
|
- "${GF_PORT}"
|
|
volumes:
|
|
- grafana-data:/var/lib/grafana
|
|
# Provisioning (datasources/dashboards) from central config
|
|
- ../config/monitoring/grafana/provisioning:/etc/grafana/provisioning:Z
|
|
# Dashboards directory (referenced by provisioning file path: /var/lib/grafana/dashboards)
|
|
- ../config/monitoring/grafana/dashboards:/var/lib/grafana/dashboards:Z
|
|
depends_on:
|
|
- prometheus
|
|
healthcheck:
|
|
test: [ "CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3000/api/health" ]
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 3
|
|
start_period: 30s
|
|
networks:
|
|
meldestelle-network:
|
|
aliases:
|
|
- grafana
|
|
|
|
# ==========================================
|
|
# APPLICATION GATEWAY
|
|
# ==========================================
|
|
|
|
consul:
|
|
image: hashicorp/consul:1.22.1
|
|
container_name: ${COMPOSE_PROJECT_NAME}-consul
|
|
restart: unless-stopped
|
|
ports:
|
|
- "${CONSUL_PORT}"
|
|
command: agent -server -bind=0.0.0.0 -client=0.0.0.0 -bootstrap-expect=1 -ui
|
|
healthcheck:
|
|
test: [ "CMD", "curl", "-f", "http://localhost:8500/v1/status/leader" ]
|
|
interval: 10s
|
|
timeout: 5s
|
|
retries: 3
|
|
networks:
|
|
meldestelle-network:
|
|
aliases:
|
|
- consul
|
|
|
|
api-gateway:
|
|
build:
|
|
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
|
|
BUILD_DATE: "2025-11-29"
|
|
container_name: ${COMPOSE_PROJECT_NAME}-gateway
|
|
restart: no
|
|
ports:
|
|
- "${GATEWAY_PORT}"
|
|
- "${GATEWAY_DEBUG_PORT}" # Für Remote Debugging
|
|
environment:
|
|
SERVER_PORT: ${GATEWAY_SERVER_PORT}
|
|
SPRING_PROFILES_ACTIVE: docker
|
|
DEBUG: "true"
|
|
# --- VERBINDUNGEN ---
|
|
# Keycloak URL (INTERN im Docker Netzwerk!)
|
|
# Beachte: http://container-name:8080 (nicht localhost, nicht 8180)
|
|
SPRING_SECURITY_OAUTH2_RESOURCESERVER_JWT_ISSUER_URI: http://keycloak:8080/realms/meldestelle
|
|
SPRING_CLOUD_CONSUL_HOST: consul
|
|
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
|
|
# Postgres Verbindung (für Routes/Session, falls nötig)
|
|
SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/${POSTGRES_DB}
|
|
SPRING_DATASOURCE_USERNAME: ${POSTGRES_USER}
|
|
SPRING_DATASOURCE_PASSWORD: ${POSTGRES_PASSWORD}
|
|
# 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
|
|
networks:
|
|
meldestelle-network:
|
|
aliases:
|
|
- api-gateway
|
|
|
|
# ==========================================
|
|
# MICROSERVICES
|
|
# ==========================================
|
|
ping-service:
|
|
build:
|
|
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: ${COMPOSE_PROJECT_NAME}-ping-service
|
|
restart: no # "${RESTART_POLICY:-unless-stopped}"
|
|
ports:
|
|
- "${PING_SERVICE_PORT}"
|
|
- "${PING_DEBUG_PORT}"
|
|
environment:
|
|
SPRING_PROFILES_ACTIVE: docker
|
|
DEBUG: "true"
|
|
SERVER_PORT: 8082
|
|
|
|
# --- CONSUL ---
|
|
SPRING_CLOUD_CONSUL_HOST: consul
|
|
SPRING_CLOUD_CONSUL_PORT: 8500
|
|
SPRING_CLOUD_CONSUL_DISCOVERY_HOSTNAME: ping-service
|
|
|
|
# - 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
|
|
|
|
# --- REDIS ---
|
|
SPRING_DATA_REDIS_HOST: redis
|
|
SPRING_DATA_REDIS_PORT: 6379
|
|
depends_on:
|
|
consul:
|
|
condition: service_healthy
|
|
postgres:
|
|
condition: service_healthy
|
|
keycloak:
|
|
condition: service_healthy
|
|
networks:
|
|
meldestelle-network:
|
|
aliases:
|
|
- ping-service
|
|
|
|
# ==========================================
|
|
# CLIENT APPLICATIONS
|
|
# ==========================================
|
|
web-app:
|
|
build:
|
|
context: ..
|
|
dockerfile: docker/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: ${COMPOSE_PROJECT_NAME}-web-app
|
|
restart: unless-stopped
|
|
ports:
|
|
- "${WEB_APP_PORT}"
|
|
volumes:
|
|
# Mount production nginx config (can be adjusted per env)
|
|
- ../config/nginx/nginx.prod.conf:/etc/nginx/nginx.conf:Z,ro
|
|
depends_on:
|
|
api-gateway:
|
|
condition: service_started
|
|
networks:
|
|
meldestelle-network:
|
|
aliases:
|
|
- web-app
|
|
|
|
desktop-app:
|
|
build:
|
|
context: ..
|
|
dockerfile: docker/frontends/desktop-app/Dockerfile
|
|
container_name: ${COMPOSE_PROJECT_NAME}-desktop-app
|
|
restart: unless-stopped
|
|
environment:
|
|
API_BASE_URL: http://api-gateway:8081
|
|
ports:
|
|
- "${DESKTOP_APP_VNC_PORT}"
|
|
- "${DESKTOP_APP_NOVNC_PORT}"
|
|
depends_on:
|
|
api-gateway:
|
|
condition: service_started
|
|
networks:
|
|
meldestelle-network:
|
|
aliases:
|
|
- desktop-app
|
|
|
|
volumes:
|
|
postgres-data:
|
|
pgadmin-data:
|
|
redis-data:
|
|
prometheus-data:
|
|
grafana-data:
|
|
|
|
networks:
|
|
meldestelle-network:
|
|
driver: bridge
|