meldestelle/README-PRODUCTION.md
stefan e7b18da45d refactor: Migrate from monolithic to modular architecture
1. **Docker-Compose für Entwicklung optimieren**
2. **Umgebungsvariablen für lokale Entwicklung**
3. **Service-Abhängigkeiten**
4. **Docker-Compose für Produktion**
5. **Dokumentation**
2025-07-24 14:20:48 +02:00

13 KiB

Meldestelle - Produktionsumgebung Setup

Übersicht

Dieses Dokument beschreibt die Einrichtung und den Betrieb der Meldestelle-Anwendung in einer Produktionsumgebung mit Docker Compose. Die Produktionskonfiguration bietet erweiterte Sicherheitsfeatures, TLS-Verschlüsselung und optimierte Performance-Einstellungen.

🔒 Sicherheitsfeatures

Implementierte Sicherheitsmaßnahmen

  1. Starke Authentifizierung

    • Redis mit Passwort-Authentifizierung
    • PostgreSQL mit SCRAM-SHA-256 Authentifizierung
    • Kafka mit SASL/SSL Sicherheit
    • Zookeeper mit SASL Authentifizierung
  2. TLS/SSL Verschlüsselung

    • HTTPS-only für alle Web-Services
    • TLS-Unterstützung für Redis (konfigurierbar)
    • SSL für PostgreSQL
    • SSL/TLS für Kafka Inter-Broker Kommunikation
  3. Netzwerksicherheit

    • Interne Service-Kommunikation ohne Host-Port-Exposition
    • Nginx Reverse Proxy als einziger öffentlicher Zugang
    • Isoliertes Docker-Netzwerk mit definiertem Subnetz
  4. Container-Sicherheit

    • Non-root User für alle Services
    • Resource-Limits für alle Container
    • Read-only Mounts für Konfigurationsdateien
    • Restart-Policies für Hochverfügbarkeit

📋 Voraussetzungen

System-Anforderungen

  • Betriebssystem: Linux (Ubuntu 20.04+ empfohlen)
  • Docker: Version 20.10+
  • Docker Compose: Version 2.0+
  • RAM: Mindestens 8GB (16GB empfohlen)
  • CPU: Mindestens 4 Cores
  • Speicher: Mindestens 50GB freier Speicherplatz

Netzwerk-Anforderungen

  • Ports: 80, 443 (HTTP/HTTPS)
  • Domain: Gültige Domain-Namen für SSL-Zertifikate
  • DNS: Korrekte DNS-Konfiguration für alle Subdomains

🚀 Installation und Setup

1. Repository klonen

git clone <repository-url>
cd Meldestelle

2. Produktionsumgebung konfigurieren

# Kopieren Sie die Produktions-Umgebungsvariablen
cp .env.prod.example .env.prod

# Bearbeiten Sie die Produktionskonfiguration
nano .env.prod

3. SSL-Zertifikate einrichten

Siehe SSL Certificate Setup Guide für detaillierte Anweisungen.

Schnellstart mit Let's Encrypt

# Installieren Sie Certbot
sudo apt-get update
sudo apt-get install certbot

# Generieren Sie Zertifikate
sudo certbot certonly --standalone \
  -d yourdomain.com \
  -d api.yourdomain.com \
  -d auth.yourdomain.com \
  -d monitoring.yourdomain.com

# Kopieren Sie Zertifikate
sudo cp /etc/letsencrypt/live/yourdomain.com/fullchain.pem config/ssl/nginx/server.crt
sudo cp /etc/letsencrypt/live/yourdomain.com/privkey.pem config/ssl/nginx/server.key

# Generieren Sie Diffie-Hellman Parameter
openssl dhparam -out config/ssl/nginx/dhparam.pem 2048

4. Konfigurationsdateien anpassen

Passwörter generieren

# Starke Passwörter generieren
openssl rand -base64 32  # Für Datenbank-Passwörter
openssl rand -base64 64  # Für JWT-Secret
openssl rand -base64 32  # Für Redis-Passwort

Wichtige Konfigurationen in .env.prod

# Datenbank (ÄNDERN SIE DIESE WERTE!)
POSTGRES_PASSWORD=IHR_STARKES_DB_PASSWORT
DB_PASSWORD=IHR_STARKES_DB_PASSWORT

# Redis (ÄNDERN SIE DIESE WERTE!)
REDIS_PASSWORD=IHR_STARKES_REDIS_PASSWORT

# JWT (ÄNDERN SIE DIESE WERTE!)
JWT_SECRET=IHR_STARKER_JWT_SECRET_MINDESTENS_256_BITS

# Keycloak (ÄNDERN SIE DIESE WERTE!)
KEYCLOAK_ADMIN=ihr_admin_username
KEYCLOAK_ADMIN_PASSWORD=IHR_STARKES_ADMIN_PASSWORT

