#!/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"