364 lines
7.0 KiB
Markdown
364 lines
7.0 KiB
Markdown
# 🐳 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`
|