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**
487 lines
13 KiB
Markdown
487 lines
13 KiB
Markdown
# 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
|
|
|
|
```bash
|
|
git clone <repository-url>
|
|
cd Meldestelle
|
|
```
|
|
|
|
### 2. Produktionsumgebung konfigurieren
|
|
|
|
```bash
|
|
# 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](config/ssl/README.md) für detaillierte Anweisungen.
|
|
|
|
#### Schnellstart mit Let's Encrypt
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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)
|
|
```nginx
|
|
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)
|
|
```nginx
|
|
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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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
|
|
```bash
|
|
# 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
|
|
```bash
|
|
# 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
|
|
```bash
|
|
# 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
|
|
```bash
|
|
# 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)
|
|
```bash
|
|
# 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
|
|
```bash
|
|
# 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
|
|
```bash
|
|
# 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
|
|
```bash
|
|
# 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
|
|
```bash
|
|
# Container-Ressourcenverbrauch
|
|
docker stats
|
|
|
|
# Detaillierte Container-Informationen
|
|
docker-compose -f docker-compose.prod.yml top
|
|
```
|
|
|
|
#### Datenbank-Optimierung
|
|
```bash
|
|
# 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
|
|
- [API-Dokumentation](docs/api/)
|
|
- [Architektur-Dokumentation](docs/architecture/)
|
|
- [Entwickler-Dokumentation](docs/development/)
|
|
|
|
### 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.
|