Verbessere die Fehlerbehandlung und Diagnostik in Installationsskripten

- 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 <noreply@anthropic.com>
This commit is contained in:
Till Tomczak 2025-03-31 14:32:30 +02:00
parent f1541478ad
commit e143f4ab16
2 changed files with 191 additions and 25 deletions

View File

@ -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"

View File

@ -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"