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**
This commit is contained in:
@@ -0,0 +1,486 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user