# 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.
