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
-
Starke Authentifizierung
- Redis mit Passwort-Authentifizierung
- PostgreSQL mit SCRAM-SHA-256 Authentifizierung
- Kafka mit SASL/SSL Sicherheit
- Zookeeper mit SASL Authentifizierung
-
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
-
Netzwerksicherheit
- Interne Service-Kommunikation ohne Host-Port-Exposition
- Nginx Reverse Proxy als einziger öffentlicher Zugang
- Isoliertes Docker-Netzwerk mit definiertem Subnetz
-
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 aus dem config Verzeichnis
cp config/.env.prod .env.prod
# Bearbeiten Sie die Produktionskonfiguration
nano .env.prod
# Oder verwenden Sie einen Symlink für direkte Nutzung
ln -sf config/.env.prod .env
3. SSL-Zertifikate einrichten
Siehe SSL-Zertifikat Setup Anleitung 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
- Grafana: https://monitoring.ihredomain.com
- Prometheus: https://metrics.ihredomain.com
- Keycloak Admin: https://auth.ihredomain.com/admin
⚠️ Wichtiger Hinweis: Diese Produktionskonfiguration enthält sensible Sicherheitseinstellungen. Stellen Sie sicher, dass alle Passwörter und Geheimnisse sicher verwaltet und regelmäßig rotiert werden.