# Production Deployment Guide

## Voraussetzungen

- Docker und Docker Compose auf dem Server installiert
- Traefik läuft im `dockge_default` Netzwerk
- Domain `wetter.fuerst-stuttgart.de` zeigt auf den Server
- `.env` Datei mit Datenbank-Credentials

## 1. Images bauen und pushen

Lokal auf dem Entwicklungsrechner:

```bash
# Alle Images bauen und zur Registry pushen
./push-images.sh
```

Dieser Befehl:
- Baut `wetterstation-collector`
- Baut `wetterstation-api`
- Baut `wetterstation-frontend`
- Pusht alle Images zu `docker.citysensor.de`

## 2. Server vorbereiten

Auf dem Production-Server:

```bash
# Projekt-Verzeichnis erstellen
mkdir -p ~/wetterstation
cd ~/wetterstation

# docker-compose.prod.yml hochladen
# .env Datei erstellen oder hochladen
```

### Beispiel .env für Production:

```env
# Datenbank
DB_NAME=wetterstation
DB_USER=wetterstation_user
DB_PASSWORD=<sicheres-passwort>
DB_HOST=postgres
DB_PORT=5432

# Collector
COLLECTOR_PORT=8001

# Optional: PostgreSQL custom port
# DB_PORT=5432
```

## 3. Deployment starten

```bash
# Images von Registry pullen
docker-compose -f docker-compose.prod.yml pull

# Services starten
docker-compose -f docker-compose.prod.yml up -d

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

## 4. Erreichbarkeit

Nach erfolgreichem Start ist die Wetterstation erreichbar unter:

- **Frontend**: https://wetter.fuerst-stuttgart.de/
- **API**: https://wetter.fuerst-stuttgart.de/api/health
- **Collector**: https://wetter.fuerst-stuttgart.de/collector/health

Traefik übernimmt:
- Automatisches HTTPS (Let's Encrypt)
- Routing basierend auf Pfad
- StripPrefix für `/api` und `/collector`

## 5. Updates deployen

Bei Code-Änderungen:

```bash
# Lokal: Images neu bauen und pushen
./push-images.sh

# Server: Neue Images pullen und Container neu starten
ssh user@server
cd ~/wetterstation
docker-compose -f docker-compose.prod.yml pull
docker-compose -f docker-compose.prod.yml up -d
```

## 6. Nützliche Befehle

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

# Logs einzelner Services
docker-compose -f docker-compose.prod.yml logs -f frontend
docker-compose -f docker-compose.prod.yml logs -f api
docker-compose -f docker-compose.prod.yml logs -f collector
docker-compose -f docker-compose.prod.yml logs -f postgres

# Service neu starten
docker-compose -f docker-compose.prod.yml restart api

# Alle Services stoppen
docker-compose -f docker-compose.prod.yml down

# Services stoppen und Volumes löschen (⚠️ löscht Daten!)
docker-compose -f docker-compose.prod.yml down -v
```

## 7. Datenbank-Backup

```bash
# Backup erstellen
docker exec wetterstation_db_prod pg_dump -U wetterstation_user wetterstation > backup_$(date +%Y%m%d_%H%M%S).sql

# Backup wiederherstellen
docker exec -i wetterstation_db_prod psql -U wetterstation_user wetterstation < backup.sql
```

## Architektur

```
Internet
   ↓
Traefik (dockge_default)
   ↓
   ├─→ Frontend (nginx) → API (intern)
   ├─→ API (FastAPI)
   └─→ Collector (FastAPI)
         ↓
    PostgreSQL (intern)
```

**Netzwerke**:
- `dockge_default` (external): Traefik-Netzwerk
- `wetterstation_internal`: Interne Service-Kommunikation

**Container**:
- `wetterstation_frontend_prod`: Nginx + React SPA
- `wetterstation_api_prod`: FastAPI (Weather Data API)
- `wetterstation_collector_prod`: FastAPI (Data Collection)
- `wetterstation_db_prod`: PostgreSQL 16

## Troubleshooting

### SSL-Zertifikat wird nicht erstellt

Prüfe:
- DNS zeigt auf Server: `dig wetter.fuerst-stuttgart.de`
- Traefik läuft: `docker ps | grep traefik`
- Port 80/443 offen: `netstat -tulpn | grep -E ':(80|443)'`

### API nicht erreichbar

```bash
# Prüfe ob Container läuft
docker ps | grep wetterstation_api_prod

# Prüfe Logs
docker logs wetterstation_api_prod

# Teste intern
docker exec wetterstation_api_prod curl localhost:8000/health
```

### Datenbank-Verbindungsfehler

```bash
# Prüfe ob DB läuft
docker ps | grep wetterstation_db_prod

# Prüfe DB-Logs
docker logs wetterstation_db_prod

# Teste Verbindung
docker exec wetterstation_db_prod psql -U wetterstation_user -d wetterstation -c "SELECT 1"
```
