#!/bin/bash # Raspberry Pi Bereinigungsskript für MYP-Projekt # Dieses Skript bereinigt alte Docker-Installationen und installiert alle erforderlichen Abhängigkeiten # 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 } # Prüfen, ob das Skript mit Root-Rechten ausgeführt wird if [ "$EUID" -ne 0 ]; then error_log "Dieses Skript muss mit Root-Rechten ausgeführt werden (sudo)." exit 1 fi log "${YELLOW}=== MYP Raspberry Pi Bereinigung und Setup ===${NC}" log "Diese Skript wird alle alten Docker-Installationen entfernen und die erforderlichen Abhängigkeiten neu installieren." # Sicherstellen, dass apt funktioniert log "Aktualisiere apt-Paketindex..." apt-get update || { error_log "Konnte apt-Paketindex nicht aktualisieren." exit 1 } # Installiere grundlegende Abhängigkeiten log "Installiere grundlegende Abhängigkeiten..." apt-get install -y \ apt-transport-https \ ca-certificates \ curl \ gnupg \ lsb-release \ wget \ git \ jq \ || { error_log "Konnte grundlegende Abhängigkeiten nicht installieren." exit 1 } # Stoppe alle laufenden Docker-Container log "${YELLOW}Stoppe alle laufenden Docker-Container...${NC}" if command -v docker &> /dev/null; then docker stop $(docker ps -aq) 2>/dev/null || true log "Alle Docker-Container gestoppt." else log "Docker ist nicht installiert, keine Container zu stoppen." fi # Entferne alte Docker-Installation log "${YELLOW}Entferne alte Docker-Installation...${NC}" apt-get remove -y docker docker-engine docker.io containerd runc docker-ce docker-ce-cli containerd.io docker-compose-plugin docker-compose || true apt-get autoremove -y || true rm -rf /var/lib/docker /var/lib/containerd /var/run/docker.sock /etc/docker /usr/local/bin/docker-compose 2>/dev/null || true log "${GREEN}Alte Docker-Installation entfernt.${NC}" # Entferne alte Projektcontainer und -Dateien log "${YELLOW}Entferne alte MYP-Projektcontainer und -Dateien...${NC}" if command -v docker &> /dev/null; then # Entferne Container docker rm -f myp-frontend myp-backend 2>/dev/null || true # Entferne Images docker rmi -f myp-frontend myp-backend 2>/dev/null || true # Entferne unbenutzte Volumes und Netzwerke docker system prune -af --volumes 2>/dev/null || true fi # Erkennen der Raspberry Pi-Architektur log "Erkenne Systemarchitektur..." ARCH=$(dpkg --print-architecture) log "Erkannte Architektur: ${ARCH}" # Installiere Docker mit dem offiziellen Convenience-Skript log "${YELLOW}Installiere Docker mit dem offiziellen Convenience-Skript...${NC}" curl -fsSL https://get.docker.com -o get-docker.sh sh get-docker.sh --channel stable # Überprüfen, ob Docker erfolgreich installiert wurde if ! command -v docker &> /dev/null; then error_log "Docker-Installation fehlgeschlagen!" exit 1 fi log "${GREEN}Docker erfolgreich installiert!${NC}" # Füge den aktuellen Benutzer zur Docker-Gruppe hinzu if [ "$SUDO_USER" ]; then log "Füge Benutzer $SUDO_USER zur Docker-Gruppe hinzu..." usermod -aG docker $SUDO_USER log "${YELLOW}Hinweis: Eine Neuanmeldung ist erforderlich, damit die Gruppenänderung wirksam wird.${NC}" fi # Konfiguriere Docker mit DNS-Servern für bessere Netzwerkkompatibilität log "Konfiguriere Docker mit Google DNS..." mkdir -p /etc/docker cat > /etc/docker/daemon.json << EOL { "dns": ["8.8.8.8", "8.8.4.4"] } EOL # Starte Docker-Dienst neu log "Starte Docker-Dienst neu..." systemctl restart docker systemctl enable docker log "${GREEN}Docker-Dienst neu gestartet und für den Autostart aktiviert.${NC}" # Installiere Docker Compose v2 log "${YELLOW}Installiere Docker Compose...${NC}" # Bestimme die passende Docker Compose-Version für die Architektur if [ "$ARCH" = "armhf" ]; then log "Installiere Docker Compose für armhf (32-bit)..." curl -L "https://github.com/docker/compose/releases/download/v2.6.1/docker-compose-linux-armv7" -o /usr/local/bin/docker-compose elif [ "$ARCH" = "arm64" ]; then log "Installiere Docker Compose für arm64 (64-bit)..." curl -L "https://github.com/docker/compose/releases/download/v2.6.1/docker-compose-linux-aarch64" -o /usr/local/bin/docker-compose else log "Unbekannte Architektur, verwende automatische Erkennung..." curl -L "https://github.com/docker/compose/releases/download/v2.6.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose fi chmod +x /usr/local/bin/docker-compose # Überprüfe, ob Docker Compose installiert wurde if ! command -v docker-compose &> /dev/null; then error_log "Docker Compose-Installation fehlgeschlagen!" exit 1 fi # Installiere Docker Compose Plugin (neuere Methode) log "Installiere Docker Compose Plugin..." apt-get update apt-get install -y docker-compose-plugin log "${GREEN}Docker Compose erfolgreich installiert!${NC}" docker compose version || docker-compose --version # Installiere zusätzliche Abhängigkeiten für die Projektunterstützung log "${YELLOW}Installiere zusätzliche Projektabhängigkeiten...${NC}" apt-get install -y \ python3 \ python3-pip \ sqlite3 \ build-essential \ libffi-dev \ libssl-dev \ || { error_log "Konnte zusätzliche Abhängigkeiten nicht installieren." exit 1 } # Optimieren des Raspberry Pi für Docker-Workloads log "${YELLOW}Optimiere Raspberry Pi für Docker-Workloads...${NC}" # Swap erhöhen für bessere Performance bei begrenztem RAM log "Konfiguriere Swap-Größe..." CURRENT_SWAP=$(grep "CONF_SWAPSIZE" /etc/dphys-swapfile | cut -d= -f2) log "Aktuelle Swap-Größe: ${CURRENT_SWAP}" # Erhöhe Swap auf 2GB, wenn weniger if [ "$CURRENT_SWAP" -lt 2048 ]; then sed -i 's/^CONF_SWAPSIZE=.*/CONF_SWAPSIZE=2048/' /etc/dphys-swapfile log "Swap-Größe auf 2048MB erhöht, Neustart des Swap-Dienstes erforderlich." # Neustart des Swap-Dienstes /etc/init.d/dphys-swapfile restart else log "Swap-Größe ist bereits ausreichend." fi # Konfiguriere cgroup für Docker if ! grep -q "cgroup_enable=memory" /boot/cmdline.txt; then log "Konfiguriere cgroup für Docker..." CMDLINE=$(cat /boot/cmdline.txt) echo "$CMDLINE cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1" > /boot/cmdline.txt log "${YELLOW}WICHTIG: Ein Systemneustart ist erforderlich, damit die cgroup-Änderungen wirksam werden.${NC}" fi # Prüfe, ob docker-compose.yml und Dockerfile im aktuellen Projektverzeichnis vorhanden sind FRONTEND_DIR="$(pwd)/packages/reservation-platform" BACKEND_DIR="$(pwd)/backend" if [ -d "$FRONTEND_DIR" ] && [ -f "$FRONTEND_DIR/docker-compose.yml" ]; then log "${GREEN}Frontend-Projektdateien gefunden in $FRONTEND_DIR${NC}" else log "${YELLOW}Warnung: Frontend-Projektdateien nicht gefunden in $FRONTEND_DIR${NC}" fi if [ -d "$BACKEND_DIR" ] && [ -f "$BACKEND_DIR/docker-compose.yml" ]; then log "${GREEN}Backend-Projektdateien gefunden in $BACKEND_DIR${NC}" else log "${YELLOW}Warnung: Backend-Projektdateien nicht gefunden in $BACKEND_DIR${NC}" fi # Abschlussmeldung log "${GREEN}=== Bereinigung und Setup abgeschlossen ===${NC}" log "${YELLOW}WICHTIGE HINWEISE:${NC}" log "1. Ein ${RED}SYSTEMNEUSTART${NC} ist ${RED}DRINGEND ERFORDERLICH${NC}, damit alle Änderungen wirksam werden." log "2. Nach dem Neustart können Sie die Installationsskripte ausführen:" log " - Frontend: ./install-frontend.sh" log " - Backend: ./install-backend.sh" log "3. Bei Problemen mit Docker-Berechtigungen stellen Sie sicher, dass Sie sich neu angemeldet haben." echo "" read -p "Möchten Sie das System jetzt neu starten? (j/n): " REBOOT_CHOICE if [[ "$REBOOT_CHOICE" == "j" ]]; then log "System wird neu gestartet..." reboot else log "Bitte starten Sie das System manuell neu, bevor Sie die Installationsskripte ausführen." fi