# Deploymentdiagramm

Zwei Zielumgebungen: die tatsächlich betriebene Docker-Compose-Topologie (links, live verifiziert)
und das Kubernetes/Helm-Konzept (rechts, `helm lint`/`helm template` validiert, aber mangels
verfügbarem Cluster in dieser Lernumgebung **nicht live deployt** — siehe Confluence Seite 12,
CONFIRMED, und `helm/procurex/README.md`).

```mermaid
graph TB
    subgraph Compose["Docker Compose (live betrieben)"]
        direction TB
        T1["Traefik<br/>(aus enterprise-infrastructure)"]
        FE1["procurex-frontend<br/>Container, Port 80"]
        BE1["procurex-app<br/>Container, Port 8081"]
        PG1[("shared-postgres<br/>DB procurex_db")]
        KC1["shared-keycloak"]
        KF1["shared-kafka<br/>Port 29092 intern"]

        T1 -->|"Host: procurex.localhost"| FE1
        T1 -->|"Host: procurex-api.localhost"| BE1
        BE1 --> PG1
        BE1 --> KC1
        BE1 --> KF1

        Net["externes Netzwerk 'proxy'<br/>(von enterprise-infrastructure erzeugt)"]
        FE1 -.-> Net
        BE1 -.-> Net
        T1 -.-> Net
    end

    subgraph K8s["Kubernetes / Helm (Konzept, nicht live)"]
        direction TB
        Ing["Ingress<br/>templates/ingress.yaml"]
        FE2["Deployment: frontend<br/>+ Service (ClusterIP)"]
        BE2["Deployment: backend<br/>+ Service (ClusterIP)<br/>Health-Probes: /actuator/health/*"]
        NP["NetworkPolicy<br/>templates/networkpolicy.yaml"]
        NS["Namespace<br/>templates/namespace.yaml"]

        Ing --> FE2
        Ing --> BE2
        NP -.->|beschränkt Traffic auf| FE2
        NP -.->|beschränkt Traffic auf| BE2
        NS -.->|umschließt| FE2
        NS -.->|umschließt| BE2
    end
```

## Docker-Compose-Details (live)

| Aspekt | Wert | Quelle |
|---|---|---|
| Netzwerk | extern `proxy`, von `enterprise-infrastructure` erzeugt | `docker-compose.yml` |
| Backend-Host | `procurex-api.localhost` → Container-Port 8081 | Traefik-Label |
| Frontend-Host | `procurex.localhost` → Container-Port 80 | Traefik-Label |
| DB-Verbindung | `shared-postgres:5432`, DB `procurex_db`, User `procurex_user` | Environment-Variablen |
| Kafka | `shared-kafka:29092` (PLAINTEXT, Container-intern) | Environment-Variablen |
| Keycloak-JWKS | `http://shared-keycloak:8080/realms/procurex/...` | Environment-Variablen |

## Helm/Kubernetes-Details (Konzept)

| Aspekt | Wert | Quelle |
|---|---|---|
| Chart | `helm/procurex/Chart.yaml` | — |
| Validierung | `helm lint`, `helm template` — kein `helm install` gegen einen echten Cluster | `helm/procurex/README.md` |
| Health-Probes | Spring-Boot-Health-Groups (`/actuator/health/liveness`, `/actuator/health/readiness`) | `templates/backend-deployment.yaml` |
| Netzwerksegmentierung | `templates/networkpolicy.yaml` | — |
| Lokaler Testcluster (optional) | `kind-cluster-config.yaml` für `kind` | `helm/procurex/` |

**Warum zwei Umgebungen dokumentiert werden:** Der Docker-Compose-Pfad ist der einzige tatsächlich
betriebene; der Helm-Pfad demonstriert absichtlich Kubernetes-Deployment-Know-how, ohne einen in
dieser Lernumgebung nicht vorhandenen Cluster vorzutäuschen (siehe `docs/runbooks/rollback.md` für
die Rollback-Strategie, die für beide Pfade beschrieben ist).
