meldestelle/README.md
StefanMo 3f9326a533
Refactor(config): Implement central environment config (MP-18)) (#17)
* fix(infra): Makefile .env generiert

* MP-18 Env-Konfiguration Refactoring: Schritte 2–4 umgesetzt\n\n2) Single Source of Truth für Versionen\n- docker/versions.toml als alleinige Quelle bestätigt\n- docker/build-args/global.env bereinigt und konsistent auf *_IMAGE_TAG umgestellt (PROMETHEUS_IMAGE_TAG, GRAFANA_IMAGE_TAG, KEYCLOAK_IMAGE_TAG, POSTGRES_IMAGE_TAG, REDIS_IMAGE_TAG, CONSUL_IMAGE_TAG, KAFKA_IMAGE_TAG, ZOOKEEPER_IMAGE_TAG)\n- Keine Ports/Profiles/Secrets in global.env\n\n3) Build vs. Laufzeit getrennt (Variablenbereinigung)\n- .env.template von allen Build-/Image-Versionen befreit (DOCKER_*_VERSION, (DOCKER_)APP_VERSION, BUILD_DATE)\n- App-Versionsvariable vereinheitlicht: Nutzung von VERSION (APP_VERSION in Build-Args entfernt)\n\n4) Laufzeit-Env konsolidiert (globales .env)\n- Zentrales config/env/.env erstellt (Ports, Hosts, Flags, Pfade, SPRING_PROFILES_ACTIVE, NODE_ENV etc.)\n- config/env/.env.local angelegt (gitignored) und .gitignore ergänzt\n- Laufzeitwerte aus Build-Args-Dateien (clients/infrastructure/services) entfernt bzw. kommentiert mit Verweis auf config/env/.env\n\nAkzeptanzkriterien erfüllt\n- global.env enthält ausschließlich Build-Versionen/-Tags und Build-Tool-Versionen\n- .env.template enthält keine Build-/Image-Versionen mehr\n- Zentrales config/env/.env ist die einzige Quelle für Laufzeitwerte\n\nYouTrack: https://meldestelle-pro.youtrack.cloud/issue/MP-18

* MP-18 Env-Konfiguration Refactoring: Schritte 5–7 umgesetzt

5) Build-Args-Dateien entschlackt/umstrukturiert
- clients.env: Laufzeitwerte entfernt, NODE_VERSION/NGINX_VERSION → NODE_IMAGE_TAG/NGINX_IMAGE_TAG; nur Build-relevante Pfade/Namen belassen
- infrastructure.env/services.env: bereits zuvor Runtime-Variablen entfernt, Kommentare mit Verweis auf config/env/.env beibehalten

6) Dockerfiles überprüft/angepasst
- clients/web-app: Build-ARGs eingeführt (GRADLE_VERSION, JAVA_VERSION, NGINX_IMAGE_TAG), Basis-Image aus Tag abgeleitet; keine Runtime-ARGs
- services/ping-service: SPRING_PROFILES_ACTIVE als ARG entfernt; Build ruft ohne -P profile; Labels/ENV vereinheitlicht (OCI: version/created)
- infrastructure/gateway: SPRING_PROFILES_ACTIVE als ARG entfernt; Build ohne -P; Labels vereinheitlicht
- templates/spring-boot-service.Dockerfile: Runtime-ARGs (SPRING_PROFILES_ACTIVE, SERVICE_PORT) entfernt; Healthcheck/Expose auf ENV basierend; ENV getrennt gesetzt
- infrastructure/monitoring-server: SPRING_PROFILES_ACTIVE-ARG entfernt; Build ohne -P; ENV/Labels bereinigt

7) docker-compose* bereinigt
- docker-compose.yml: env_file: config/env/.env hinzugefügt; Image-Tags von DOCKER_* auf feste Versionen (aus global.env/versions.toml) umgestellt; keine Laufzeitwerte via build.args
- docker-compose.services.yml: env_file hinzugefügt; DOCKER_* Build-Args entfernt; nur Build-Zeit-ARGs (GRADLE_VERSION, JAVA_VERSION, BUILD_DATE, VERSION); Ports/ENV aus config/env/.env
- docker-compose.clients.yml: env_file hinzugefügt; DOCKER_* entfernt; NGINX_IMAGE_TAG als Build-Arg; APP_VERSION nutzt VERSION

