setup.sh aktualisiert
This commit is contained in:
220
setup.sh
220
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
|
||||
# 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 <<EOF > "$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 <<EOF > $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://<deine-ip>: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
|
||||
Reference in New Issue
Block a user