# Domains (ÄNDERN SIE DIESE WERTE!)
KC_HOSTNAME=auth.ihredomain.com
GRAFANA_HOSTNAME=monitoring.ihredomain.com
PROMETHEUS_HOSTNAME=metrics.ihredomain.com

5. Services starten

# Produktionsumgebung starten
docker-compose -f docker-compose.prod.yml --env-file .env.prod up -d

# Status überprüfen
docker-compose -f docker-compose.prod.yml ps

# Logs überwachen
docker-compose -f docker-compose.prod.yml logs -f

🔧 Konfiguration

Service-Übersicht

Service Interner Port Externer Zugang Beschreibung
nginx 80, 443 Reverse Proxy, SSL-Terminierung
postgres 5432 Datenbank (nur intern)
redis 6379 Cache & Event Store (nur intern)
keycloak 8443 Authentifizierung (über nginx)
kafka 9092, 9093 Messaging (nur intern)
zookeeper 2181 Kafka Koordination (nur intern)
prometheus 9090 Metriken (über nginx)
grafana 3000 Monitoring Dashboard (über nginx)
zipkin 9411 Distributed Tracing (nur intern)

Nginx Reverse Proxy Konfiguration

Erstellen Sie Service-spezifische Konfigurationen in config/nginx/conf.d/:

Keycloak (auth.ihredomain.com)

