setup.sh aktualisiert
This commit is contained in:
129
setup.sh
129
setup.sh
@@ -1,60 +1,74 @@
|
|||||||
#!/bin/bash
|
#!/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"
|
REPO_URL="https://git.pi-farm.de/pi-farm/PiDoBot.git"
|
||||||
|
|
||||||
echo "=========================================="
|
echo -e "${C_CYAN}${C_BOLD}==========================================${C_DEF}"
|
||||||
echo ">>> J.A.R.V.I.S. - Professional Setup <<<"
|
echo -e "${C_CYAN}${C_BOLD}>>> J.A.R.V.I.S. - Professional Setup <<<${C_DEF}"
|
||||||
echo "=========================================="
|
echo -e "${C_CYAN}${C_BOLD}==========================================${C_DEF}"
|
||||||
|
|
||||||
# 0. Installationsverzeichnis abfragen
|
# 0. Installationsverzeichnis abfragen
|
||||||
# WICHTIG: Nutze einen Unterordner, nicht direkt /home/pi/
|
read -p "${C_CYAN}Installationsverzeichnis (Standard: ${C_YELLOW}/home/pi/jarvis-ai${C_CYAN}): ${C_DEF}" input_dir </dev/tty
|
||||||
read -p "Installationsverzeichnis (Standard: /home/pi/jarvis-ai): " input_dir </dev/tty
|
|
||||||
INSTALL_DIR=${input_dir:-/home/pi/jarvis-ai}
|
INSTALL_DIR=${input_dir:-/home/pi/jarvis-ai}
|
||||||
|
|
||||||
# Pfad normalisieren (entfernt doppelte Slashes und Tilde)
|
# Pfad normalisieren
|
||||||
INSTALL_DIR=$(realpath -m "$INSTALL_DIR")
|
INSTALL_DIR=$(realpath -m "$INSTALL_DIR")
|
||||||
|
|
||||||
echo -e "\nZielverzeichnis: $INSTALL_DIR"
|
echo -e "\n${C_GREEN}Zielverzeichnis: ${C_BOLD}$INSTALL_DIR${C_DEF}"
|
||||||
mkdir -p "$INSTALL_DIR"
|
mkdir -p "$INSTALL_DIR"
|
||||||
cd "$INSTALL_DIR" || exit
|
cd "$INSTALL_DIR" || exit
|
||||||
|
|
||||||
# 1. System-Abhängigkeiten
|
# 1. System-Abhängigkeiten
|
||||||
echo -e "\n--- 1. System-Pakete..."
|
echo -e "\n${C_BLUE}${C_BOLD}--- 1. Prüfe und installiere System-Pakete...${C_DEF}"
|
||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
sudo apt-get install -y git wget sshpass python3-pip python3-venv iproute2
|
sudo apt-get install -y git wget sshpass python3-pip python3-venv iproute2
|
||||||
|
|
||||||
# 2. Repository klonen
|
# 2. Repository klonen
|
||||||
echo -e "\n--- 2. Quellcode..."
|
echo -e "\n${C_BLUE}${C_BOLD}--- 2. Hole Quellcode...${C_DEF}"
|
||||||
if [ ! -d ".git" ]; then
|
if [ ! -d ".git" ]; then
|
||||||
git clone --branch dev --single-branch "$REPO_URL" .
|
git clone --branch dev --single-branch "$REPO_URL" .
|
||||||
else
|
else
|
||||||
echo "Repo bereits vorhanden, aktualisiere..."
|
echo -e "${C_YELLOW}Repo bereits vorhanden, aktualisiere...${C_DEF}"
|
||||||
git pull
|
git pull
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 3. Virtual Environment (Hier lag der Fehler!)
|
# 3. Virtual Environment
|
||||||
echo -e "\n--- 3. Python-Umgebung..."
|
echo -e "\n${C_BLUE}${C_BOLD}--- 3. Richte Python-Umgebung ein...${C_DEF}"
|
||||||
if [ ! -d "venv" ]; then
|
if [ ! -d "venv" ]; then
|
||||||
python3 -m venv venv
|
python3 -m venv venv
|
||||||
fi
|
fi
|
||||||
# Nutze den direkten Pfad zum Pip im Venv (sicherer als 'source')
|
# Nutze den direkten Pfad zum Pip im Venv
|
||||||
./venv/bin/pip install --upgrade pip
|
./venv/bin/pip install --upgrade pip
|
||||||
if [ -f "source/requirements.txt" ]; then
|
if [ -f "source/requirements.txt" ]; then
|
||||||
./venv/bin/pip install -r source/requirements.txt
|
./venv/bin/pip install -r source/requirements.txt
|
||||||
else
|
else
|
||||||
echo "❌ FEHLER: requirements.txt nicht gefunden!"
|
echo -e "${C_RED}❌ FEHLER: requirements.txt nicht gefunden!${C_DEF}"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 4. SSH-Key
|
# 4. SSH-Key
|
||||||
echo -e "\n--- 4. SSH-Key..."
|
echo -e "\n${C_BLUE}${C_BOLD}--- 4. Prüfe SSH-Schlüssel...${C_DEF}"
|
||||||
[ ! -f "$HOME/.ssh/id_rsa" ] && ssh-keygen -t rsa -N "" -f "$HOME/.ssh/id_rsa"
|
if [ ! -f "$HOME/.ssh/id_rsa" ]; then
|
||||||
|
ssh-keygen -t rsa -N "" -f "$HOME/.ssh/id_rsa"
|
||||||
|
echo -e "${C_GREEN}✅ SSH-Key generiert.${C_DEF}"
|
||||||
|
else
|
||||||
|
echo -e "${C_GREEN}✅ SSH-Key existiert bereits.${C_DEF}"
|
||||||
|
fi
|
||||||
|
|
||||||
# 5. Static Dateien (Der Grund für deine 404s)
|
# 5. Static Dateien
|
||||||
echo -e "\n--- 5. Static-Bibliotheken..."
|
echo -e "\n${C_BLUE}${C_BOLD}--- 5. Lade Frontend-Bibliotheken...${C_DEF}"
|
||||||
mkdir -p source/static
|
mkdir -p source/static
|
||||||
cd source/static
|
cd source/static
|
||||||
# Lade Dateien nur, wenn sie fehlen
|
|
||||||
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.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/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/css/xterm.css
|
||||||
@@ -63,8 +77,8 @@ wget -nc -q https://cdn.jsdelivr.net/npm/xterm-addon-fit@0.7.0/lib/xterm-addon-f
|
|||||||
wget -nc -q https://cdn.jsdelivr.net/npm/marked/marked.min.js
|
wget -nc -q https://cdn.jsdelivr.net/npm/marked/marked.min.js
|
||||||
cd "$INSTALL_DIR"
|
cd "$INSTALL_DIR"
|
||||||
|
|
||||||
# 6. .env Setup (wie besprochen)
|
# 6. .env Setup
|
||||||
echo -e "\n--- 6. Konfiguration..."
|
echo -e "\n${C_BLUE}${C_BOLD}--- 6. Konfiguration (.env)...${C_DEF}"
|
||||||
mkdir -p config
|
mkdir -p config
|
||||||
ENV_FILE="config/.env"
|
ENV_FILE="config/.env"
|
||||||
|
|
||||||
@@ -82,13 +96,11 @@ tg_id=""
|
|||||||
|
|
||||||
# Falls die Datei existiert, alte Werte laden
|
# Falls die Datei existiert, alte Werte laden
|
||||||
if [ -f "$ENV_FILE" ]; then
|
if [ -f "$ENV_FILE" ]; then
|
||||||
echo "Bestehende .env gefunden. Lade aktuelle Werte..."
|
echo -e "${C_YELLOW}Bestehende .env gefunden. Lade aktuelle Werte...${C_DEF}"
|
||||||
# Lese die Datei zeilenweise ein, um die Variablen sicher zu parsen
|
|
||||||
set -a
|
set -a
|
||||||
source "$ENV_FILE"
|
source "$ENV_FILE"
|
||||||
set +a
|
set +a
|
||||||
|
|
||||||
# Überschreibe die Standardwerte mit den gefundenen Werten
|
|
||||||
web_user="${WEB_USER_NAME:-$web_user}"
|
web_user="${WEB_USER_NAME:-$web_user}"
|
||||||
ai_prov="${AI_PROVIDER:-$ai_prov}"
|
ai_prov="${AI_PROVIDER:-$ai_prov}"
|
||||||
google_key="${GOOGLE_API_KEY:-$google_key}"
|
google_key="${GOOGLE_API_KEY:-$google_key}"
|
||||||
@@ -101,32 +113,35 @@ if [ -f "$ENV_FILE" ]; then
|
|||||||
tg_id="${ALLOWED_TELEGRAM_USER_ID:-$tg_id}"
|
tg_id="${ALLOWED_TELEGRAM_USER_ID:-$tg_id}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Bitte gib die neuen Werte ein. (Drücke ENTER, um den Wert in [Klammern] beizubehalten):"
|
echo -e "\nBitte gib die neuen Werte ein. (Drücke ENTER, um den Wert in Klammern beizubehalten):"
|
||||||
|
|
||||||
read -p "Dein Web-Benutzername [$web_user]: " input_web_user
|
# Farbige Prompts mit </dev/tty
|
||||||
|
read -p "${C_CYAN}Dein Web-Benutzername [${C_YELLOW}$web_user${C_CYAN}]: ${C_DEF}" input_web_user </dev/tty
|
||||||
web_user=${input_web_user:-$web_user}
|
web_user=${input_web_user:-$web_user}
|
||||||
|
|
||||||
read -p "Primäre KI (google, openai, nvidia, ollama) [$ai_prov]: " input_ai_prov
|
read -p "${C_CYAN}Primäre KI (google, openai, nvidia, ollama) [${C_YELLOW}$ai_prov${C_CYAN}]: ${C_DEF}" input_ai_prov </dev/tty
|
||||||
ai_prov=${input_ai_prov:-$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 "" )
|
disp_gkey=$( [ -n "$google_key" ] && echo "${google_key:0:5}***" || echo "" )
|
||||||
read -p "Google Gemini API Key [$disp_gkey]: " input_google_key
|
read -p "${C_CYAN}Google Gemini API Key [${C_YELLOW}$disp_gkey${C_CYAN}]: ${C_DEF}" input_google_key </dev/tty
|
||||||
google_key=${input_google_key:-$google_key}
|
google_key=${input_google_key:-$google_key}
|
||||||
|
|
||||||
disp_okey=$( [ -n "$openai_key" ] && echo "${openai_key:0:5}***" || echo "" )
|
disp_okey=$( [ -n "$openai_key" ] && echo "${openai_key:0:5}***" || echo "" )
|
||||||
read -p "OpenAI API Key [$disp_okey]: " input_openai_key
|
read -p "${C_CYAN}OpenAI API Key [${C_YELLOW}$disp_okey${C_CYAN}]: ${C_DEF}" input_openai_key </dev/tty
|
||||||
openai_key=${input_openai_key:-$openai_key}
|
openai_key=${input_openai_key:-$openai_key}
|
||||||
|
|
||||||
disp_nkey=$( [ -n "$nvidia_key" ] && echo "${nvidia_key:0:5}***" || echo "" )
|
disp_nkey=$( [ -n "$nvidia_key" ] && echo "${nvidia_key:0:5}***" || echo "" )
|
||||||
read -p "NVIDIA API Key [$disp_nkey]: " input_nvidia_key
|
read -p "${C_CYAN}NVIDIA API Key [${C_YELLOW}$disp_nkey${C_CYAN}]: ${C_DEF}" input_nvidia_key </dev/tty
|
||||||
nvidia_key=${input_nvidia_key:-$nvidia_key}
|
nvidia_key=${input_nvidia_key:-$nvidia_key}
|
||||||
|
|
||||||
|
read -p "${C_CYAN}Ollama Base URL [${C_YELLOW}$ollama_url${C_CYAN}]: ${C_DEF}" input_ollama_url </dev/tty
|
||||||
|
ollama_url=${input_ollama_url:-$ollama_url}
|
||||||
|
|
||||||
disp_tgtoken=$( [ -n "$tg_token" ] && echo "${tg_token:0:8}***" || echo "" )
|
disp_tgtoken=$( [ -n "$tg_token" ] && echo "${tg_token:0:8}***" || echo "" )
|
||||||
read -p "Telegram Bot Token [$disp_tgtoken]: " input_tg_token
|
read -p "${C_CYAN}Telegram Bot Token [${C_YELLOW}$disp_tgtoken${C_CYAN}]: ${C_DEF}" input_tg_token </dev/tty
|
||||||
tg_token=${input_tg_token:-$tg_token}
|
tg_token=${input_tg_token:-$tg_token}
|
||||||
|
|
||||||
read -p "Erlaubte Telegram User ID [$tg_id]: " input_tg_id
|
read -p "${C_CYAN}Erlaubte Telegram User ID [${C_YELLOW}$tg_id${C_CYAN}]: ${C_DEF}" input_tg_id </dev/tty
|
||||||
tg_id=${input_tg_id:-$tg_id}
|
tg_id=${input_tg_id:-$tg_id}
|
||||||
|
|
||||||
# Neue .env schreiben
|
# Neue .env schreiben
|
||||||
@@ -142,21 +157,35 @@ OPENAI_MODEL=$openai_mod
|
|||||||
TELEGRAM_BOT_TOKEN=$tg_token
|
TELEGRAM_BOT_TOKEN=$tg_token
|
||||||
ALLOWED_TELEGRAM_USER_ID=$tg_id
|
ALLOWED_TELEGRAM_USER_ID=$tg_id
|
||||||
EOF
|
EOF
|
||||||
echo "Konfiguration erfolgreich gespeichert."
|
echo -e "${C_GREEN}✅ Konfiguration erfolgreich gespeichert.${C_DEF}"
|
||||||
|
|
||||||
# 7. Port Check
|
# 7. Port Check
|
||||||
echo -e "\n--- 7. Prüfe Port 8000..."
|
echo -e "\n${C_BLUE}${C_BOLD}--- 7. Prüfe Port 8000...${C_DEF}"
|
||||||
if ss -tuln | grep -q ":8000 "; then
|
if ss -tuln | grep -q ":8000 "; then
|
||||||
echo "⚠️ WARNUNG: Port 8000 wird bereits von einem anderen Prozess verwendet!"
|
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."
|
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..."
|
read -p "Drücke ENTER, um trotzdem fortzufahren..." </dev/tty
|
||||||
else
|
else
|
||||||
echo "✅ Port 8000 ist frei."
|
echo -e "${C_GREEN}✅ Port 8000 ist frei.${C_DEF}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 8. Systemd Service einrichten
|
# 8. Firewall Check (NEU!)
|
||||||
echo -e "\n--- 8. Systemdienst (Autostart) einrichten..."
|
echo -e "\n${C_BLUE}${C_BOLD}--- 8. Prüfe Firewall-Einstellungen...${C_DEF}"
|
||||||
read -p "Möchtest du J.A.R.V.I.S. als Hintergrunddienst installieren? (j/N): " setup_service
|
if command -v ufw >/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 </dev/tty
|
||||||
|
|
||||||
if [[ "$setup_service" =~ ^[jJ]$ ]]; then
|
if [[ "$setup_service" =~ ^[jJ]$ ]]; then
|
||||||
SERVICE_FILE="/etc/systemd/system/jarvis.service"
|
SERVICE_FILE="/etc/systemd/system/jarvis.service"
|
||||||
@@ -184,18 +213,18 @@ EOF"
|
|||||||
sudo systemctl enable jarvis.service
|
sudo systemctl enable jarvis.service
|
||||||
sudo systemctl restart jarvis.service
|
sudo systemctl restart jarvis.service
|
||||||
|
|
||||||
echo -e "\n=========================================="
|
echo -e "\n${C_GREEN}${C_BOLD}==========================================${C_DEF}"
|
||||||
echo "✅ Setup komplett! J.A.R.V.I.S. läuft als Dienst."
|
echo -e "${C_GREEN}✅ Setup komplett! J.A.R.V.I.S. läuft als Dienst.${C_DEF}"
|
||||||
echo "Verzeichnis: $INSTALL_DIR"
|
echo -e "Verzeichnis: ${C_BOLD}$INSTALL_DIR${C_DEF}"
|
||||||
echo "Web-Interface: http://<deine-ip>:8000"
|
echo -e "Web-Interface: ${C_CYAN}http://<deine-ip>:8000${C_DEF}"
|
||||||
echo "Log-Ausgabe: sudo journalctl -u jarvis -f"
|
echo -e "Log-Ausgabe: ${C_YELLOW}sudo journalctl -u jarvis -f${C_DEF}"
|
||||||
echo "=========================================="
|
echo -e "${C_GREEN}${C_BOLD}==========================================${C_DEF}"
|
||||||
else
|
else
|
||||||
echo -e "\n=========================================="
|
echo -e "\n${C_GREEN}${C_BOLD}==========================================${C_DEF}"
|
||||||
echo "✅ Setup komplett! Du kannst J.A.R.V.I.S. nun manuell starten:"
|
echo -e "${C_GREEN}✅ Setup komplett! Du kannst J.A.R.V.I.S. nun manuell starten:${C_DEF}"
|
||||||
echo "cd $INSTALL_DIR"
|
echo "cd $INSTALL_DIR"
|
||||||
echo "source venv/bin/activate"
|
echo "source venv/bin/activate"
|
||||||
echo "export PYTHONPATH=\$PYTHONPATH:\$(pwd)/source"
|
echo "export PYTHONPATH=\$PYTHONPATH:\$(pwd)/source"
|
||||||
echo "python3 -m uvicorn source.main:app --host 0.0.0.0 --port 8000"
|
echo "python3 -m uvicorn source.main:app --host 0.0.0.0 --port 8000"
|
||||||
echo "=========================================="
|
echo -e "${C_GREEN}${C_BOLD}==========================================${C_DEF}"
|
||||||
fi
|
fi
|
||||||
Reference in New Issue
Block a user