From e143f4ab164a30c7b98207e240bff2d11acc92d9 Mon Sep 17 00:00:00 2001 From: Till Tomczak Date: Mon, 31 Mar 2025 14:32:30 +0200 Subject: [PATCH] Verbessere die Fehlerbehandlung und Diagnostik in Installationsskripten MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Füge ausführliche Fehlerprüfungen und detaillierte Fehlermeldungen hinzu - Prüfe Voraussetzungen und Dateien vor der Installation - Erfasse und zeige Container-Logs bei Fehlern - Implementiere bessere API-Tests und Verfügbarkeitsprüfungen - Verbessere die Datenbank-Migrationsprüfung im Frontend 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- install-backend.sh | 101 ++++++++++++++++++++++++++++++++------ install-frontend.sh | 115 +++++++++++++++++++++++++++++++++++++++----- 2 files changed, 191 insertions(+), 25 deletions(-) diff --git a/install-backend.sh b/install-backend.sh index b25112c..29197b3 100755 --- a/install-backend.sh +++ b/install-backend.sh @@ -3,8 +3,6 @@ # MYP Backend Installations-Skript # Dieses Skript installiert das Backend mit Docker und Host-Netzwerkanbindung -set -e # Bei Fehler beenden - # Farbcodes für Ausgabe RED='\033[0;31m' GREEN='\033[0;32m' @@ -17,26 +15,58 @@ log() { echo -e "${BLUE}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1" } +error_log() { + echo -e "${RED}[$(date +'%Y-%m-%d %H:%M:%S')] FEHLER:${NC} $1" >&2 +} + # Pfade definieren SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" BACKEND_DIR="$SCRIPT_DIR/backend" +# Prüfen ob Verzeichnis existiert +if [ ! -d "$BACKEND_DIR" ]; then + error_log "Backend-Verzeichnis '$BACKEND_DIR' nicht gefunden." + exit 1 +fi + # Prüfen ob Docker installiert ist if ! command -v docker &> /dev/null; then - log "${RED}Docker ist nicht installiert. Bitte installieren Sie Docker.${NC}" + error_log "Docker ist nicht installiert. Bitte installieren Sie Docker." log "Siehe: https://docs.docker.com/get-docker/" exit 1 fi if ! command -v docker compose &> /dev/null; then - log "${RED}Docker Compose ist nicht installiert. Bitte installieren Sie Docker Compose.${NC}" + error_log "Docker Compose ist nicht installiert. Bitte installieren Sie Docker Compose." log "Siehe: https://docs.docker.com/compose/install/" exit 1 fi +# Prüfen ob wget installiert ist (wird für healthcheck verwendet) +if ! command -v wget &> /dev/null; then + error_log "wget ist nicht installiert, wird aber für den Container-Healthcheck benötigt." + log "Installation mit: sudo apt-get install wget" + exit 1 +fi + # Wechsle ins Backend-Verzeichnis -cd "$BACKEND_DIR" -log "Arbeite im Verzeichnis: $BACKEND_DIR" +log "Wechsle ins Verzeichnis: $BACKEND_DIR" +cd "$BACKEND_DIR" || { + error_log "Konnte nicht ins Verzeichnis $BACKEND_DIR wechseln." + exit 1 +} + +# Prüfe ob Dockerfile existiert +if [ ! -f "Dockerfile" ]; then + error_log "Dockerfile nicht gefunden in $BACKEND_DIR." + exit 1 +fi + +# Prüfe ob docker-compose.yml existiert +if [ ! -f "docker-compose.yml" ]; then + error_log "docker-compose.yml nicht gefunden in $BACKEND_DIR." + exit 1 +fi # Erstelle .env-Datei log "${YELLOW}Erstelle .env Datei...${NC}" @@ -47,40 +77,83 @@ TAPO_USERNAME=till.tomczak@mercedes-benz.com TAPO_PASSWORD=744563017196A PRINTERS={"Printer 1": {"ip": "192.168.0.100"}, "Printer 2": {"ip": "192.168.0.101"}, "Printer 3": {"ip": "192.168.0.102"}, "Printer 4": {"ip": "192.168.0.103"}, "Printer 5": {"ip": "192.168.0.104"}, "Printer 6": {"ip": "192.168.0.106"}} EOL + +if [ ! -f ".env" ]; then + error_log "Konnte .env-Datei nicht erstellen. Prüfen Sie die Berechtigungen." + exit 1 +fi log "${GREEN}.env Datei erfolgreich erstellt${NC}" # Verzeichnisse erstellen log "Erstelle benötigte Verzeichnisse" -mkdir -p logs -mkdir -p instance +if ! mkdir -p logs; then + error_log "Konnte Verzeichnis 'logs' nicht erstellen. Prüfen Sie die Berechtigungen." + exit 1 +fi + +if ! mkdir -p instance; then + error_log "Konnte Verzeichnis 'instance' nicht erstellen. Prüfen Sie die Berechtigungen." + exit 1 +fi # Docker-Image bauen und starten log "${YELLOW}Baue und starte Backend-Container...${NC}" -docker compose up -d --build +if ! docker compose up -d --build; then + error_log "Docker Compose fehlgeschlagen. Siehe Fehlermeldung oben." + exit 1 +fi # Prüfe, ob der Container läuft -sleep 5 +log "Warte 10 Sekunden, bis der Container gestartet ist..." +sleep 10 if docker ps | grep -q "myp-backend"; then - log "${GREEN}Backend erfolgreich installiert und gestartet unter http://localhost:5000${NC}" + log "${GREEN}Backend-Container läuft${NC}" else - log "${RED}Fehler beim Starten des Backend-Containers. Bitte prüfen Sie die Docker-Logs mit 'docker logs myp-backend'${NC}" + error_log "Backend-Container läuft nicht. Container-Status:" + docker ps -a | grep myp-backend + log "Container-Logs:" + docker logs myp-backend exit 1 fi +# Test API-Endpunkt +log "${YELLOW}Teste Backend-API...${NC}" +if curl -s http://localhost:5000/health | grep -q "healthy"; then + log "${GREEN}Backend-API ist erreichbar und funktioniert${NC}" +else + error_log "Backend-API ist nicht erreichbar. HTTP-Status:" + curl -s -o /dev/null -w "%{http_code}" http://localhost:5000/health + log "Container-Logs:" + docker logs myp-backend +fi + # Initialisierung der Datenbank prüfen log "${YELLOW}Prüfe Datenbank-Initialisierung...${NC}" if [ ! -s "instance/myp.db" ]; then log "${YELLOW}Datenbank scheint leer zu sein. Führe Initialisierungsskript aus...${NC}" - docker exec myp-backend python -c "from app import init_db; init_db()" + DB_INIT_OUTPUT=$(docker exec myp-backend python -c "from app import init_db; init_db()" 2>&1) if [ $? -eq 0 ]; then log "${GREEN}Datenbank erfolgreich initialisiert${NC}" else - log "${RED}Fehler bei der Datenbank-Initialisierung${NC}" + error_log "Fehler bei der Datenbank-Initialisierung:" + echo "$DB_INIT_OUTPUT" + log "Container-Logs:" + docker logs myp-backend fi else log "${GREEN}Datenbank existiert bereits${NC}" fi +# Teste, ob ein API-Endpunkt Daten zurückgibt +log "${YELLOW}Teste Datenbank-Verbindung über API...${NC}" +if curl -s http://localhost:5000/api/printers | grep -q "\[\]"; then + log "${GREEN}Datenbank-Verbindung funktioniert${NC}" +else + log "${YELLOW}API gibt keine leere Drucker-Liste zurück. Möglicherweise ist die DB nicht korrekt initialisiert.${NC}" + log "API-Antwort:" + curl -s http://localhost:5000/api/printers +fi + log "${GREEN}=== Installation abgeschlossen ===${NC}" log "Das Backend ist unter http://localhost:5000 erreichbar" log "Anzeigen der Logs: docker logs -f myp-backend" diff --git a/install-frontend.sh b/install-frontend.sh index e4ae93b..837666f 100755 --- a/install-frontend.sh +++ b/install-frontend.sh @@ -3,8 +3,6 @@ # MYP Frontend Installations-Skript # Dieses Skript installiert das Frontend mit Docker und Host-Netzwerkanbindung -set -e # Bei Fehler beenden - # Farbcodes für Ausgabe RED='\033[0;31m' GREEN='\033[0;32m' @@ -17,26 +15,64 @@ log() { echo -e "${BLUE}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1" } +error_log() { + echo -e "${RED}[$(date +'%Y-%m-%d %H:%M:%S')] FEHLER:${NC} $1" >&2 +} + # Pfade definieren SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" FRONTEND_DIR="$SCRIPT_DIR/packages/reservation-platform" +# Prüfen ob Verzeichnis existiert +if [ ! -d "$FRONTEND_DIR" ]; then + error_log "Frontend-Verzeichnis '$FRONTEND_DIR' nicht gefunden." + exit 1 +fi + # Prüfen ob Docker installiert ist if ! command -v docker &> /dev/null; then - log "${RED}Docker ist nicht installiert. Bitte installieren Sie Docker.${NC}" + error_log "Docker ist nicht installiert. Bitte installieren Sie Docker." log "Siehe: https://docs.docker.com/get-docker/" exit 1 fi if ! command -v docker compose &> /dev/null; then - log "${RED}Docker Compose ist nicht installiert. Bitte installieren Sie Docker Compose.${NC}" + error_log "Docker Compose ist nicht installiert. Bitte installieren Sie Docker Compose." log "Siehe: https://docs.docker.com/compose/install/" exit 1 fi +# Prüfen ob wget installiert ist (wird für healthcheck verwendet) +if ! command -v wget &> /dev/null; then + error_log "wget ist nicht installiert, wird aber für den Container-Healthcheck benötigt." + log "Installation mit: sudo apt-get install wget" + exit 1 +fi + # Wechsle ins Frontend-Verzeichnis -cd "$FRONTEND_DIR" -log "Arbeite im Verzeichnis: $FRONTEND_DIR" +log "Wechsle ins Verzeichnis: $FRONTEND_DIR" +cd "$FRONTEND_DIR" || { + error_log "Konnte nicht ins Verzeichnis $FRONTEND_DIR wechseln." + exit 1 +} + +# Prüfe ob Dockerfile existiert +if [ ! -f "Dockerfile" ]; then + error_log "Dockerfile nicht gefunden in $FRONTEND_DIR." + exit 1 +fi + +# Prüfe ob docker-compose.yml existiert +if [ ! -f "docker-compose.yml" ]; then + error_log "docker-compose.yml nicht gefunden in $FRONTEND_DIR." + exit 1 +fi + +# Prüfe ob package.json existiert +if [ ! -f "package.json" ]; then + error_log "package.json nicht gefunden in $FRONTEND_DIR." + exit 1 +fi # Erstelle .env-Datei log "${YELLOW}Erstelle .env Datei...${NC}" @@ -52,26 +88,83 @@ OAUTH_CLIENT_SECRET=client_secret # Backend-API URL (IP-Adresse oder Hostname des Backend-Servers) NEXT_PUBLIC_API_URL=http://localhost:5000 EOL + +if [ ! -f ".env" ]; then + error_log "Konnte .env-Datei nicht erstellen. Prüfen Sie die Berechtigungen." + exit 1 +fi log "${GREEN}.env Datei erfolgreich erstellt${NC}" log "${YELLOW}HINWEIS: Bitte passen Sie die Backend-URL in der .env-Datei an, falls das Backend auf einem anderen Server läuft.${NC}" # Datenbank-Verzeichnis erstellen log "Erstelle Datenbankverzeichnis" -mkdir -p db +if ! mkdir -p db; then + error_log "Konnte Verzeichnis 'db' nicht erstellen. Prüfen Sie die Berechtigungen." + exit 1 +fi # Docker-Image bauen und starten log "${YELLOW}Baue und starte Frontend-Container...${NC}" -docker compose up -d --build +if ! docker compose up -d --build; then + error_log "Docker Compose fehlgeschlagen. Siehe Fehlermeldung oben." + exit 1 +fi # Prüfe, ob der Container läuft -sleep 5 +log "Warte 10 Sekunden, bis der Container gestartet ist..." +sleep 10 if docker ps | grep -q "myp-frontend"; then - log "${GREEN}Frontend erfolgreich installiert und gestartet unter http://localhost:3000${NC}" + log "${GREEN}Frontend-Container läuft${NC}" else - log "${RED}Fehler beim Starten des Frontend-Containers. Bitte prüfen Sie die Docker-Logs mit 'docker logs myp-frontend'${NC}" + error_log "Frontend-Container läuft nicht. Container-Status:" + docker ps -a | grep myp-frontend + log "Container-Logs:" + docker logs myp-frontend exit 1 fi +# Teste ob der Server erreichbar ist +log "${YELLOW}Teste ob Frontend-Server erreichbar ist...${NC}" +MAX_ATTEMPTS=12 +ATTEMPT=1 + +while [ $ATTEMPT -le $MAX_ATTEMPTS ]; do + log "Versuch $ATTEMPT/$MAX_ATTEMPTS..." + if curl -s -o /dev/null -w "%{http_code}" http://localhost:3000 | grep -q "200\|304"; then + log "${GREEN}Frontend-Server ist erreichbar!${NC}" + break + else + if [ $ATTEMPT -eq $MAX_ATTEMPTS ]; then + log "${YELLOW}Server noch nicht erreichbar. Das ist normal, wenn der Next.js-Build länger dauert.${NC}" + log "Überprüfen Sie den Container-Status mit: docker logs myp-frontend" + log "Der Server sollte in wenigen Minuten verfügbar sein." + else + log "Server noch nicht erreichbar. Warte 10 Sekunden..." + sleep 10 + fi + fi + ATTEMPT=$((ATTEMPT+1)) +done + +# Prüfe ob die Datenbank-Migration erfolgt ist +log "${YELLOW}Prüfe Datenbank-Migration...${NC}" +if [ -f "db/sqlite.db" ]; then + log "${GREEN}Datenbank existiert${NC}" + + # Prüfe Datenbankgröße + DB_SIZE=$(du -b db/sqlite.db | cut -f1) + if [ "$DB_SIZE" -gt 1000 ]; then + log "${GREEN}Datenbank scheint initialisiert zu sein (Größe: $DB_SIZE Bytes)${NC}" + else + log "${YELLOW}Datenbank ist sehr klein (Größe: $DB_SIZE Bytes). Möglicherweise wurde die Migration nicht korrekt ausgeführt.${NC}" + log "Sie können die Migration manuell ausführen mit: docker exec myp-frontend pnpm db:migrate" + fi +else + log "${YELLOW}Datenbank-Datei nicht gefunden. Migration könnte fehlgeschlagen sein.${NC}" + log "Führen Sie die Migration manuell aus: docker exec myp-frontend pnpm db:migrate" + log "Prüfen Sie die Container-Logs: docker logs myp-frontend" +fi + log "${GREEN}=== Installation abgeschlossen ===${NC}" log "Das Frontend ist unter http://localhost:3000 erreichbar" log "Anzeigen der Logs: docker logs -f myp-frontend"