Akzeptanzkriterien
- Keine Laufzeitvariablen in build-args-Dateien
- Dockerfiles verwenden ausschließlich Build-ARGs; keine Ports/Secrets/Profile als ARG
- Compose lädt nur eine Runtime-Env-Quelle (config/env/.env) und schleust keine Runtimewerte via build.args ein

YouTrack: https://meldestelle-pro.youtrack.cloud/issue/MP-18

* MP-18 Env-Konfiguration Refactoring: Schritte 8–11 umgesetzt

8) Secrets-Strategie (Dev vereinfacht)
- config/env/.env.local bereits vorhanden und gitignored; Nutzung für lokale Secrets verdeutlicht
- docker/secrets/README.md hinzugefügt; echte Geheimnisse entfernt/Platzhalter gesetzt (postgres_password.txt)
- Optimierte Compose-Dateien erzwingen Secrets nur im Profil 'prod' (profiles: [prod]) und verwenden env_file: config/env/.env

9) Namenskonventionen vereinheitlicht
- DOCKER_* in optimierten Compose-Dateien entfernt; Build-Args auf GRADLE_VERSION/JAVA_VERSION/VERSION und *_IMAGE_TAG konsolidiert
- SPRING_PROFILES_ACTIVE nur noch zur Laufzeit (Compose/env); aus Dockerfiles (auth, gateway, horses, events, members, masterdata) als Build-ARG entfernt

10) CI: ssot-guard.yml erweitert
- Guard-Checks hinzugefügt: Fail bei Runtime-Variablen in Build-Args-Dateien und bei Build-/Versions-Variablen in Runtime-Envs
- Konsistenz-Check zwischen docker/versions.toml und docker/build-args/global.env (zentraler Versionsabgleich)

11) Skripte & Automatisierung
- Neues Skript scripts/generate-build-env.sh zum Generieren von docker/build-args/global.env aus docker/versions.toml (minimal)

Akzeptanzkriterien
- Lokale Entwicklung erfordert keine Docker-Secrets (Compose default), keine Geheimnisse im Repo
- Keine DOCKER_* Präfixe in Laufzeitdateien, eindeutige Namenskonventionen
- CI bricht bei Build-vs-Runtime-Verletzungen und Versions-Drift

YouTrack: https://meldestelle-pro.youtrack.cloud/issue/MP-18

* MP-18 Env-Konfiguration Refactoring: Schritte 12–17 umgesetzt

12) DDD-Slice-Overrides eingeführt
- Optionale Runtime-Env-Dateien hinzugefügt: config/env/services/{ping,members,horses,events,masterdata}.env, config/env/infrastructure/api-gateway.env, config/env/clients/web-app.env
- Compose-Dateien laden diese Overrides zusätzlich zu config/env/.env (nur wenn vorhanden)

13) Deduplizierung bestätigt
- Build-Args-Dateien enthalten keine Laufzeitwerte; .env/.env.template ohne Build-/Versions-Keys

