diff --git a/setup.sh b/setup.sh index 4d0b25c..59450a6 100644 --- a/setup.sh +++ b/setup.sh @@ -1,82 +1,208 @@ #!/bin/bash -# Konfiguration REPO_URL="https://git.pi-farm.de/pi-farm/PiDoBot.git" -INSTALL_DIR="jarvis-ai" -echo ">>> Starte Setup für J.A.R.V.I.S. - AI ..." +echo "==========================================" +echo ">>> Starte Setup für J.A.R.V.I.S. - AI <<<" +echo "==========================================" -# 1. Prüfen, ob Git installiert ist, ansonsten installieren -if ! command -v git &> /dev/null; then - echo "--- Git nicht gefunden. Installiere Git..." - sudo apt-get update - sudo apt-get install -y git -else - echo "--- Git ist bereits installiert." +# 0. Installationsverzeichnis abfragen +read -p "Installationsverzeichnis (Standard: jarvis-ai): " input_dir +INSTALL_DIR=${input_dir:-jarvis-ai} + +# Mache den Pfad absolut, falls er relativ angegeben wurde +if [[ ! "$INSTALL_DIR" = /* ]]; then + INSTALL_DIR="$(pwd)/$INSTALL_DIR" fi -# 2. Weitere zwingende System-Abhängigkeiten installieren -# sshpass: Für das automatische Kopieren des SSH-Keys auf neue Nodes -# python3-venv: Für die isolierte Python-Umgebung -echo "--- Installiere benötigte System-Pakete..." -sudo apt-get update -sudo apt-get install -y wget sshpass python3-pip python3-venv +echo -e "\nZielverzeichnis: $INSTALL_DIR" -# 3. Repository klonen +# 1. System-Abhängigkeiten installieren +echo -e "\n--- 1. Prüfe und installiere System-Pakete..." +sudo apt-get update +sudo apt-get install -y git wget sshpass python3-pip python3-venv iproute2 + +# 2. Repository klonen / updaten +echo -e "\n--- 2. Hole Quellcode..." if [ ! -d "$INSTALL_DIR" ]; then - echo "--- Klone Repository von $REPO_URL..." git clone --branch dev --single-branch "$REPO_URL" "$INSTALL_DIR" else - echo "--- Verzeichnis $INSTALL_DIR existiert bereits. Überspringe Klonen..." + echo "Verzeichnis existiert bereits. Überspringe Klonen." + # Optional: git pull hier einbauen, falls du immer die neueste Version willst fi -# In das Verzeichnis wechseln cd "$INSTALL_DIR" || exit -# 4. Virtual Environment und Python-Abhängigkeiten einrichten -echo "--- Erstelle Python Virtual Environment..." -python3 -m venv venv +# 3. Virtual Environment einrichten +echo -e "\n--- 3. Richte Python-Umgebung ein..." +if [ ! -d "venv" ]; then + python3 -m venv venv +fi source venv/bin/activate -echo "--- Installiere Python-Pakete aus requirements.txt..." +echo "Installiere Abhängigkeiten..." pip install --upgrade pip if [ -f "source/requirements.txt" ]; then pip install -r source/requirements.txt else - echo "FEHLER: requirements.txt nicht im Repository gefunden!" + echo "FEHLER: requirements.txt nicht in $INSTALL_DIR/source gefunden!" exit 1 fi -# 5. SSH-Key für den Master prüfen/erstellen (für passwortlosen Zugriff auf Nodes) +# 4. SSH-Key prüfen/erstellen +echo -e "\n--- 4. Prüfe SSH-Schlüssel für Node-Kommunikation..." if [ ! -f "$HOME/.ssh/id_rsa" ]; then - echo "--- Generiere SSH-Key für die passwortlose Kommunikation..." + echo "Generiere SSH-Key..." ssh-keygen -t rsa -N "" -f "$HOME/.ssh/id_rsa" else - echo "--- SSH-Key existiert bereits." + echo "SSH-Key existiert bereits." fi -# 6. Static Ordner anlegen und Dateien herunterladen -if [ ! -f "source/static" ]; then - echo "--- Static-Ordner anlegen und Dateien herunterladen..." +# 5. Static Ordner anlegen und Dateien herunterladen +echo -e "\n--- 5. Lade Frontend-Bibliotheken herunter..." +if [ ! -d "source/static" ]; then mkdir -p source/static cd source/static - # GridStack - wget https://cdn.jsdelivr.net/npm/gridstack@7.2.3/dist/gridstack.min.css - wget https://cdn.jsdelivr.net/npm/gridstack@7.2.3/dist/gridstack-all.js - # Xterm - wget https://cdn.jsdelivr.net/npm/xterm@5.1.0/css/xterm.css - wget https://cdn.jsdelivr.net/npm/xterm@5.1.0/lib/xterm.js - # Xterm Fit Addon - wget https://cdn.jsdelivr.net/npm/xterm-addon-fit@0.7.0/lib/xterm-addon-fit.js - # marked.js - wget https://cdn.jsdelivr.net/npm/marked/marked.min.js + wget -q https://cdn.jsdelivr.net/npm/gridstack@7.2.3/dist/gridstack.min.css + wget -q https://cdn.jsdelivr.net/npm/gridstack@7.2.3/dist/gridstack-all.js + wget -q https://cdn.jsdelivr.net/npm/xterm@5.1.0/css/xterm.css + wget -q https://cdn.jsdelivr.net/npm/xterm@5.1.0/lib/xterm.js + wget -q https://cdn.jsdelivr.net/npm/xterm-addon-fit@0.7.0/lib/xterm-addon-fit.js + wget -q https://cdn.jsdelivr.net/npm/marked/marked.min.js cd ../../ else - echo "--- Static-Dateien existieren bereits." + echo "Static-Dateien existieren bereits." fi -echo ">>> Installation abgeschlossen!" -echo "--- Starte J.A.R.V.I.S. - AI auf Port 8000..." -# 6. Programm starten -export PYTHONPATH=$PYTHONPATH:$(pwd)/source -python3 -m uvicorn source.main:app --host 0.0.0.0 --port 8000 \ No newline at end of file +# 6. Interaktives Setup für die .env Datei +echo -e "\n--- 6. Konfiguration (.env) einrichten..." +mkdir -p config +ENV_FILE="config/.env" + +# Standardwerte definieren +web_user="Tony" +ai_prov="google" +google_key="" +openai_key="" +nvidia_key="" +ollama_url="http://127.0.0.1:11434/v1" +google_mod="gemini-2.5-flash" +openai_mod="gpt-4o" +tg_token="" +tg_id="" + +# Falls die Datei existiert, alte Werte laden +if [ -f "$ENV_FILE" ]; then + echo "Bestehende .env gefunden. Lade aktuelle Werte..." + # Lese die Datei zeilenweise ein, um die Variablen sicher zu parsen + set -a + source "$ENV_FILE" + set +a + + # Überschreibe die Standardwerte mit den gefundenen Werten + web_user="${WEB_USER_NAME:-$web_user}" + ai_prov="${AI_PROVIDER:-$ai_prov}" + google_key="${GOOGLE_API_KEY:-$google_key}" + openai_key="${OPENAI_API_KEY:-$openai_key}" + nvidia_key="${NVIDIA_API_KEY:-$nvidia_key}" + ollama_url="${OLLAMA_BASE_URL:-$ollama_url}" + google_mod="${GOOGLE_MODEL:-$google_mod}" + openai_mod="${OPENAI_MODEL:-$openai_mod}" + tg_token="${TELEGRAM_BOT_TOKEN:-$tg_token}" + tg_id="${ALLOWED_TELEGRAM_USER_ID:-$tg_id}" +fi + +echo "Bitte gib die neuen Werte ein. (Drücke ENTER, um den Wert in [Klammern] beizubehalten):" + +read -p "Dein Web-Benutzername [$web_user]: " input_web_user +web_user=${input_web_user:-$web_user} + +read -p "Primäre KI (google, openai, nvidia, ollama) [$ai_prov]: " input_ai_prov +ai_prov=${input_ai_prov:-$ai_prov} + +# Keys maskieren für die Anzeige, damit sie nicht komplett im Terminal stehen +disp_gkey=$( [ -n "$google_key" ] && echo "${google_key:0:5}***" || echo "" ) +read -p "Google Gemini API Key [$disp_gkey]: " input_google_key +google_key=${input_google_key:-$google_key} + +disp_okey=$( [ -n "$openai_key" ] && echo "${openai_key:0:5}***" || echo "" ) +read -p "OpenAI API Key [$disp_okey]: " input_openai_key +openai_key=${input_openai_key:-$openai_key} + +disp_tgtoken=$( [ -n "$tg_token" ] && echo "${tg_token:0:8}***" || echo "" ) +read -p "Telegram Bot Token [$disp_tgtoken]: " input_tg_token +tg_token=${input_tg_token:-$tg_token} + +read -p "Erlaubte Telegram User ID [$tg_id]: " input_tg_id +tg_id=${input_tg_id:-$tg_id} + +# Neue .env schreiben +cat < "$ENV_FILE" +WEB_USER_NAME=$web_user +AI_PROVIDER=$ai_prov +GOOGLE_API_KEY=$google_key +OPENAI_API_KEY=$openai_key +NVIDIA_API_KEY=$nvidia_key +OLLAMA_BASE_URL=$ollama_url +GOOGLE_MODEL=$google_mod +OPENAI_MODEL=$openai_mod +TELEGRAM_BOT_TOKEN=$tg_token +ALLOWED_TELEGRAM_USER_ID=$tg_id +EOF +echo "Konfiguration erfolgreich gespeichert." + +# 7. Port Check +echo -e "\n--- 7. Prüfe Port 8000..." +if ss -tuln | grep -q ":8000 "; then + echo "⚠️ WARNUNG: Port 8000 wird bereits von einem anderen Prozess verwendet!" + echo "J.A.R.V.I.S. wird möglicherweise nicht starten können. Bitte prüfe dies nach dem Setup." + read -p "Drücke ENTER, um trotzdem fortzufahren..." +else + echo "✅ Port 8000 ist frei." +fi + +# 8. Systemd Service einrichten +echo -e "\n--- 8. Systemdienst (Autostart) einrichten..." +read -p "Möchtest du J.A.R.V.I.S. als Hintergrunddienst installieren? (j/N): " setup_service + +if [[ "$setup_service" =~ ^[jJ]$ ]]; then + SERVICE_FILE="/etc/systemd/system/jarvis.service" + + echo "Erstelle Service-Datei in $SERVICE_FILE..." + sudo bash -c "cat < $SERVICE_FILE +[Unit] +Description=J.A.R.V.I.S. AI Web und Telegram Bot +After=network.target + +[Service] +User=$USER +WorkingDirectory=$INSTALL_DIR +Environment=\"PYTHONPATH=$INSTALL_DIR/source\" +ExecStart=$INSTALL_DIR/venv/bin/python -m uvicorn source.main:app --host 0.0.0.0 --port 8000 +Restart=always +RestartSec=5 + +[Install] +WantedBy=multi-user.target +EOF" + + echo "Aktiviere und starte den Dienst..." + sudo systemctl daemon-reload + sudo systemctl enable jarvis.service + sudo systemctl restart jarvis.service + + echo -e "\n==========================================" + echo "✅ Setup komplett! J.A.R.V.I.S. läuft als Dienst." + echo "Verzeichnis: $INSTALL_DIR" + echo "Web-Interface: http://:8000" + echo "Log-Ausgabe: sudo journalctl -u jarvis -f" + echo "==========================================" +else + echo -e "\n==========================================" + echo "✅ Setup komplett! Du kannst J.A.R.V.I.S. nun manuell starten:" + echo "cd $INSTALL_DIR" + echo "source venv/bin/activate" + echo "export PYTHONPATH=\$PYTHONPATH:\$(pwd)/source" + echo "python3 -m uvicorn source.main:app --host 0.0.0.0 --port 8000" + echo "==========================================" +fi \ No newline at end of file