# 🐳 Docker Deployment Anleitung

## Voraussetzungen

- Docker installiert (`docker --version`)
- Docker Compose installiert (`docker-compose --version`)
- Min. 2 GB freier RAM
- Min. 5 GB freier Speicherplatz

## 🚀 Schnellstart

### Option 1: Mit Deploy-Script (Empfohlen)

```bash
./deploy.sh
```

Folgen Sie den Anweisungen im interaktiven Menü.

### Option 2: Manuelle Commands

**Alles bauen und starten:**
```bash
docker-compose up -d --build
```

**Nur starten (bereits gebaut):**
```bash
docker-compose up -d
```

**Stoppen:**
```bash
docker-compose down
```

**Logs anzeigen:**
```bash
docker-compose logs -f
```

## 📦 Was wird deployed?

### 1. Flutter Web App Container
- **Image:** `flutter-tank-web:latest`
- **Port:** 8080 (Host) → 80 (Container)
- **URL:** `http://localhost:8080`
- **Technologie:** Flutter Web + Nginx

### 2. Proxy Server Container (Optional)
- **Image:** `ptv-proxy:latest`
- **Port:** 3000 (Host) → 3000 (Container)
- **URL:** `http://localhost:3000`
- **Technologie:** Node.js

## 🏗️ Build-Prozess

Der Build läuft in 2 Phasen:

**Phase 1: Flutter Build (Multi-Stage)**
1. Ubuntu base image
2. Flutter SDK installieren
3. Dependencies installieren (`flutter pub get`)
4. Web App bauen (`flutter build web`)

**Phase 2: Production (Nginx)**
1. Alpine Nginx image
2. Gebaute App kopieren
3. Nginx konfigurieren
4. Port 80 exponieren

**Geschätzte Build-Zeit:** 5-10 Minuten (beim ersten Mal)

## 🌐 Auf Server deployen

### 1. Server vorbereiten

**SSH zum Server:**
```bash
ssh user@your-server.com
```

**Docker installieren (falls nicht vorhanden):**
```bash
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER
```

**Docker Compose installieren:**
```bash
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
```

### 2. Code auf Server übertragen

**Option A: Git Clone**
```bash
git clone https://github.com/your-repo/flutter_tank_web_app.git
cd flutter_tank_web_app
```

**Option B: SCP/Rsync**
```bash
# Von lokalem Rechner aus
rsync -avz --exclude 'build' --exclude '.dart_tool' \
  /home/digitalman/Development/flutter_tank_web_app/ \
  user@your-server.com:/opt/flutter-tank-app/
```

### 3. Environment anpassen

Bearbeiten Sie `lib/config/environment.dart`:
```dart
static const bool useLocalProxy = false;  // Für Produktion
```

### 4. Deployen

```bash
cd /opt/flutter-tank-app
./deploy.sh
# Wählen Sie Option 3: "Alles bauen und starten"
```

### 5. Mit Domain verbinden (Optional)

**Nginx Reverse Proxy konfigurieren:**
```nginx
# /etc/nginx/sites-available/tank.yourdomain.com
server {
    listen 80;
    server_name tank.yourdomain.com;

    location / {
        proxy_pass http://localhost:8080;
        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;
    }
}
```

**Aktivieren:**
```bash
sudo ln -s /etc/nginx/sites-available/tank.yourdomain.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
```

**SSL mit Let's Encrypt:**
```bash
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d tank.yourdomain.com
```

## 🔧 Konfiguration

### Ports ändern

In `docker-compose.yml`:
```yaml
ports:
  - "8080:80"  # Ändern Sie 8080 auf gewünschten Port
```

### Umgebungsvariablen

Erstellen Sie `.env` Datei:
```env
# App Settings
APP_PORT=8080
PROXY_PORT=3000

# Domain (für Traefik)
DOMAIN=tank.yourdomain.com
```

### Mit Traefik (Reverse Proxy)

Die `docker-compose.yml` enthält bereits Traefik Labels.

**Traefik setup:**
```yaml
# docker-compose.traefik.yml
version: '3.8'
services:
  traefik:
    image: traefik:v2.10
    command:
      - "--providers.docker=true"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.letsencrypt.acme.email=your@email.com"
      - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
      - "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "./letsencrypt:/letsencrypt"
```

## 📊 Monitoring

### Container Status prüfen
```bash
docker-compose ps
```

### Logs anschauen
```bash
# Alle Services
docker-compose logs -f

# Nur Web App
docker-compose logs -f flutter-tank-web

# Nur Proxy
docker-compose logs -f ptv-proxy
```

### Resource Usage
```bash
docker stats
```

### Health Check
```bash
# Web App
curl http://localhost:8080/health

# Proxy
curl http://localhost:3000/health
```

## 🔄 Updates deployen

```bash
# Code aktualisieren
git pull

# Neu bauen und starten
docker-compose up -d --build

# Alte Images aufräumen
docker image prune -f
```

## 🛠️ Troubleshooting

### Container startet nicht
```bash
# Logs prüfen
docker-compose logs flutter-tank-web

# Container Status
docker-compose ps

# Neu starten
docker-compose restart flutter-tank-web
```

### Port bereits belegt
```bash
# Prozess auf Port finden
sudo lsof -i :8080

# Port in docker-compose.yml ändern
```

### Out of Memory
```bash
# Docker Memory Limit erhöhen
# In docker-compose.yml unter service:
deploy:
  resources:
    limits:
      memory: 2G
```

### Build schlägt fehl
```bash
# Docker Cache leeren
docker builder prune -a

# Komplett neu bauen
docker-compose build --no-cache
```

## 📦 Backup & Restore

### Volumes sichern
```bash
# Data Volume backup
docker run --rm -v flutter-tank-data:/data -v $(pwd):/backup alpine tar czf /backup/data-backup.tar.gz -C /data .
```

### Image speichern
```bash
# Image exportieren
docker save flutter-tank-web:latest | gzip > flutter-tank-web.tar.gz

# Image importieren
docker load < flutter-tank-web.tar.gz
```

## 🔒 Sicherheit

### Best Practices

1. **Nicht als Root laufen** (bereits in Proxy-Dockerfile implementiert)
2. **Security Headers** (bereits in nginx.conf)
3. **Firewall konfigurieren:**
```bash
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
```

4. **Regular Updates:**
```bash
# Base images updaten
docker-compose pull
docker-compose up -d
```

## 🎯 Performance Optimierung

### Nginx Caching
Bereits in `nginx.conf` konfiguriert:
- Static assets: 1 Jahr Cache
- Gzip Kompression aktiv

### Docker Image Size
```bash
# Image Größe prüfen
docker images flutter-tank-web

# Multi-stage build reduziert Größe bereits deutlich
```

## 📝 Checkliste Produktion

- [ ] `useLocalProxy = false` in environment.dart
- [ ] Domain konfiguriert
- [ ] SSL Zertifikat installiert
- [ ] Firewall konfiguriert
- [ ] Backup-Strategie definiert
- [ ] Monitoring eingerichtet
- [ ] Logs rotieren konfiguriert
- [ ] Update-Prozess dokumentiert

## 🆘 Support

Bei Problemen:
1. Logs prüfen: `docker-compose logs`
2. Container Status: `docker-compose ps`
3. Health Checks: `curl http://localhost:8080/health`
4. Docker System: `docker system df`
