Files
flutter_tank_web_app/DOCKER_DEPLOYMENT.md

7.0 KiB

🐳 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)

./deploy.sh

Folgen Sie den Anweisungen im interaktiven Menü.

Option 2: Manuelle Commands

Alles bauen und starten:

docker-compose up -d --build

Nur starten (bereits gebaut):

docker-compose up -d

Stoppen:

docker-compose down

Logs anzeigen:

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:

ssh user@your-server.com

Docker installieren (falls nicht vorhanden):

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER

Docker Compose installieren:

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

git clone https://github.com/your-repo/flutter_tank_web_app.git
cd flutter_tank_web_app

Option B: SCP/Rsync

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

static const bool useLocalProxy = false;  // Für Produktion

4. Deployen

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:

# /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:

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:

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d tank.yourdomain.com

🔧 Konfiguration

Ports ändern

In docker-compose.yml:

ports:
  - "8080:80"  # Ändern Sie 8080 auf gewünschten Port

Umgebungsvariablen

Erstellen Sie .env Datei:

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

# 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

docker-compose ps

Logs anschauen

# 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

docker stats

Health Check

# Web App
curl http://localhost:8080/health

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

🔄 Updates deployen

# 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

# 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

# Prozess auf Port finden
sudo lsof -i :8080

# Port in docker-compose.yml ändern

Out of Memory

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

Build schlägt fehl

# Docker Cache leeren
docker builder prune -a

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

📦 Backup & Restore

Volumes sichern

# 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

# 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:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
  1. Regular Updates:
# 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

# 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