Feat: Hermes-Terminal (ttyd) statt AnythingLLM + AnythingLLM komplett raus
Paket B des Plans. AnythingLLM war nur ein Fallback-Chat zu Hermes; ersetzt durch das echte interaktive Agent-Terminal (`hermes chat`, mit Tools/PC) als eingebettetes Web-Terminal. Box: ttyd (apt) wrappt `hermes chat`; systemd-User-Unit deploy/hermes-terminal.service (LAN-Bind eno1:7681, apt-Default-ttyd-Dienst deaktiviert). In deploy.sh verankert. Backend: config HERMES_TERMINAL_URL statt ANYTHINGLLM_URL/_REPO; agent_status liefert terminal_url/terminal_reachable; maintenance ohne _anythingllm_update; system.py Dienst-Liste zeigt "Hermes-Terminal". Frontend: neue Terminal-Seite (iframe auf ttyd) + Nav-Tab; AgentView/AgentStatusCard/nav/api auf Terminal umgestellt; SystemDrawer toter hermes-dashboard raus, hermes-webui -> hermes-terminal; Guide-Texte aktualisiert. Cleanup: deploy/hermes-webui.service + deploy/lobechat/ entfernt (LobeChat-Migration hinfaellig), HERMES_WEBUI_URL-Env raus. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+6
-1
@@ -19,13 +19,18 @@ 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"
|
||||
|
||||
# systemd-USER-Unit installieren/aktualisieren
|
||||
# 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"
|
||||
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
|
||||
loginctl enable-linger "$USER" >/dev/null 2>&1 || 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 ---"
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
[Unit]
|
||||
Description=Hermes Terminal — ttyd web terminal wrapping `hermes chat` (interaktiver Agent)
|
||||
Documentation=https://github.com/tsl0922/ttyd
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
# Exponiert die interaktive Hermes-Agent-CLI (`hermes chat`, voller Agent mit Tools/PC) als
|
||||
# Web-Terminal. Wird in MC2 per iframe eingebettet (Terminal-Seite) — Ersatz fuer AnythingLLM.
|
||||
#
|
||||
# SICHERHEIT: --writable + LAN-Bind ohne Auth = dasselbe Trust-Modell wie das MC2-Dashboard
|
||||
# (vertrautes Heim-LAN, kein Internet-Exposure). Fuer Basic-Auth: am ExecStart
|
||||
# --credential <user>:<pass>
|
||||
# ergaenzen (Browser fragt dann einmalig im iframe nach).
|
||||
Type=simple
|
||||
# --interface eno1 = LAN-Bind (box-spezifisch; eno1 traegt 192.168.178.151).
|
||||
ExecStart=/usr/bin/ttyd --writable --interface eno1 --port 7681 --max-clients 2 --cwd %h/.hermes %h/.hermes/hermes-agent/venv/bin/python -m hermes_cli.main chat
|
||||
Restart=always
|
||||
RestartSec=3
|
||||
|
||||
[Install]
|
||||
WantedBy=default.target
|
||||
@@ -1,27 +0,0 @@
|
||||
# systemd-USER-Unit für das standalone Hermes-WebUI (nesquena/hermes-webui).
|
||||
# Eigene Oberfläche des Agenten (Chat/Sessions/Workspace/Cron/Skills/Memory).
|
||||
# An 0.0.0.0:8787 gebunden, damit der Windows-PC im LAN direkt zugreifen kann
|
||||
# → Passwort-Schutz aktivieren (HERMES_WEBUI_PASSWORD)!
|
||||
# Ablage: ~/.config/systemd/user/hermes-webui.service ; dann:
|
||||
# systemctl --user enable --now hermes-webui
|
||||
# loginctl enable-linger hitonabi # läuft auch ohne aktive Session
|
||||
|
||||
[Unit]
|
||||
Description=Hermes WebUI (standalone)
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
WorkingDirectory=%h/hermes-webui
|
||||
# Start über das mitgelieferte Control-Skript (siehe docs/HERMES_SETUP.md).
|
||||
ExecStart=%h/hermes-webui/ctl.sh start --foreground
|
||||
Environment=HERMES_WEBUI_HOST=0.0.0.0
|
||||
Environment=HERMES_WEBUI_PORT=8787
|
||||
Environment=HERMES_HOME=%h/.hermes
|
||||
# Environment=HERMES_WEBUI_PASSWORD=... # in ~/.config/environment.d/ setzen, NICHT hier committen
|
||||
Restart=on-failure
|
||||
RestartSec=3
|
||||
|
||||
[Install]
|
||||
WantedBy=default.target
|
||||
@@ -1,13 +0,0 @@
|
||||
# LobeChat-Konfiguration (auf dem Proxmox-MiniPC). Kopiere zu .env und anpassen.
|
||||
|
||||
# OpenAI-kompatibler Endpoint der AI-Box. Optionen:
|
||||
# MC2-Gateway (empfohlen, model:auto + alle Modelle): http://192.168.178.151:9001/v1
|
||||
# llama-swap direkt (nur Modell-Liste): http://192.168.178.151:8080/v1
|
||||
# hermes-agent (Agent mit Tools/MCP, falls gewünscht): http://192.168.178.151:8642/v1
|
||||
AI_BOX_GATEWAY=http://192.168.178.151:9001/v1
|
||||
|
||||
# Dummy-Key (lokale Endpoints prüfen ihn nicht):
|
||||
OPENAI_API_KEY=mc2-local
|
||||
|
||||
# Zugangscode fürs Web-UI (PFLICHT — frei wählen):
|
||||
ACCESS_CODE=bitte-aendern
|
||||
@@ -1,42 +0,0 @@
|
||||
# LobeChat — Hermes-Chat-Frontend (ersetzt nesquena/hermes-webui)
|
||||
|
||||
Läuft auf dem **Proxmox-MiniPC** (nicht auf der AI-Box). Schlanke client-only Edition:
|
||||
kein Postgres/Auth/S3, Verlauf liegt im Browser. Spricht über LAN den OpenAI-kompatiblen
|
||||
**MC2-Gateway** der AI-Box an (`:9001/v1`, liefert `model:auto` + alle llama-swap-Modelle).
|
||||
|
||||
## Installation (auf dem Proxmox-Host bzw. einem LXC/VM mit Docker)
|
||||
```bash
|
||||
# In einem LXC/VM mit Docker + compose-Plugin:
|
||||
mkdir -p ~/lobechat && cd ~/lobechat
|
||||
# docker-compose.yml + .env.example aus diesem Ordner herkopieren
|
||||
cp .env.example .env
|
||||
nano .env # ACCESS_CODE setzen, AI_BOX_GATEWAY prüfen
|
||||
docker compose up -d
|
||||
```
|
||||
Öffnen: `http://<proxmox-ip>:3210` → Zugangscode = `ACCESS_CODE`.
|
||||
|
||||
## Was ist vorkonfiguriert
|
||||
- **Modell-Liste** auf `Hermes-4-14B`, `Qwen3.6-35B-A3B` (fast), `Qwen3-Coder-Next`,
|
||||
`Qwen3.5-122B-A10B` (heavy) und `auto` fixiert (`OPENAI_MODEL_LIST`).
|
||||
- **Hermes-Standardassistent** (Modell `Hermes-4-14B` + System-Prompt) via
|
||||
`DEFAULT_AGENT_CONFIG`.
|
||||
|
||||
## Endpoint-Wahl (in `.env`)
|
||||
- **MC2-Gateway `:9001/v1`** *(Default, empfohlen)* — OpenAI-kompatibel, `model:auto`,
|
||||
Token-Tracking, alle Modelle.
|
||||
- **llama-swap `:8080/v1`** — direkt, ohne Routing/Token-Tracking.
|
||||
- **hermes-agent `:8642/v1`** — nur falls die Chat-UI den **Agenten** (Tools/MCP/Memory)
|
||||
nutzen soll; API-Kompatibilität vorher prüfen.
|
||||
|
||||
## Cutover (alte hermes-webui ablösen)
|
||||
Auf der **AI-Box**:
|
||||
```bash
|
||||
systemctl --user disable --now hermes-webui
|
||||
```
|
||||
In MC2 den „Hermes öffnen"-Link auf LobeChat zeigen lassen:
|
||||
`HERMES_WEBUI_URL=http://<proxmox-ip>:3210` (env der `mission-control-2.service`).
|
||||
|
||||
## Hinweis
|
||||
Tool-/Function-Calls streamt llama.cpp nicht nativ — für reine Chat-Nutzung irrelevant.
|
||||
Bei Bedarf an persistenter History/RAG später auf die DB-Edition (Postgres+pgvector)
|
||||
umstellen.
|
||||
@@ -1,25 +0,0 @@
|
||||
# LobeChat als Hermes-Chat-Frontend — läuft auf dem Proxmox-MiniPC (Docker/LXC),
|
||||
# NICHT auf der AI-Box. Spricht über LAN den OpenAI-kompatiblen MC2-Gateway der Box an.
|
||||
# Client-only Edition (kein Postgres/Auth/S3) — bewusst schlank ("nicht overengineeren").
|
||||
#
|
||||
# Start: cp .env.example .env && $EDITOR .env && docker compose up -d
|
||||
# Öffnen: http://<proxmox-ip>:3210 (Zugangscode = ACCESS_CODE)
|
||||
|
||||
services:
|
||||
lobe-chat:
|
||||
image: lobehub/lobe-chat:latest
|
||||
container_name: lobe-chat
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "3210:3210"
|
||||
environment:
|
||||
# --- Provider: MC2-Gateway der AI-Box (OpenAI-kompatibel, liefert model:auto + alle Modelle) ---
|
||||
- OPENAI_API_KEY=${OPENAI_API_KEY:-mc2-local}
|
||||
- OPENAI_PROXY_URL=${AI_BOX_GATEWAY:-http://192.168.178.151:9001/v1}
|
||||
# Modell-Auswahl auf unsere llama-swap-Modelle fixieren (-all entfernt Defaults):
|
||||
- "OPENAI_MODEL_LIST=-all,+Hermes-4-14B,+Qwen3.6-35B-A3B,+Qwen3-Coder-Next,+Qwen3.5-122B-A10B,+auto"
|
||||
# --- Hermes-Standardassistent (Modell + System-Prompt) ---
|
||||
- "DEFAULT_AGENT_CONFIG=model=Hermes-4-14B;provider=openai;params.temperature=0.7;systemRole=Du bist Hermes, der lokale KI-Assistent dieses Homelabs. Antworte präzise, hilfsbereit und auf Deutsch, sofern nicht anders gewünscht."
|
||||
# --- Zugriffsschutz im LAN (einfacher Code statt voller Auth) ---
|
||||
- ACCESS_CODE=${ACCESS_CODE:?bitte in .env setzen}
|
||||
- ACCESS_CODE_ENABLED=1
|
||||
@@ -21,7 +21,6 @@ Environment=MC_MODELS_DIR=/srv/models
|
||||
# Geteiltes Gedächtnis = die bestehende v1-DB (Kontinuität bis/über Cutover).
|
||||
Environment=MC_MEMORY_DB=/srv/models/mission-control-memory.db
|
||||
Environment=MC_ENGINE_UPDATE_CMD=/usr/local/bin/update-llamacpp
|
||||
Environment=HERMES_WEBUI_URL=http://192.168.178.155:3001
|
||||
Restart=on-failure
|
||||
|
||||
RestartSec=3
|
||||
|
||||
Reference in New Issue
Block a user