7.0 KiB
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)
- Ubuntu base image
- Flutter SDK installieren
- Dependencies installieren (
flutter pub get) - Web App bauen (
flutter build web)
Phase 2: Production (Nginx)
- Alpine Nginx image
- Gebaute App kopieren
- Nginx konfigurieren
- 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
- Nicht als Root laufen (bereits in Proxy-Dockerfile implementiert)
- Security Headers (bereits in nginx.conf)
- Firewall konfigurieren:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
- 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 = falsein environment.dart- Domain konfiguriert
- SSL Zertifikat installiert
- Firewall konfiguriert
- Backup-Strategie definiert
- Monitoring eingerichtet
- Logs rotieren konfiguriert
- Update-Prozess dokumentiert
🆘 Support
Bei Problemen:
- Logs prüfen:
docker-compose logs - Container Status:
docker-compose ps - Health Checks:
curl http://localhost:8080/health - Docker System:
docker system df