#!/usr/bin/env bash # Deploy AUF DER BOX als systemd-USER-Dienst — KEIN sudo, KEIN /opt, KEIN Passwort. # Erstinstallation + Updates in einem. Läuft als User hitonabi. # # Erstinstallation (einmalig): # git clone https://git.tobisniceshomelab.ddnsfree.com/Hitonabi/mission-control-v2 ~/mission-control-v2 # bash ~/mission-control-v2/deploy/deploy.sh set -euo pipefail SRC="${MC2_SRC:-$HOME/mission-control-v2}" cd "$SRC" git fetch -q origin && git reset -q --hard origin/main # venv + Abhängigkeiten if [ ! -d "$SRC/backend/.venv" ]; then python3 -m venv "$SRC/backend/.venv" fi "$SRC/backend/.venv/bin/python" -m pip install -q --upgrade pip "$SRC/backend/.venv/bin/python" -m pip install -q -r "$SRC/backend/requirements.txt" # Mem0-Sidecar (auto-lernendes Gedächtnis) — eigenes Python-3.12-venv (~/.mem0/venv), # weil mem0+chromadb unter dem 3.14-Backend-venv nicht laufen. mem0ai/chromadb sind dort # bereits installiert; hier nur den HTTP-Server nachziehen + Alt-DB einmalig migrieren. if [ -x "$HOME/.mem0/venv/bin/python" ]; then # ~/.mem0/venv ist uv-managed (kein pip) → uv pip nutzen. UV="$(command -v uv || echo "$HOME/.local/bin/uv")" "$UV" pip install -q --python "$HOME/.mem0/venv/bin/python" -r "$SRC/mem0_service/requirements.txt" ( cd "$SRC/mem0_service" && "$HOME/.mem0/venv/bin/python" migrate.py ) || true else echo "WARN: ~/.mem0/venv fehlt — Mem0-Sidecar wird nicht gestartet (siehe Plan A1)." fi # Voice-Sidecar (lokales STT + gestuftes TTS für „Mit Hermes reden") — eigenes Python-3.12-venv # (~/.voice/venv), weil torch/chatterbox/faster-whisper nicht ins 3.14-Backend-venv passen. # install.sh ist idempotent (venv + Deps + Piper-Stimmen). Best-effort: schlägt es fehl, läuft # der restliche Stack weiter (der Voice-Tab meldet den Sidecar dann als offline). bash "$SRC/voice_service/install.sh" || echo "WARN: Voice-Sidecar-Setup fehlgeschlagen — Voice-Tab bleibt offline." # Hermes-Memory-Provider-Plugin (auto-lernen/Recall via Mem0-Sidecar) nach ~/.hermes/plugins/ # spiegeln. Context-only (kein Tool-Loop). Aktivierung in ~/.hermes/config.yaml: # memory.memory_enabled: true + memory.provider: mc2-memory (einmalig, box-lokal). if [ -d "$HOME/.hermes" ]; then mkdir -p "$HOME/.hermes/plugins/mc2-memory" cp "$SRC/hermes/plugins/mc2-memory/__init__.py" "$SRC/hermes/plugins/mc2-memory/plugin.yaml" \ "$HOME/.hermes/plugins/mc2-memory/" fi # systemd-USER-Units installieren/aktualisieren mkdir -p "$HOME/.config/systemd/user" cp "$SRC/deploy/mission-control-2.service" "$HOME/.config/systemd/user/mission-control-2.service" # Hermes-Terminal (ttyd -> `hermes chat`), in MC2 als Terminal-Seite eingebettet. # Einmalig manuell noetig: `sudo apt install -y ttyd` + `sudo systemctl disable --now ttyd` (apt-Default-Dienst). cp "$SRC/deploy/hermes-terminal.service" "$HOME/.config/systemd/user/hermes-terminal.service" # Mem0-Sidecar-Unit (nur wenn das venv existiert). [ -x "$HOME/.mem0/venv/bin/python" ] && cp "$SRC/deploy/mem0-service.service" "$HOME/.config/systemd/user/mem0-service.service" # Voice-Sidecar-Unit (nur wenn das venv existiert). [ -x "$HOME/.voice/venv/bin/python" ] && cp "$SRC/deploy/voice-service.service" "$HOME/.config/systemd/user/voice-service.service" # Tägliches Zustands-Backup (mem0 + Configs/Secrets) — Timer + oneshot-Service. Siehe docs/BACKUP.md. cp "$SRC/deploy/mc2-backup.service" "$HOME/.config/systemd/user/mc2-backup.service" cp "$SRC/deploy/mc2-backup.timer" "$HOME/.config/systemd/user/mc2-backup.timer" # Wöchentliches Auto-Update (Router/Engine/Hermes, Rollback+Pin+Telegram) — Autonomie E2. cp "$SRC/deploy/mc2-autoupdate.service" "$HOME/.config/systemd/user/mc2-autoupdate.service" cp "$SRC/deploy/mc2-autoupdate.timer" "$HOME/.config/systemd/user/mc2-autoupdate.timer" # Evolution-Radar-Feed (Autonomie E4): Hermes-cron speist ihn als Prompt ein. # Cron-Job selbst wird EINMALIG registriert (hermes cron create, siehe docs/RUNBOOK.md). mkdir -p "$HOME/.hermes/scripts" cp "$SRC/deploy/radar-feed.sh" "$HOME/.hermes/scripts/radar-feed.sh" systemctl --user daemon-reload systemctl --user enable mission-control-2 >/dev/null 2>&1 || true systemctl --user enable hermes-terminal >/dev/null 2>&1 || true systemctl --user enable mem0-service >/dev/null 2>&1 || true systemctl --user enable voice-service >/dev/null 2>&1 || true systemctl --user enable --now mc2-backup.timer >/dev/null 2>&1 || true systemctl --user enable --now mc2-autoupdate.timer >/dev/null 2>&1 || true loginctl enable-linger "$USER" >/dev/null 2>&1 || true # Mem0-Sidecar VOR dem Backend (re)starten, damit /api/memory sofort bedient wird. [ -x "$HOME/.mem0/venv/bin/python" ] && systemctl --user restart mem0-service 2>/dev/null || true # Voice-Sidecar (re)starten (best-effort; Erststart lädt das STT-Modell vor). [ -x "$HOME/.voice/venv/bin/python" ] && systemctl --user restart voice-service 2>/dev/null || true systemctl --user restart mission-control-2 command -v ttyd >/dev/null 2>&1 && systemctl --user restart hermes-terminal 2>/dev/null || true sleep 2 echo "--- Health ---" curl -sf http://127.0.0.1:9001/api/health && echo echo "OK — Mission Control 2.0 läuft auf :9001 (User-Dienst, sudo-frei)."