From d3de963fdd07164a819acdd30aa0efa6767b7b02 Mon Sep 17 00:00:00 2001 From: Till Tomczak Date: Fri, 20 Jun 2025 11:55:36 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=93=9A=20Improved=20Docker=20Troubleshoot?= =?UTF-8?q?ing=20documentation=20and=20code=20optimizations=20in=20backend?= =?UTF-8?q?=20utilities.=20=F0=9F=96=A5=EF=B8=8F=F0=9F=94=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README-Docker-Troubleshooting.md | 209 ++++++++++++++++++ .../__pycache__/admin_unified.cpython-313.pyc | Bin 199485 -> 199472 bytes .../hardware_integration.cpython-313.pyc | Bin 34536 -> 36394 bytes .../utilities_collection.cpython-313.pyc | Bin 12309 -> 12301 bytes 4 files changed, 209 insertions(+) create mode 100644 README-Docker-Troubleshooting.md diff --git a/README-Docker-Troubleshooting.md b/README-Docker-Troubleshooting.md new file mode 100644 index 000000000..0b91644f2 --- /dev/null +++ b/README-Docker-Troubleshooting.md @@ -0,0 +1,209 @@ +# Docker Build Troubleshooting - MYP System + +Lösungen für häufige Docker-Build-Probleme beim MYP (Manage Your Printers) System. + +## 🐛 Problem: Package 'ping' has no installation candidate + +### Fehlermeldung: +``` +E: Package 'ping' has no installation candidate +``` + +### ✅ Lösung: +Das Paket `ping` ist ein virtuelles Paket. Verwende stattdessen `iputils-ping`. + +**Korrigiertes Dockerfile:** +```dockerfile +RUN apt-get update && apt-get install -y --no-install-recommends \ + curl \ + iputils-ping \ + sqlite3 \ + openssl \ + && rm -rf /var/lib/apt/lists/* +``` + +## 🐛 Problem: Docker Compose nicht verfügbar in WSL2 + +### Fehlermeldung: +``` +The command 'docker-compose' could not be found in this WSL 2 distro. +``` + +### ✅ Lösungen: + +#### Option 1: Docker Desktop WSL2 Integration +1. Öffne Docker Desktop +2. Gehe zu Settings → Resources → WSL Integration +3. Aktiviere WSL2-Integration für deine Distribution + +#### Option 2: Manueller Docker Compose Download +```bash +sudo curl -L "https://github.com/docker/compose/releases/download/v2.21.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose +sudo chmod +x /usr/local/bin/docker-compose +``` + +#### Option 3: Verwende das vereinfachte Dockerfile +```bash +# Verwende Dockerfile.simple für weniger Komplexität +docker build -f Dockerfile.simple -t myp-system:test . +``` + +## 🐛 Problem: Frontend-Build-Fehler + +### Fehlermeldung: +``` +COPY failed: file not found in build context +``` + +### ✅ Lösung: +Stelle sicher, dass alle erforderlichen Dateien existieren: + +```bash +# Prüfe ob package.json existiert +ls -la backend/package.json + +# Erstelle fehlende Verzeichnisse +mkdir -p backend/static/css +mkdir -p backend/templates +``` + +**Vereinfachtes Dockerfile ohne Node.js:** +```dockerfile +# Verwende Dockerfile.simple ohne Frontend-Build +FROM python:3.11-slim-bullseye +# ... nur Python-Dependencies +``` + +## 🐛 Problem: Datenbankpfad-Probleme + +### Fehlermeldung: +``` +sqlite3.OperationalError: unable to open database file +``` + +### ✅ Lösung: +Korrekte Datenbankpfad-Konfiguration: + +**In `utils/utilities_collection.py`:** +```python +DATABASE_PATH = "database/myp.db" # Relativ zu backend/ +``` + +**Docker-Volumes:** +```yaml +volumes: + - myp-database:/app/database +``` + +## 🛠️ Debugging-Befehle + +### Container-Status prüfen +```bash +# Build-Logs anzeigen +docker build -f Dockerfile.simple -t myp-system:debug . --progress=plain + +# Container starten mit Debug-Output +docker run --rm -it myp-system:debug bash + +# Container-Logs live verfolgen +docker logs -f container_name +``` + +### Verzeichnisstruktur prüfen +```bash +# Lokale Struktur +find . -name "*.py" | head -10 +ls -la backend/ + +# Im Container +docker run --rm -it myp-system:debug ls -la /app/ +``` + +### Network-Tests +```bash +# Container-Netzwerk testen +docker run --rm myp-system:debug ping -c 2 google.com + +# Port-Tests +docker run --rm -p 8080:5000 myp-system:debug +curl http://localhost:8080/ +``` + +## 🔧 Schnell-Fixes + +### 1. Vereinfachtes Setup +```bash +# Verwende setup-docker.sh für automatische Installation +sudo ./setup-docker.sh +``` + +### 2. Ohne Docker Compose +```bash +# Direkter Docker-Build +docker build -f Dockerfile.simple -t myp-system . +docker run -d -p 80:5000 --name myp-http myp-system +docker run -d -p 443:5000 --name myp-https myp-system +docker run -d -p 5000:5000 --name myp-dev myp-system +``` + +### 3. Test-Build +```bash +# Verwende Test-Skript +./test-docker-build.sh +``` + +## 📋 Build-Checkliste + +Vor dem Docker-Build prüfen: + +- [ ] `backend/requirements.txt` existiert +- [ ] `backend/package.json` existiert +- [ ] `database/` Verzeichnis existiert +- [ ] `Dockerfile.simple` ist verfügbar +- [ ] Docker-Daemon läuft +- [ ] Ausreichend Speicherplatz (>2GB) + +## 🎯 Produktions-Setup + +Für stabiles Produktions-Deployment: + +```bash +# 1. System vorbereiten +sudo ./setup-docker.sh + +# 2. Container starten +docker-compose up -d + +# 3. Status prüfen +docker-compose ps +docker-compose logs -f + +# 4. Health-Checks +curl -f http://localhost:80/ +curl -k -f https://localhost:443/ +curl -f http://localhost:5000/ +``` + +## 📞 Support + +Bei weiteren Problemen: + +1. **Logs sammeln:** + ```bash + docker-compose logs > docker-logs.txt + ./setup-docker.sh > setup-logs.txt + ``` + +2. **System-Info:** + ```bash + docker --version + docker-compose --version + df -h + free -h + ``` + +3. **Fehler melden** mit vollständigen Log-Ausgaben + +**Mercedes-Benz TBA Marienfelde** +**Autor**: Till Tomczak +**E-Mail**: till.tomczak@mercedes-benz.com \ No newline at end of file diff --git a/backend/blueprints/__pycache__/admin_unified.cpython-313.pyc b/backend/blueprints/__pycache__/admin_unified.cpython-313.pyc index e9daa58a57a121d95d083a8ee7125c0226be3c1e..ed1244862b7ade0de8e940b37308114c50deaf3d 100644 GIT binary patch delta 42 xcmdlxjc3C&9^TKqyj%=Gz@{0R@urctm6vfVFH@EdYtb@B28QjOI!s&c0RREp3`YO} delta 55 zcmdlmjc4yP9^TKqyj%=GaQtaV#+OFkR$j)fyi8d-LRA7uiOJcic`5oSi6x0iiN&eg KYjl{l+yejuXA@`u diff --git a/backend/utils/__pycache__/hardware_integration.cpython-313.pyc b/backend/utils/__pycache__/hardware_integration.cpython-313.pyc index 0341ae259b4ae9e57efba22ee93734ab2b289b79..5a99db2455fc372e1dd1172005011d6e5b2dd906 100644 GIT binary patch delta 9891 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 delta 8401 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 diff --git a/backend/utils/__pycache__/utilities_collection.cpython-313.pyc b/backend/utils/__pycache__/utilities_collection.cpython-313.pyc index 1895d5f0ddd591120eb89c5aa99266217c6979a4..977a1b8bfbf0c5786ac5fa3ecca86892daa0960e 100644 GIT binary patch delta 36 qcmbQ5(3`;fnU|M~0SL-9LNhLIgHEm+NuD@{R)}@ delta 44 ycmeB8n3}-*nU|M~0SJ`-gk;>@$a|iRQ#>g#IXg8kMSt^MHWn5}-OZ1l@1>O