• Korrigiere YAML-Syntax-Fehler in docker-compose.yml-Dateien • Füge automatische Docker-Installation für Raspberry Pi hinzu • Aktualisiere Installationsdokumentation mit Fehlerbehebungstipps • Verwende durchgängig docker-compose statt docker compose für bessere Kompatibilität 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
322 lines
11 KiB
Bash
Executable File
322 lines
11 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# MYP Frontend Installations-Skript
|
|
# Dieses Skript installiert das Frontend mit Docker und Host-Netzwerkanbindung
|
|
|
|
# Farbcodes für Ausgabe
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[0;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# Funktion zur Ausgabe mit Zeitstempel
|
|
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
|
|
|
|
# Funktion zur Installation von Docker und Docker Compose für Raspberry Pi
|
|
install_docker() {
|
|
log "${YELLOW}Docker ist nicht installiert. Installation wird gestartet...${NC}"
|
|
|
|
# Erkenne Raspberry Pi
|
|
if [ -f /proc/device-tree/model ] && grep -q "Raspberry Pi" /proc/device-tree/model; then
|
|
log "${GREEN}Raspberry Pi erkannt. Installiere Docker für ARM-Architektur...${NC}"
|
|
IS_RASPBERRY_PI=true
|
|
else
|
|
IS_RASPBERRY_PI=false
|
|
fi
|
|
|
|
# Aktualisiere Paketindex
|
|
if ! sudo apt-get update; then
|
|
error_log "Konnte Paketindex nicht aktualisieren. Bitte manuell installieren."
|
|
exit 1
|
|
fi
|
|
|
|
# Installiere erforderliche Pakete
|
|
if ! sudo apt-get install -y apt-transport-https ca-certificates curl gnupg software-properties-common; then
|
|
error_log "Konnte erforderliche Pakete nicht installieren. Bitte manuell installieren."
|
|
exit 1
|
|
fi
|
|
|
|
# Raspberry Pi-spezifische Installation
|
|
if [ "$IS_RASPBERRY_PI" = true ]; then
|
|
# Setze Systemarchitektur für Raspberry Pi (armhf oder arm64)
|
|
ARCH=$(dpkg --print-architecture)
|
|
log "Erkannte Systemarchitektur: ${ARCH}"
|
|
|
|
# Installiere Docker mit convenience script (für Raspberry Pi empfohlen)
|
|
log "${YELLOW}Installiere Docker mit dem convenience script...${NC}"
|
|
curl -fsSL https://get.docker.com -o get-docker.sh
|
|
sudo sh get-docker.sh
|
|
|
|
if [ $? -ne 0 ]; then
|
|
error_log "Docker-Installation fehlgeschlagen. Bitte manuell installieren."
|
|
exit 1
|
|
fi
|
|
else
|
|
# Standard-Installation für andere Systeme
|
|
# Füge Docker's offiziellen GPG-Schlüssel hinzu
|
|
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
|
|
|
|
# Füge Docker-Repository hinzu
|
|
if ! sudo add-apt-repository "deb [arch=$(dpkg --print-architecture)] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"; then
|
|
error_log "Konnte Docker-Repository nicht hinzufügen. Prüfen Sie, ob Ihr System unterstützt wird."
|
|
exit 1
|
|
fi
|
|
|
|
# Aktualisiere Paketindex erneut
|
|
sudo apt-get update
|
|
|
|
# Installiere Docker
|
|
if ! sudo apt-get install -y docker-ce docker-ce-cli containerd.io; then
|
|
error_log "Konnte Docker nicht installieren. Bitte manuell installieren."
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
# Füge aktuellen Benutzer zur Docker-Gruppe hinzu
|
|
sudo usermod -aG docker "$USER"
|
|
|
|
log "${GREEN}Docker wurde installiert.${NC}"
|
|
log "${YELLOW}WICHTIG: Möglicherweise müssen Sie sich neu anmelden, damit die Gruppenänderung wirksam wird.${NC}"
|
|
|
|
# Installiere Docker Compose v1 (für ältere Systeme besser kompatibel)
|
|
log "${YELLOW}Installiere Docker Compose...${NC}"
|
|
|
|
if [ "$IS_RASPBERRY_PI" = true ]; then
|
|
# Für Raspberry Pi ist es besser, die richtige Architektur zu verwenden
|
|
if [ "$ARCH" = "armhf" ]; then
|
|
log "Installiere Docker Compose für armhf (32-bit)..."
|
|
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Linux-armv7" -o /usr/local/bin/docker-compose
|
|
elif [ "$ARCH" = "arm64" ]; then
|
|
log "Installiere Docker Compose für arm64 (64-bit)..."
|
|
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Linux-aarch64" -o /usr/local/bin/docker-compose
|
|
else
|
|
log "Verwende automatische Architekturerkennung für Docker Compose..."
|
|
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
|
|
fi
|
|
else
|
|
# Für andere Systeme
|
|
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
|
|
fi
|
|
|
|
if [ $? -ne 0 ]; then
|
|
error_log "Konnte Docker Compose nicht herunterladen. Bitte manuell installieren."
|
|
exit 1
|
|
fi
|
|
|
|
sudo chmod +x /usr/local/bin/docker-compose
|
|
|
|
log "${GREEN}Docker Compose wurde installiert.${NC}"
|
|
|
|
# Starte Docker-Dienst
|
|
if command -v systemctl &> /dev/null; then
|
|
sudo systemctl enable docker
|
|
sudo systemctl start docker
|
|
elif command -v service &> /dev/null; then
|
|
sudo service docker enable
|
|
sudo service docker start
|
|
fi
|
|
}
|
|
|
|
# Prüfen ob Docker installiert ist
|
|
if ! command -v docker &> /dev/null; then
|
|
log "${YELLOW}Docker ist nicht installiert.${NC}"
|
|
read -p "Möchten Sie Docker installieren? (j/n): " install_docker_choice
|
|
if [[ "$install_docker_choice" == "j" ]]; then
|
|
install_docker
|
|
else
|
|
error_log "Docker wird für die Installation benötigt. Bitte installieren Sie Docker manuell."
|
|
log "Siehe: https://docs.docker.com/get-docker/"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
# Prüfen ob Docker Daemon läuft
|
|
if ! docker info &> /dev/null; then
|
|
log "${YELLOW}Docker-Daemon läuft nicht. Versuche, den Dienst zu starten...${NC}"
|
|
|
|
# Versuche, Docker zu starten
|
|
if command -v systemctl &> /dev/null; then
|
|
sudo systemctl start docker
|
|
elif command -v service &> /dev/null; then
|
|
sudo service docker start
|
|
else
|
|
error_log "Konnte Docker-Daemon nicht starten. Bitte starten Sie den Docker-Dienst manuell."
|
|
log "Starten mit: sudo systemctl start docker oder sudo service docker start"
|
|
exit 1
|
|
fi
|
|
|
|
# Prüfe erneut, ob Docker läuft
|
|
if ! docker info &> /dev/null; then
|
|
error_log "Docker-Daemon konnte nicht gestartet werden. Bitte starten Sie den Docker-Dienst manuell."
|
|
exit 1
|
|
fi
|
|
|
|
log "${GREEN}Docker-Daemon wurde erfolgreich gestartet.${NC}"
|
|
fi
|
|
|
|
# Prüfen ob Docker Compose installiert ist
|
|
if ! command -v docker-compose &> /dev/null; then
|
|
log "${YELLOW}Docker Compose ist nicht installiert.${NC}"
|
|
read -p "Möchten Sie Docker Compose installieren? (j/n): " install_compose_choice
|
|
if [[ "$install_compose_choice" == "j" ]]; then
|
|
log "${YELLOW}Installiere Docker Compose...${NC}"
|
|
|
|
if ! sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose; then
|
|
error_log "Konnte Docker Compose nicht herunterladen. Bitte manuell installieren."
|
|
exit 1
|
|
fi
|
|
|
|
sudo chmod +x /usr/local/bin/docker-compose
|
|
|
|
log "${GREEN}Docker Compose wurde installiert.${NC}"
|
|
else
|
|
error_log "Docker Compose wird für die Installation benötigt. Bitte installieren Sie es manuell."
|
|
log "Siehe: https://docs.docker.com/compose/install/"
|
|
exit 1
|
|
fi
|
|
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
|
|
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}"
|
|
cat > .env << EOL
|
|
# Basic Server Configuration
|
|
RUNTIME_ENVIRONMENT=prod
|
|
DB_PATH=db/sqlite.db
|
|
|
|
# OAuth Configuration (Bitte anpassen)
|
|
OAUTH_CLIENT_ID=client_id
|
|
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"
|
|
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}"
|
|
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
|
|
log "Warte 10 Sekunden, bis der Container gestartet ist..."
|
|
sleep 10
|
|
if docker ps | grep -q "myp-frontend"; then
|
|
log "${GREEN}Frontend-Container läuft${NC}"
|
|
else
|
|
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"
|
|
log "Frontend stoppen: docker-compose -f $FRONTEND_DIR/docker-compose.yml down" |