fertig bis auf Tankstellen und Graph
This commit is contained in:
363
DOCKER_DEPLOYMENT.md
Normal file
363
DOCKER_DEPLOYMENT.md
Normal file
@@ -0,0 +1,363 @@
|
||||
# 🐳 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`
|
||||
Reference in New Issue
Block a user