Produktionsbetrieb
Produktions-Compose-Datei
Für den Produktionsbetrieb verwende:
docker compose -f deployment/docker-compose.prod.yml up -dDie Produktionskonfiguration unterscheidet sich von der Entwicklungsumgebung durch:
- Keine Quell-Volume-Mounts (gebaut aus Images)
restart: unless-stoppedfür alle Dienste- Ressourcenlimits (CPU, Speicher)
- Kein direkter Port-Zugriff auf Datenbank und MinIO
Secrets in deployment/.env
Alle Konfigurationswerte und Secrets stehen in der Datei deployment/.env. Sie entsteht als Kopie von deployment/.env.example, ist per .gitignore vom Repository ausgeschlossen und ist der einzige Ort, an dem Secrets auf dem Server auf der Platte liegen:
cd deployment
cp .env.example .env
# .env ausfüllen — Werte aus deinem Passwort-Manager
bash scripts/deploy.shDas Deploy-Skript liest .env direkt; es gibt keine verschlüsselte Secrets-Datei im Repository und keinen Entschlüsselungsschritt. Die Werte gehören in einen Passwort-Manager, nicht in Git (für die Referenzinstallation ist das der Projekt-Tresor Clavis V1 in 1Password). JWT_SECRET_KEY und HMAC_AUDIT_KEY werden für jede Installation neu erzeugt, z. B. mit openssl rand -base64 48.
TLS und Reverse Proxy
Der Anwendungs-Stack öffnet keine Host-Ports und terminiert kein TLS. Davor steht ein Reverse Proxy, der die eine öffentliche Adresse (z. B. app.clavis-rallye.de) per HTTPS bedient und nach Pfad weiterleitet:
| Pfad | Ziel |
|---|---|
/api/* (inklusive WebSocket-Upgrade) | clavis-api:8000 |
| alles andere | clavis-web:80 |
Die Anwendung ist auf eine Origin ausgelegt: API und Frontend laufen unter derselben Domain, die API unter dem Pfad /api. Die Referenzinstallation nutzt dafür den Nginx Proxy Manager des Servers mit einem Let's-Encrypt-Zertifikat. Wer stattdessen den mitgelieferten All-in-one-Stack betreibt (docker-compose.yml im Wurzelverzeichnis des App-Repositories), bekommt dieselbe Weiterleitung über den enthaltenen Caddy-Dienst; dessen Caddyfile enthält einen auskommentierten Produktionsblock mit TLS-Einstellungen nach BSI TR-02102, in den die eigene Domain einzutragen ist.
Umgebungsvariablen für Produktion
| Variable | Beschreibung |
|---|---|
IMAGE_TAG | Version der Container-Images aus der Registry (Pflicht, siehe Updates) |
DATABASE_URL | Verbindungs-URL der PostgreSQL-Datenbank inklusive Passwort |
MINIO_ACCESS_KEY | MinIO-Zugangsdaten |
MINIO_SECRET_KEY | MinIO-Geheimschlüssel |
JWT_SECRET_KEY | JWT-Signaturschlüssel (≥32 Zeichen, zufällig) |
HMAC_AUDIT_KEY | HMAC-Schlüssel für Audit-Log-Kette |
CORS_ORIGINS, WEBAUTHN_RP_ID, WEBAUTHN_ORIGIN | Öffentliche Domain bzw. Origin der Installation (z. B. app.clavis-rallye.de / https://app.clavis-rallye.de) |
Alle [SECRET]-markierten Variablen aus deployment/.env.example müssen gesetzt werden.