Agentisches ERP: die Deployment-Infrastruktur
Die Pipeline, die den Copilot auf echte Infrastruktur bringt, mit den 6 Prüfungen, die vor jedem Release bestehen müssen.
Eine CI/CD-Architektur aus zwei Repositories
Das Entwicklungs-Repository fährt bei jedem Push auf master eine GitHub-Actions-Pipeline aus 6 Jobs: Qualitäts-Gates im Backend (ruff, black, mypy, bandit, pytest-Unittests), tsc im Frontend, Integrationstests, ein Red-Team-Job (promptfoo) und ein Build, der die Images mit schlüsselloser OIDC-Authentifizierung in die Azure Container Registry schiebt. Ein repository_dispatch-Ereignis stößt danach dieses Deployment-Repository an.
Dieses Deployment-Repository nimmt das Ereignis auf und startet einen Deploy-Job, der über eine GitHub-Umgebung auf eine manuelle Freigabe wartet. Nach der Freigabe läuft kubectl apply, dann rollout wait, dann der Smoke-Test mit 6 Prüfungen. Das Deployment in einem eigenen Repository zieht die Produktionsgrenze dorthin, wo eine prüfende Person sie sieht: kein Commit erreicht die Produktion ohne ein zweites Augenpaar.
Infrastruktur als Code: die Bicep-Module
| Modul | Detail |
|---|---|
| AKS | Ein System-Knotenpool (Standard_D2s_v3) und ein GPU-Knotenpool (Standard_NC6s_v3), mit aktiviertem OIDC-Issuer für eine schlüssellose Workload Identity. |
| Azure Container Registry | Premium-SKU mit Georeplikation. GitHub Actions pusht über OIDC, also liegen keine Registry-Zugangsdaten in den CI-Secrets. |
| Postgres (Flexible Server) | pgvector aktiviert, nur über einen privaten Endpunkt erreichbar, mit erzwungenem SSL. |
| Redis Cache | Standard-C1-SKU, trägt den semantischen Cache (SHA-256- und Kosinus-Suche) und die Entscheidungs-UUIDs des Human-Gates (Lebensdauer 24 Stunden). |
| CosmosDB | Serverlos, mit Lesereplikaten in mehreren Regionen. Hält den Gesprächsverlauf und die Audit-Protokolle. |
| Azure Monitor / App Insights | Das OTel-DaemonSet leitet OTLP-Traces und -Metriken weiter. Die Dashboards decken Solver-Latenz, Cache-Trefferquote und die Zahl der Human-Gate-Entscheidungen ab. |
Die Kustomize-Overlays
Ein Basissatz an Kubernetes-Manifesten (Deployment, Service, ConfigMap, HorizontalPodAutoscaler) gilt für alle Umgebungen. Die Kustomize-Overlays patchen nur, was Staging und Produktion unterscheidet: Anzahl der Replicas, Ressourcenanforderungen und -grenzen sowie Image-Tags. Kein Manifest wird dupliziert.
Der NGINX-Ingress-Controller leitet /api und /ws an das FastAPI-Backend und / an das Vite-Frontend. Die Upgrade-Header für WebSocket werden ausdrücklich weitergereicht, damit der Benachrichtigungskanal des Human-Gates den Ingress passiert, statt dort still zu verschwinden.
Observability: das OTel-DaemonSet
Ein DaemonSet mit dem OpenTelemetry Collector läuft auf jedem AKS-Knoten, nimmt OTLP-Traces und -Metriken aus den Anwendungs-Pods entgegen und leitet sie über den OTLP/HTTP-Exporter an Azure Monitor Application Insights weiter. Die Dashboards verfolgen die Solver-Latenz je Intent (mcnf_solve, vrp_route und die übrigen), die Trefferquote des Redis-Caches, die Zahl der Human-Gate-Entscheidungen samt Freigabequote und die Ergebnisse der Red-Team-Sonden aus dem CI-Gate.
Der Smoke-Test: 6 Prüfungen
Sobald kubectl rollout status einen gesunden Stand meldet, läuft das Skript smoke-test.sh mit 6 Prüfungen nacheinander und bricht beim ersten Fehler ab:
- Health-Endpunkt. GET /health liefert 200.
- OpenAPI-Doku. GET /docs liefert 200, was bestätigt, dass FastAPI korrekt gestartet ist.
- WebSocket-Erreichbarkeit. Ein kurzer Handshake zum Benachrichtigungskanal des Human-Gates gelingt.
- Router des Human-Gates. Ein Test-Solver-Aufruf über der Schwelle von 10.000 $ erreicht den Gate-Knoten und liefert einen wartenden Status statt eines Fehlers.
- Injection-Sonde. Eine bekannte Prompt-Injection kommt abgewiesen zurück, was bestätigt, dass die Bereinigung personenbezogener Daten und die RBAC-Schicht aktiv sind.
- Erreichbarkeit des Frontends. GET / liefert 200 mit dem HTML des Vite-Bundles.
Die Sicherheitslage
Postgres, Redis und CosmosDB liegen hinter privaten Endpunkten und sind aus dem öffentlichen Internet nicht erreichbar. Die Workload Identity von AKS (OIDC) authentifiziert die Pods gegenüber den Azure-Ressourcen ohne statische Zugangsdaten, und der GitHub-Actions-Workflow nutzt OIDC-Föderation, um Images nach ACR zu schieben, also liegt nirgends ein Registry-Passwort. Die JWT für den API-Zugriff nutzen HS256 mit einem Ablauf nach 60 Minuten.