server {
    listen 443 ssl http2;
    server_name auth.ihredomain.com;

    ssl_certificate /etc/ssl/nginx/server.crt;
    ssl_private_key /etc/ssl/nginx/server.key;

    location / {
        proxy_pass https://keycloak:8443;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Grafana (monitoring.ihredomain.com)

server {
    listen 443 ssl http2;
    server_name monitoring.ihredomain.com;

    ssl_certificate /etc/ssl/nginx/server.crt;
    ssl_private_key /etc/ssl/nginx/server.key;

    location / {
        proxy_pass https://grafana:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

🔍 Monitoring und Logging

Prometheus Metriken

Zugang über: https://metrics.ihredomain.com

Überwachte Services:

  • Anwendungsmetriken
  • PostgreSQL Metriken
  • Redis Metriken
  • Kafka Metriken
  • System-Metriken (Node Exporter)
  • Container-Metriken (cAdvisor)

Grafana Dashboards

Zugang über: https://monitoring.ihredomain.com

Standard-Dashboards für:

  • Anwendungs-Performance
  • Datenbank-Performance
  • Redis-Performance
  • Kafka-Metriken
  • System-Übersicht

Log-Management

# Service-Logs anzeigen
docker-compose -f docker-compose.prod.yml logs [service-name]

# Logs in Echtzeit verfolgen
docker-compose -f docker-compose.prod.yml logs -f [service-name]

# Log-Rotation konfigurieren
# Fügen Sie zu /etc/docker/daemon.json hinzu:
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

🛡️ Sicherheits-Checkliste

Vor der Produktionsfreigabe

  • Alle Standard-Passwörter geändert
  • SSL-Zertifikate von vertrauenswürdiger CA installiert
  • Firewall konfiguriert (nur Ports 80, 443 öffentlich)
  • Backup-Strategie implementiert
  • Monitoring und Alerting konfiguriert
  • Log-Rotation eingerichtet
  • Security-Updates installiert
  • Penetration-Test durchgeführt

Regelmäßige Sicherheitsaufgaben

  • Passwörter alle 90 Tage rotieren
  • SSL-Zertifikate vor Ablauf erneuern
  • Security-Updates monatlich installieren
  • Backup-Wiederherstellung testen
  • Access-Logs regelmäßig überprüfen
  • Vulnerability-Scans durchführen

💾 Backup und Wiederherstellung

Automatische Backups

# Datenbank-Backup Script erstellen
cat > backup-db.sh << 'EOF'
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
docker-compose -f docker-compose.prod.yml exec -T postgres \
  pg_dump -U meldestelle_prod meldestelle_prod | \
  gzip > backups/db_backup_$DATE.sql.gz
find backups/ -name "db_backup_*.sql.gz" -mtime +30 -delete
EOF

chmod +x backup-db.sh

# Cron-Job für tägliche Backups
echo "0 2 * * * /path/to/backup-db.sh" | crontab -

Redis Backup

# Redis-Daten sichern
docker-compose -f docker-compose.prod.yml exec redis \
  redis-cli --rdb /data/backup.rdb

# Backup kopieren
docker cp $(docker-compose -f docker-compose.prod.yml ps -q redis):/data/backup.rdb \
  backups/redis_backup_$(date +%Y%m%d_%H%M%S).rdb

Wiederherstellung

# Datenbank wiederherstellen
gunzip -c backups/db_backup_YYYYMMDD_HHMMSS.sql.gz | \
docker-compose -f docker-compose.prod.yml exec -T postgres \
  psql -U meldestelle_prod -d meldestelle_prod

# Redis wiederherstellen
docker-compose -f docker-compose.prod.yml stop redis
docker cp backups/redis_backup_YYYYMMDD_HHMMSS.rdb \
  $(docker-compose -f docker-compose.prod.yml ps -q redis):/data/dump.rdb
docker-compose -f docker-compose.prod.yml start redis

🔄 Updates und Wartung

Rolling Updates

# Service einzeln aktualisieren
docker-compose -f docker-compose.prod.yml pull [service-name]
docker-compose -f docker-compose.prod.yml up -d --no-deps [service-name]

# Alle Services aktualisieren
docker-compose -f docker-compose.prod.yml pull
docker-compose -f docker-compose.prod.yml up -d

Wartungsmodus

# Wartungsseite aktivieren
docker-compose -f docker-compose.prod.yml stop nginx
# Wartungs-Nginx Container starten (mit Wartungsseite)

# Nach Wartung: Normalen Betrieb wiederherstellen
docker-compose -f docker-compose.prod.yml start nginx

🚨 Troubleshooting

Häufige Probleme

1. SSL-Zertifikat Fehler

# Zertifikat überprüfen
openssl x509 -in config/ssl/nginx/server.crt -text -noout

# Zertifikat-Gültigkeit prüfen
openssl x509 -in config/ssl/nginx/server.crt -noout -dates

2. Service startet nicht

# Logs überprüfen
docker-compose -f docker-compose.prod.yml logs [service-name]

# Container-Status prüfen
docker-compose -f docker-compose.prod.yml ps

# Health-Check Status
docker inspect $(docker-compose -f docker-compose.prod.yml ps -q [service-name])

3. Datenbankverbindung fehlgeschlagen

# Datenbank-Logs prüfen
docker-compose -f docker-compose.prod.yml logs postgres

# Verbindung testen
docker-compose -f docker-compose.prod.yml exec postgres \
  psql -U meldestelle_prod -d meldestelle_prod -c "SELECT 1;"

4. Redis-Verbindung fehlgeschlagen

# Redis-Logs prüfen
docker-compose -f docker-compose.prod.yml logs redis

# Redis-Verbindung testen
docker-compose -f docker-compose.prod.yml exec redis \
  redis-cli -a $REDIS_PASSWORD ping

5. Container startet nicht (Out of Memory)

# Container-Ressourcenverbrauch prüfen
docker stats --no-stream

# Speicher-Limits überprüfen
docker inspect $(docker-compose -f docker-compose.prod.yml ps -q [service-name]) | grep -i memory

# System-Speicher prüfen
free -h
df -h

# Container mit mehr Speicher neu starten
docker-compose -f docker-compose.prod.yml up -d --force-recreate [service-name]

6. Netzwerk-Verbindungsprobleme

# Docker-Netzwerk prüfen
docker network ls
docker network inspect meldestelle-network

# Service-zu-Service Verbindung testen
docker-compose -f docker-compose.prod.yml exec [service1] \
  ping [service2]

# Port-Erreichbarkeit testen
docker-compose -f docker-compose.prod.yml exec [service] \
  nc -zv [target-service] [port]

# DNS-Auflösung testen
docker-compose -f docker-compose.prod.yml exec [service] \
  nslookup [target-service]

7. Volume-Mount Probleme

# Volume-Status prüfen
docker volume ls
docker volume inspect [volume-name]

# Berechtigungen prüfen
docker-compose -f docker-compose.prod.yml exec [service] \
  ls -la /path/to/mounted/directory

# Volume-Speicherplatz prüfen
docker system df
docker system df -v

8. Docker-Compose Konfigurationsfehler

# Konfiguration validieren
docker-compose -f docker-compose.prod.yml config

# Syntax-Fehler finden
docker-compose -f docker-compose.prod.yml config --quiet

# Umgebungsvariablen-Substitution prüfen
docker-compose -f docker-compose.prod.yml config --resolve-image-digests

Performance-Optimierung

Ressourcen-Monitoring

# Container-Ressourcenverbrauch
docker stats

# Detaillierte Container-Informationen
docker-compose -f docker-compose.prod.yml top

Datenbank-Optimierung

# PostgreSQL-Performance analysieren
docker-compose -f docker-compose.prod.yml exec postgres \
  psql -U meldestelle_prod -d meldestelle_prod \
  -c "SELECT * FROM pg_stat_activity;"

📞 Support und Kontakt

Notfall-Kontakte

  • System-Administrator: [Kontaktinformationen]
  • Entwicklungsteam: [Kontaktinformationen]
  • Security-Team: [Kontaktinformationen]

Dokumentation

Monitoring-Dashboards


⚠️ Wichtiger Hinweis: Diese Produktionskonfiguration enthält sensible Sicherheitseinstellungen. Stellen Sie sicher, dass alle Passwörter und Geheimnisse sicher verwaltet und regelmäßig rotiert werden.