14) Compose an Envs gekoppelt
- docker-compose*.yml referenzieren ausschließlich config/env/.env + optionale Slice-Overrides; keine docker/build-args/*.env als Runtime-Quelle

15) Doku aktualisiert
- README: neue Konfig-Struktur, Quickstart mit .env/.env.local, optionale Overrides, Deprecations (DOCKER_*_VERSION → *_IMAGE_TAG), Smoke-Tests

16) Cleanup & Deprecations
- Deprecation-Hinweise in README dokumentiert; keine obsoleten Root-.env-Dateien verbleiben

17) Validierung & Hinweise
- Start-/Healthcheck-Hinweise für lokalen Smoke-Test ergänzt; CI-Guards bleiben gültig

* MP-18 DoD-Finalisierung: Build/Runtime-Trennung verhärtet, Doku-Hinweise korrigiert

- Entfernt: Runtime-Build-ARG SERVICE_PORT aus Service-Dockerfiles (members, horses, events, masterdata)
  * Feste Default-Ports gesetzt (8083–8086), Healthchecks und SERVER_PORT-ENV angepasst
  * Erfüllt DoD: Build-Args enthalten keine Runtime-Werte mehr
- .env.template Usage korrigiert: verweist nun explizit auf config/env/.env und compose-Aufrufe

DoD-Checkliste:
✓ Zentrale Runtime-Datei config/env/.env + .env.local (Compose nutzt env_file)
✓ Build-Args nur Versionen/Pfade/Namen (keine Runtime-Keys)
✓ versions.toml als einzige Quelle für Image-/Tool-Versionen (CI-Guard prüft Drift)
✓ CI-Workflow blockiert Build/Runtime-Mixing & Versions-Drift (ssot-guard)
✓ README dokumentiert den Flow (Quickstart, Struktur, Deprecations)
✓ Clean Builds/Local-Starts durch compose-Files unterstützt

YouTrack: https://meldestelle-pro.youtrack.cloud/issue/MP-18

* MP-18: GitHub-Workflows aktualisiert und README Markdownlint-Fehler behoben

Workflows
- CI: minimale Permissions + Concurrency hinzugefügt; build-test hängt jetzt auch von validate-docs ab; actions/setup-node → v4
- SSoT Guard: minimale Permissions + Concurrency
- Deploy Proxmox: Concurrency; Deploy-Job läuft korrekt bei workflow_dispatch (zuvor durch falsche IF-Bedingung blockiert)
- Docs KDoc Sync: minimale Permissions + Concurrency
- Integration Tests: minimale Permissions + Concurrency
- YouTrack Sync: minimale Permissions + Concurrency; Guard, wenn Secrets fehlen

Docs
- README.md: MD032 (Leerzeilen um Listen) korrigiert
- README.md: MD037 (Spaces in Emphasis / Wildcards) durch Backticks behoben
- README.md: MD034 (Bare URLs) via <> eingefasst

Ziel
- Optimierte, aktuelle CI-Workflows und grüne markdownlint-Prüfungen.

YouTrack: https://meldestelle-pro.youtrack.cloud/issue/MP-18

* MP-18: Fix Docker SSoT validator errors

Remove default values from centralized ARGs in web-app Dockerfile (GRADLE_VERSION, JAVA_VERSION, NGINX_IMAGE_TAG).

Align build.args in compose files to centralized DOCKER_* vars from versions.toml mapping (clients/services/optimized), and update api-gateway in optimized compose.

Replace hardcoded infra image tags in docker-compose.yml with DOCKER_* fallbacks for postgres/redis/prometheus/grafana/keycloak.

Validated via scripts/validate-docker-consistency.sh all → Errors=0 (Warnings remain by design).

YouTrack: https://meldestelle-pro.youtrack.cloud/issue/MP-18

* MP-18: Finalize Env/SSoT refactor – align generator, validator, build-args and compose

- Switch docker/build-args/global.env to *_IMAGE_TAG keys (PROMETHEUS/GRAFANA/KEYCLOAK/POSTGRES/REDIS/CONSUL/KAFKA/ZOOKEEPER)
- Clean docker/build-args/{clients,services,infrastructure}.env to build-time only; remove runtime/profile/ports
- Update scripts/docker-versions-update.sh to emit *_IMAGE_TAG and strip runtime keys from build-args files
- Update scripts/validate-docker-consistency.sh to check *_IMAGE_TAG and stop enforcing runtime keys in build-args
- Rename Keycloak Dockerfile ARG to KEYCLOAK_IMAGE_TAG and update FROM/labels
- Add build arg fallbacks in compose files where needed (GRADLE/JAVA/VERSION) for dev convenience

Result:
- scripts/validate-docker-consistency.sh all → 0 errors (warnings remain informational)

YouTrack: https://meldestelle-pro.youtrack.cloud/issue/MP-18

* fix: Bash-Syntax-Fehler in ssot-guard.yml behoben

- Fehlerhafte '2>/dev/null || true' Konstrukte in for-Schleifen entfernt
- Stattdessen 'shopt -s nullglob' für saubere Behandlung nicht-existierender Dateimuster verwendet
- Beide betroffene for-Schleifen (Runtime-Variablen und Build-Variablen Guards) korrigiert

MP-18

* chore: Regenerate Docker Compose files to fix SSoT drift

- Removed default values from build arguments (now using centralized DOCKER_* variables)
- Removed env_file directives for cleaner configuration
- Updated variable names for consistency (GATEWAY_PORT → API_GATEWAY_PORT)
- Standardized comments and structure across all compose files

Resolves SSoT drift detected by ssot-guard workflow.

MP-18

* MP-18 fix: Bash-Syntax-Fehler in ssot-guard.yml behoben

- Fehlerhafte '2>/dev/null || true' Konstrukte in for-Schleifen entfernt
- Stattdessen 'shopt -s nullglob' für saubere Behandlung nicht-existierender Dateimuster verwendet
- Beide betroffene for-Schleifen (Runtime-Variablen und Build-Variablen Guards) korrigiert

* MP-18 chore: Regenerate Docker Compose files to fix SSoT drift

- Removed default values from build arguments (now using centralized DOCKER_* variables)
- Removed env_file directives for cleaner configuration
- Updated variable names for consistency (GATEWAY_PORT → API_GATEWAY_PORT)
- Standardized comments and structure across all compose files

Resolves SSoT drift detected by ssot-guard workflow.

* MP-18 fix: qodana_code_quality.yml qodana.yaml

* fix: GitHub Actions Workflow-Fehler behoben

- youtrack-sync.yml: Korrektur der secrets if-Bedingung (Line 18)
  * Entfernung ungültiger != '' Vergleiche
  * Verwendung korrekter GitHub Actions Syntax: secrets.YT_URL && secrets.YT_TOKEN

- ssot-guard.yml: Korrektur der get_toml_ver() Funktion
  * Behebung des Versions-Drift Problems
  * Parsing nur aus [versions] Sektion mit State-Machine-Pattern
  * Korrekte Extraktion aller 11 Versionswerte aus versions.toml
  * Trimming von Spaces vor Key-Vergleich

Fixes: MP-18

* MP-18 Entfernung von Qodana

* MP-18 fix(ssot-guard): align build-args comments with generator output to remove SSoT drift

- clients.env/services.env/infrastructure.env: update runtime note text to match scripts/docker-versions-update.sh
- Avoids false-positive drift in workflow (content changes beyond ignored timestamps)

* MP-18 fix: workflows/youtrack-sync.yml

* MP-18 fix: workflows/youtrack-sync.yml

* MP-18 fix: workflows/youtrack-sync.yml

* MP-18 fix: workflows/youtrack-sync.yml

* MP-18 fix: workflows/youtrack-sync.yml
2025-11-19 00:59:41 +01:00

445 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Meldestelle
> Modulares System für Pferdesportveranstaltungen mit Domain-Driven Design
[![CI Pipeline](https://github.com/StefanMoCoAt/meldestelle/workflows/CI%20-%20Main%20Pipeline/badge.svg)](https://github.com/StefanMoCoAt/meldestelle/actions)
[![Docker SSoT](https://github.com/StefanMoCoAt/meldestelle/workflows/Docker%20SSoT%20Guard/badge.svg)](https://github.com/StefanMoCoAt/meldestelle/actions)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
---
## 🚀 Quick Start
```bash
# 1) Repository klonen
git clone https://github.com/StefanMoCoAt/meldestelle.git
cd meldestelle
# 2) Runtime-Environment vorbereiten (Single Source of Truth)
# Kopiere die Vorlage und passe sie bei Bedarf an.
cp -n .env.template config/env/.env 2>/dev/null || true
# Optionale lokale Geheimnisse/Overrides (gitignored):
# echo "POSTGRES_PASSWORD=meinlokalespasswort" >> config/env/.env.local
# 3) (Optional) Compose-Files generieren
# (nur falls du die Generator-Pipeline nutzt)
# DOCKER_SSOT_MODE=envless bash scripts/generate-compose-files.sh all development
# 4) Infrastruktur starten
docker compose -f docker-compose.yml up -d
# 5) Services starten (Beispiel)
./gradlew :members:members-service:bootRun
# oder falls zentral gewollt und unterstützt
# ./gradlew bootRun
```
**Vollständige Anleitung**: [docs/how-to/start-local.md](docs/how-to/start-local.md)
---
## 📚 Dokumentation
### Single Source of Truth: YouTrack
Die Hauptdokumentation befindet sich in der **YouTrack Wissensdatenbank**:
👉 **[Meldestelle Command Center](https://meldestelle-pro.youtrack.cloud/articles/MP-A-24)**
#### In YouTrack
- 🏗️ **Bounded Context Dokumentation** (Members, Horses, Events, Masterdata)
- 📡 **API-Referenz** (automatisch aus KDoc generiert)
- 🚀 **Deployment-Guides** (Proxmox, Cloudflare, Nginx)
- 🔐 **Infrastruktur-Konfigurationen** (Netzwerk, Datenbanken, Keycloak)
- 💡 **Roadmap & Visionen**
#### Im Repository
- [📖 docs/README.md](docs/README.md) - Übersicht aller Repository-Dokumentation
- [🏛️ Architecture Decision Records](docs/architecture/adr)
- [📐 C4-Diagramme](docs/architecture/c4)
- [🛠️ Developer Guides](docs/how-to)
- [📑 Projekt-Guidelines (Master)](.junie/guidelines/master-guideline.md)
Zusätzliche zentrale Guidelines:
- [Coding Standards](.junie/guidelines/project-standards/coding-standards.md)
- [Testing Standards](.junie/guidelines/project-standards/testing-standards.md)
- [Documentation Standards](.junie/guidelines/project-standards/documentation-standards.md)
- [Architecture Principles](.junie/guidelines/project-standards/architecture-principles.md)
- [Web App Guideline](.junie/guidelines/technology-guides/web-app-guideline.md)
- Docker Guides:
- [Docker Overview](.junie/guidelines/technology-guides/docker/docker-overview.md)
- [Docker Architecture](.junie/guidelines/technology-guides/docker/docker-architecture.md)
- [Docker Development](.junie/guidelines/technology-guides/docker/docker-development.md)
- [Docker Production](.junie/guidelines/technology-guides/docker/docker-production.md)
- [Docker Monitoring](.junie/guidelines/technology-guides/docker/docker-monitoring.md)
- [Docker Troubleshooting](.junie/guidelines/technology-guides/docker/docker-troubleshooting.md)
- Process Guide: [Trace Bullet](.junie/guidelines/process-guides/trace-bullet-guideline.md)
---
## 🏗️ Architektur
### Bounded Contexts (DDD)
Das System ist in unabhängige Domänen aufgeteilt:
- **Members**: Mitgliederverwaltung
- **Horses**: Pferderegistrierung
- **Events**: Veranstaltungsverwaltung
- **Masterdata**: Stammdaten (Länder, Altersklassen, Turnierplätze)
### Technische Architektur
- **Microservices**: Unabhängige Services mit API Gateway
- **Event-Driven**: Apache Kafka für asynchrone Kommunikation
- **Polyglot Persistence**: PostgreSQL + Redis
- **Container-First**: Docker & Docker Compose
**Details**: [ADR-0002 Domain-Driven Design](docs/architecture/adr/0002-domain-driven-design-de.md)
---
## ⚙️ Konfigurationsstruktur (Build vs. Runtime)
Laufzeit (Runtime) Single Source of Truth:
- config/env/.env globale Runtime-Werte (Ports, Hosts, Feature-Flags, Pfade, Profile)
- config/env/.env.local lokale, geheime Overrides (gitignored)
- Optionale DDD-Slice-Overrides (nur wenn nötig):
- config/env/services/<service>.env (z. B. ping-service.env)
- config/env/infrastructure/<component>.env (z. B. api-gateway.env)
- config/env/clients/<client>.env (z. B. web-app.env)
Build-Zeit (nur Versionen/Tags/Pfade):
- docker/versions.toml zentrale Versionsquelle (SSoT)
- docker/build-args/global.env aus versions.toml abgeleitet (kann via scripts/generate-build-env.sh erzeugt werden)
- docker/build-args/{clients,infrastructure,services}.env nur Build-relevante Pfade/Namen; keine Runtime-Variablen
Compose-Anbindung:
- Alle docker-compose*.yml laden config/env/.env und optional die per-Slice-Overrides via env_file
- Laufzeitwerte werden nicht via build.args eingeschleust
Deprecations / Umbenennungen:
- `DOCKER_*_VERSION``*_IMAGE_TAG` (nur Build-Zeit)
- `APP_VERSION` wurde vereinheitlicht als `VERSION`
Schnelltest / Smoke (lokal):
- docker compose -f docker-compose.yml up -d
- docker compose -f docker-compose.services.yml up -d
- docker compose -f docker-compose.clients.yml up -d
- Healthchecks prüfen: <http://localhost:3000> (Grafana), <http://localhost:9090> (Prometheus), <http://localhost:8180> (Keycloak), <http://localhost:8081> (Gateway), <http://localhost:4000> (Web)
Sicherheits-Hinweise:
- Keine echten Secrets im Repo; verwende config/env/.env.local für lokale Entwicklung
- Die optimierten Compose-Dateien (`*.optimized`) nutzen Docker-Secrets im Profil "prod"
---
## 🛠️ Tech Stack
| Komponente | Technologie | Version |
|----------------|-------------------------------|---------|
| **Backend** | Kotlin + Spring Boot | 3.x |
| **JVM** | Java | 21 |
| **Build** | Gradle | 9.1.0 |
| **Datenbank** | PostgreSQL | 16 |
| **Cache** | Redis | 7 |
| **Messaging** | Apache Kafka | 7.4.0 |
| **Auth** | Keycloak | 26.4.2 |
| **Monitoring** | Prometheus + Grafana + Zipkin | - |
| **Container** | Docker + Docker Compose | v2.0+ |
---
### 📦 Projektstruktur
```plaintext
Meldestelle/
├── 🗂️ client/ # Client-Anwendungen
│ ├── desktop-app/
│ └── web-app/
├── 🗂️ core/ # Gemeinsame Kern-Komponenten
│ ├── core-domain/
│ └── core-utils/
├── 🗂️ docs/ # Minimale Entwickler-Dokumentation
│ ├── architecture/
│ └── how-to/
├── 🗂️ events/ # Bounded Context: Veranstaltungsverwaltung
│ └── (analog zu members)
├── 🗂️ horses/ # Bounded Context: Pferderegistrierung
│ └── (analog zu members)
├── 🗂️ infrastructure/ # Technische Infrastruktur
│ ├── auth/ # Authentifizierung
│ ├── cache/ # Caching (Redis)
│ ├── gateway/ # API Gateway (Spring Cloud Gateway)
│ ├── messaging/ # Kafka-Integration
│ └── monitoring/ # Observability
├── 🗂️ masterdata/ # Bounded Context: Stammdaten
│ └── (analog zu members)
└── 🗂️ members/ # Bounded Context: Mitgliederverwaltung
├── members-api/
├── members-application/
├── members-domain/
├── members-infrastructure/
└── members-service/
```
---
## 🔒 Docker Single Source of Truth (SSoT)
Alle Versionen zentral in **`docker/versions.toml`**:
### SSoT Schnellstart (präzisiert)
```bash
# Versionen anzeigen
bash scripts/docker-build.sh --versions
# Compose-Files generieren (Kompatibilitätsmodus)
bash scripts/generate-compose-files.sh all development
# Konsistenz validieren (Kompatibilitätsmodus)
bash scripts/validate-docker-consistency.sh all
```
### SSoT Zwei Betriebsmodi (konsistent)
```bash
# 1) Kompatibilitätsmodus (compat)
bash scripts/docker-versions-update.sh sync
bash scripts/generate-compose-files.sh all development
bash scripts/validate-docker-consistency.sh all
# 2) Env-less Modus (empfohlen)
DOCKER_SSOT_MODE=envless bash scripts/docker-build.sh --versions
DOCKER_SSOT_MODE=envless bash scripts/generate-compose-files.sh all development
DOCKER_SSOT_MODE=envless bash scripts/validate-docker-consistency.sh all
```
Alternative (persistente Shell-Variante):
```bash
export DOCKER_SSOT_MODE=envless
bash scripts/docker-build.sh --versions
bash scripts/generate-compose-files.sh all development
bash scripts/validate-docker-consistency.sh all
```
#### CI-Schutz lokal reproduzieren (getrennte/verkettete Befehle)
```bash
# Compat
bash scripts/docker-versions-update.sh sync && \
bash scripts/generate-compose-files.sh all development && \
bash scripts/validate-docker-consistency.sh all && \
git diff --name-only # sollte leer sein
# Env-less (Variante A: prefix)
DOCKER_SSOT_MODE=envless bash scripts/generate-compose-files.sh all development && \
DOCKER_SSOT_MODE=envless bash scripts/validate-docker-consistency.sh all && \
git diff --name-only # sollte leer sein
# Env-less (Variante B: export)
export DOCKER_SSOT_MODE=envless
bash scripts/generate-compose-files.sh all development && \
bash scripts/validate-docker-consistency.sh all && \
git diff --name-only # sollte leer sein
```
### Deployment (klarstellen, falls SSoT vorausgeht)
```bash
# Nur Infrastruktur
# Wenn eine handgeschriebene docker-compose.yml existiert:
docker compose -f docker-compose.yml up -d
# Falls Compose-Files generiert werden:
docker compose -f docker-compose.services.yml up -d
# Services via Gradle
a) Einzeldienst
./gradlew :members:members-service:bootRun
b) Falls unterstützt: alle (oder Aggregator)
./gradlew bootRun
```
**Details**: Siehe Abschnitt "Docker Single Source of Truth (SSoT)" weiter unten
---
## 🧪 Testing
### Unit Tests
```bash
./gradlew test
```
### Integration Tests
```bash
./gradlew integrationTest
```
### Spezifisches Modul testen
```bash
./gradlew :members:members-service:test
```
---
## 🚢 Deployment
### Lokale Entwicklung
#### Nur Infrastruktur (Postgres, Redis, Kafka, Keycloak)
```bash
docker compose -f docker-compose.yml up -d
```
#### Services über Gradle
```bash
./gradlew bootRun
```
---
## Docker Single Source of Truth (SSoT)—Details
Dieser Abschnitt beschreibt den lokalen Workflow für die zentrale Docker-Versionsverwaltung.
### TL;DR Zwei Betriebsmodi
- **Kompatibilitätsmodus (Standard)**: `build-args/*.env` werden aus `versions.toml` generiert
```bash
bash scripts/docker-versions-update.sh sync
bash scripts/generate-compose-files.sh all development
bash scripts/validate-docker-consistency.sh all
```
- **Env-less Modus (Empfohlen)**: Keine `build-args/*.env` nötig direkter Export aus `versions.toml`
```bash
DOCKER_SSOT_MODE=envless bash scripts/docker-build.sh --versions
DOCKER_SSOT_MODE=envless bash scripts/generate-compose-files.sh all development
DOCKER_SSOT_MODE=envless bash scripts/validate-docker-consistency.sh all
```
### Makefile-Befehle
Das Projekt verwendet ein umfassendes Makefile mit ~50 Befehlen für alle Development-Workflows:
```bash
make help # Zeigt alle verfügbaren Befehle
```
**Wichtigste Befehle:**
```bash
make full-up # Startet komplettes System (Infra + Services + Clients)
make services-up # Startet Backend (Infra + Microservices)
make dev-up # Startet Development-Environment
make test # Führt Integration-Tests aus
make health-check # Prüft System-Health
```
**SSoT-Befehle:**
```bash
make docker-sync # Synchronisiert versions.toml -> build-args/*.env
make docker-compose-gen # Generiert Docker Compose Files
make docker-validate # Validiert Docker SSoT Konsistenz
```
**Vollständige Referenz:** [Docker Development Guide](.junie/guidelines/technology-guides/docker/docker-development.md#-vollständige-makefile-referenz)
### Was ist die Single Source of Truth?
- **`docker/versions.toml`** enthält alle Versionsangaben (Gradle, Java, Node, Nginx, Postgres, Redis, etc.)
- **Env-less**: `docker/build-args/*.env` sind optional; Variablen zur Laufzeit aus `versions.toml`
- **docker-compose*.yml** werden generiert und referenzieren nur zentrale `DOCKER_*`-Variablen
- **Dockerfiles** deklarieren ARGs ohne Default-Werte
### Versionen ändern
```bash
bash scripts/docker-versions-update.sh update gradle 9.1.0
bash scripts/docker-versions-update.sh update node 22.21.0
bash scripts/docker-versions-update.sh update postgres 16-alpine
```
Danach: `generate` + `validate` ausführen!
### CI-Schutz
Die CI validiert Docker SSoT in beiden Modi (Matrix: compat + envless).
**Lokal reproduzieren**:
#### Compat
```bash
bash scripts/docker-versions-update.sh sync && \
bash scripts/generate-compose-files.sh all development && \
bash scripts/validate-docker-consistency.sh all && \
git diff --name-only # sollte leer sein
```
#### Env-less
```bash
DOCKER_SSOT_MODE=envless bash scripts/generate-compose-files.sh all development && \
DOCKER_SSOT_MODE=envless bash scripts/validate-docker-consistency.sh all && \
git diff --name-only # sollte leer sein
```
---
## 🔄 Automatisierte Workflows
| Workflow | Zweck | Trigger |
|------------------------------------------------------------------|--------------------------------------|-------------------|
| [ci-main.yml](.github/workflows/ci-main.yml) | Build, Test, OpenAPI-Lint, Docs-Lint | Push/PR |
| [ssot-guard.yml](.github/workflows/ssot-guard.yml) | Docker SSoT Validierung | Push/PR |
| [docs-kdoc-sync.yml](.github/workflows/docs-kdoc-sync.yml) | KDoc → YouTrack Sync | workflow_dispatch |
| [integration-tests.yml](.github/workflows/integration-tests.yml) | Integration Tests | Push/PR |
| [deploy-proxmox.yml](.github/workflows/deploy-proxmox.yml) | Deployment zu Proxmox | workflow_dispatch |
---
## 📜 Lizenz
[MIT License](LICENSE)
---
## 🤝 Contributing
Bitte lies [docs/how-to/branchschutz-und-pr-workflow.md](docs/how-to/branchschutz-und-pr-workflow.md) für den
PR-Workflow.
---
## 📞 Support & Kontakt
- **Bugs**: [GitHub Issues](https://github.com/StefanMoCoAt/meldestelle/issues)
- **Discussions**: [GitHub Discussions](https://github.com/StefanMoCoAt/meldestelle/discussions)
- **Dokumentation**: [YouTrack Wissensdatenbank](https://meldestelle-pro.youtrack.cloud/articles/MP-A-24)
---
**Version**: 2.0.0 (nach Dokumentations-Refactoring)
**letzte Aktualisierung**: 31. Oktober 2025