#!/bin/bash # ========================================== # Farbdefinitionen # ========================================== C_DEF=$'\e[0m' # Default / Reset C_BOLD=$'\e[1m' # Fett C_CYAN=$'\e[1;36m' # Cyan C_BLUE=$'\e[1;34m' # Blau C_GREEN=$'\e[1;32m' # Grün C_YELLOW=$'\e[1;33m' # Gelb C_RED=$'\e[1;31m' # Rot REPO_URL="https://git.pi-farm.de/pi-farm/PiDoBot.git" SERVICE_FILE="/etc/systemd/system/jarvis.service" echo -e "${C_CYAN}${C_BOLD}==========================================${C_DEF}" echo -e "${C_CYAN}${C_BOLD}>>> J.A.R.V.I.S.-AI - Setup <<<${C_DEF}" echo -e "${C_CYAN}${C_BOLD}==========================================${C_DEF}" # 0. Installationsverzeichnis abfragen read -p "${C_CYAN}Installationsverzeichnis (Standard: ${C_YELLOW}/home/pi/jarvis-ai${C_CYAN}): ${C_DEF}" input_dir > "$HOME/.ssh/config" Host 192.168.* 10.* 172.* StrictHostKeyChecking no UserKnownHostsFile /dev/null LogLevel ERROR EOF chmod 600 "$HOME/.ssh/config" fi # 5. Static Dateien echo -e "\n${C_BLUE}${C_BOLD}--- 5. Lade Frontend-Bibliotheken...${C_DEF}" mkdir -p source/static cd source/static wget -nc -q https://cdn.jsdelivr.net/npm/gridstack@7.2.3/dist/gridstack.min.css wget -nc -q https://cdn.jsdelivr.net/npm/gridstack@7.2.3/dist/gridstack-all.js wget -nc -q https://cdn.jsdelivr.net/npm/xterm@5.1.0/css/xterm.css wget -nc -q https://cdn.jsdelivr.net/npm/xterm@5.1.0/lib/xterm.js wget -nc -q https://cdn.jsdelivr.net/npm/xterm-addon-fit@0.7.0/lib/xterm-addon-fit.js wget -nc -q https://cdn.jsdelivr.net/npm/marked/marked.min.js cd "$INSTALL_DIR" # 6. .env Setup echo -e "\n${C_BLUE}${C_BOLD}--- 6. Konfiguration (.env)...${C_DEF}" 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 -e "${C_YELLOW}Bestehende .env gefunden. Lade aktuelle Werte...${C_DEF}" set -a source "$ENV_FILE" set +a 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 -e "\nBitte gib die neuen Werte ein. (Drücke ENTER, um den Wert in Klammern beizubehalten):" # Farbige Prompts read -p "${C_CYAN}Dein Web-Benutzername [${C_YELLOW}$web_user${C_CYAN}]: ${C_DEF}" input_web_user "$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 -e "${C_GREEN}✅ Konfiguration erfolgreich gespeichert.${C_DEF}" # ========================================== # Weiche: Update vs. Neuinstallation # ========================================== if [ -f "$SERVICE_FILE" ]; then echo -e "\n${C_BLUE}${C_BOLD}--- 7. Update-Modus: Bestehender Dienst gefunden...${C_DEF}" echo -e "${C_YELLOW}Überspringe Port- und Firewall-Check, starte Dienst neu...${C_DEF}" sudo systemctl daemon-reload sudo systemctl restart jarvis.service echo -e "\n${C_GREEN}${C_BOLD}==========================================${C_DEF}" echo -e "${C_GREEN}✅ Update komplett! J.A.R.V.I.S. wurde erfolgreich aktualisiert und neu gestartet.${C_DEF}" echo -e "Verzeichnis: ${C_BOLD}$INSTALL_DIR${C_DEF}" echo -e "Web-Interface: ${C_CYAN}http://:8000${C_DEF}" echo -e "Log-Ausgabe: ${C_YELLOW}sudo journalctl -u jarvis -f${C_DEF}" echo -e "${C_GREEN}${C_BOLD}==========================================${C_DEF}" else # 7. Port Check echo -e "\n${C_BLUE}${C_BOLD}--- 7. Prüfe Port 8000...${C_DEF}" if ss -tuln | grep -q ":8000 "; then echo -e "${C_RED}⚠️ WARNUNG: Port 8000 wird bereits von einem anderen Prozess verwendet!${C_DEF}" 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..." /dev/null 2>&1; then if sudo ufw status | grep -qw "active"; then echo -e "${C_YELLOW}UFW Firewall ist aktiv. Öffne Port 8000...${C_DEF}" sudo ufw allow 8000/tcp echo -e "${C_GREEN}✅ Port 8000 (TCP) in UFW freigegeben.${C_DEF}" else echo -e "${C_GREEN}✅ UFW ist installiert, aber inaktiv. Keine Blockade zu erwarten.${C_DEF}" fi else echo -e "${C_GREEN}✅ Keine UFW Firewall gefunden. Überspringe Firewall-Setup.${C_DEF}" fi # 9. Systemd Service einrichten echo -e "\n${C_BLUE}${C_BOLD}--- 9. Systemdienst (Autostart) einrichten...${C_DEF}" read -p "${C_CYAN}Möchtest du J.A.R.V.I.S. als Hintergrunddienst installieren? (j/N): ${C_DEF}" setup_service $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 --proxy-headers 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${C_GREEN}${C_BOLD}==========================================${C_DEF}" echo -e "${C_GREEN}✅ Setup komplett! J.A.R.V.I.S. läuft als Dienst.${C_DEF}" echo -e "Verzeichnis: ${C_BOLD}$INSTALL_DIR${C_DEF}" echo -e "Web-Interface: ${C_CYAN}http://:8000${C_DEF}" echo -e "Log-Ausgabe: ${C_YELLOW}sudo journalctl -u jarvis -f${C_DEF}" echo -e "${C_GREEN}${C_BOLD}==========================================${C_DEF}" else echo -e "\n${C_GREEN}${C_BOLD}==========================================${C_DEF}" echo -e "${C_GREEN}✅ Setup komplett! Du kannst J.A.R.V.I.S. nun manuell starten:${C_DEF}" 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 -e "${C_GREEN}${C_BOLD}==========================================${C_DEF}" fi fi