ADR-002: Docker-First Deployment-Strategie¶
Status¶
Accepted – 2026-02-11
Context¶
DocFlow muss für Enterprise-Kunden einfach deploybar sein. Verschiedene Deployment-Szenarien:
- Entwickler wollen mit einem Befehl die gesamte Plattform lokal starten
- Kleine Teams deployen auf einem einzelnen Server (VM/Bare Metal)
- Enterprise braucht Kubernetes-Kompatibilität und horizontale Skalierung
- CI/CD muss reproduzierbar bauen und testen
Decision¶
Wir verfolgen eine Docker-First-Strategie mit folgenden Kernelementen:
1. Multi-Stage Dockerfile¶
- Stage 1 (Builder): Dependency-Installation mit
uv - Stage 2 (Runtime): Minimales Image mit nur Runtime-Dependencies
- Non-root User, Health Checks, optimierte Layer-Reihenfolge
2. Docker Compose als primäres Deployment-Tool¶
docker-compose.ymlals Basis-Stack (API + Tika + Redis)docker-compose.dev.ymlOverride für Entwicklung (Hot-Reload)docker-compose.prod.ymlOverride für Production (Replicas, Log-Limits)- Compose Profiles für optionale Services (MinIO)
3. GitHub Container Registry (GHCR)¶
- Images werden automatisch via GitHub Actions gebaut und gepusht
- Semantic Versioning Tags (
v1.2.3→1.2.3,1.2,1,latest) - Multi-Arch Support (amd64 + arm64)
- Kein externes Registry-Konto nötig
4. Kubernetes-Ready (aber nicht Kubernetes-First)¶
- Health Endpoints (
/live,/ready,/health) folgen K8s-Konventionen - Stateless Application Design
- Konfiguration über Environment Variables (12-Factor)
- Helm Chart als Phase-3-Erweiterung
Consequences¶
Positive¶
- Einfacher Einstieg:
docker compose upstartet alles - Reproduzierbar: Gleiche Images in Dev, CI, Staging, Production
- Skalierbar: Von Single Node (Compose) zu Multi Node (K8s) ohne App-Änderung
- Sicher: Non-root, minimales Base Image, Security Scanning in CI
Negative¶
- Docker-Dependency: Alle Entwickler brauchen Docker Desktop / Podman
- Image-Größe: ~250 MB durch Tesseract OCR-Abhängigkeiten
- Lokale Entwicklung ohne Docker erfordert manuelle Tika/Redis-Installation
Risiken¶
- Tika-Image ist ~500 MB und hat langsamen Cold Start (~30s)
- Mitigation:
start_periodim Health Check, Tika vorwärmen - Redis als Single Point of Failure bei Queue-basierter Verarbeitung
- Mitigation: Redis ist optional (Fallback auf In-Memory), Sentinel für HA
Alternatives Considered¶
| Alternative | Abgelehnt weil |
|---|---|
| Kubernetes-First | Zu komplex für MVP und kleine Teams |
| Serverless (Lambda) | Tika benötigt persistenten Prozess, Cold Starts zu lang |
| Bare Metal / systemd | Nicht reproduzierbar, schwer skalierbar |
| Podman Compose | Geringere Verbreitung, Docker-kompatibel wenn nötig |