UMBAU v3 P1: Gateway-Auszug — /v1 wird eigener Prozess mc2-gateway (:9010)
ACHTUNG: Annahme AKTIVIERT die Stufe 1 (deploy.sh installiert
mc2-gateway.service + setzt MC_V1_UPSTREAM in der MC2-Unit; Health mit
Kaltstart-Retry bis 12s, dann hart rot -> Runner-Rollback greift).
MC2 :9001/v1 wird duenner Roh-Weiterleiter, LAN-Clients merken nichts;
Rollback = MC_V1_UPSTREAM-Zeile aus der Unit entfernen. token_stats
laedt bei Fremd-Aenderung per mtime nach (Gateway schreibt, Steuerpult
liest). UMBAUPLAN Abschnitt 3b dokumentiert P1-P4. Stufe 2 (Lucy direkt
an :9010, ueberlebt MC2-Neustarts) = deploy/gateway-cutover.sh, separat.
Neu aufgesetzt 15.07. auf aktuellem main (a3d9c74): die urspruengliche
Karte trug die inzwischen veraltete Von-allein-View doppelt - die ist
laengst auf main live. Inhalt = P1 der Parallel-Session, unveraendert.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -57,6 +57,9 @@ systemctl --user disable --now hermes-webui 2>/dev/null || true
|
||||
rm -f "$HOME/.config/systemd/user/hermes-terminal.service" "$HOME/.config/systemd/user/hermes-webui.service"
|
||||
# Box-Konsole (ttyd -> Login-Shell auf :7682), in MC2 als Konsole-Seite eingebettet.
|
||||
cp "$SRC/deploy/box-console.service" "$HOME/.config/systemd/user/box-console.service"
|
||||
# MC2-Gateway (UMBAU v3 P1): der /v1-Datenpfad als eigener Prozess (Loopback :9010,
|
||||
# Restart=always) — Lucys Hirn + Nacht-Autonomie überleben damit jeden MC2-Neustart.
|
||||
cp "$SRC/deploy/mc2-gateway.service" "$HOME/.config/systemd/user/mc2-gateway.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).
|
||||
@@ -171,6 +174,7 @@ if [ -d "$_HUI_WEB" ] && [ -x "$HOME/.hermes/node/bin/npx" ]; then
|
||||
fi
|
||||
systemctl --user daemon-reload
|
||||
systemctl --user enable mission-control-2 >/dev/null 2>&1 || true
|
||||
systemctl --user enable mc2-gateway >/dev/null 2>&1 || true
|
||||
systemctl --user enable box-console >/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
|
||||
@@ -191,11 +195,22 @@ loginctl enable-linger "$USER" >/dev/null 2>&1 || true
|
||||
# reset-failed, damit ein zuvor am Start-Limit gestorbener Dienst wieder anläuft.
|
||||
systemctl --user reset-failed hermes-builtin-ui 2>/dev/null || true
|
||||
systemctl --user restart hermes-builtin-ui 2>/dev/null || true
|
||||
# Gateway VOR dem Steuerpult (re)starten — MC2s /v1-Weiterleiter braucht ihn sofort.
|
||||
# KEIN `|| true`: ohne Gateway ist der LLM-Datenpfad tot, das MUSS den Deploy stoppen.
|
||||
systemctl --user restart mc2-gateway
|
||||
systemctl --user restart mission-control-2
|
||||
command -v ttyd >/dev/null 2>&1 && systemctl --user restart box-console 2>/dev/null || true
|
||||
|
||||
sleep 2
|
||||
echo "--- Health ---"
|
||||
# Gateway-Kaltstart-Fenster: bis ~12 s tolerieren, DANN hart scheitern (ohne Gateway
|
||||
# ist der LLM-Datenpfad tot — das muss den Karten-Runner rot machen).
|
||||
for _i in $(seq 1 10); do
|
||||
curl -sf -m 3 http://127.0.0.1:9010/gw/health >/dev/null 2>&1 && break
|
||||
[ "$_i" -eq 10 ] && { echo "FEHLER: mc2-gateway (:9010) antwortet nicht"; exit 1; }
|
||||
sleep 1
|
||||
done
|
||||
curl -sf http://127.0.0.1:9010/gw/health && echo
|
||||
curl -sf http://127.0.0.1:9001/api/health && echo
|
||||
|
||||
# Warm-Set (Hirn + Augen/vision + Gedächtnis/embed) nach dem Deploy nachladen — ein Deploy bzw.
|
||||
|
||||
Executable
+59
@@ -0,0 +1,59 @@
|
||||
#!/usr/bin/env bash
|
||||
# Gateway-Cutover (UMBAU v3 P1, Stufe 2 = Unabhängigkeit):
|
||||
# Hermes' LLM-Endpunkte vom Steuerpult-Umweg (127.0.0.1:9001/v1) auf den
|
||||
# eigenständigen Gateway (127.0.0.1:9010/v1) umstellen — Top-Level-config.yaml
|
||||
# UND alle Profil-Configs (werkstatt/betrieb). Danach überleben Lucys Hirn und
|
||||
# die komplette Nacht-Autonomie jeden MC2-Neustart.
|
||||
#
|
||||
# BEWUSST NICHT in deploy.sh: ~/.hermes/config.yaml ist Zwei-Schreiber-sensibel
|
||||
# (Hermes schreibt sie selbst). Einmalig von Hand bzw. per angenommener Karte:
|
||||
# bash ~/mission-control-v2/deploy/gateway-cutover.sh # umstellen
|
||||
# bash ~/mission-control-v2/deploy/gateway-cutover.sh --revert # zurück
|
||||
# Je geänderter Datei entsteht ein Backup *.bak-gwcut-<Zeitstempel>.
|
||||
# Danach: hermes-gateway-Neustart + kurzer Funktionsnachweis.
|
||||
set -euo pipefail
|
||||
|
||||
if [ "${1:-}" = "--revert" ]; then
|
||||
ALT="127.0.0.1:9010/v1"; NEU="127.0.0.1:9001/v1"
|
||||
PROBE="http://127.0.0.1:9001/api/health" # Rückweg: MC2 muss /v1 wieder selbst bedienen
|
||||
else
|
||||
ALT="127.0.0.1:9001/v1"; NEU="127.0.0.1:9010/v1"
|
||||
PROBE="http://127.0.0.1:9010/gw/health" # Hinweg: Gateway-Prozess muss leben
|
||||
fi
|
||||
|
||||
# Sicherung: NIE auf ein totes Ziel umstellen — das würde Lucy das Hirn abschneiden.
|
||||
if ! curl -sf -m 5 "$PROBE" >/dev/null 2>&1; then
|
||||
echo "ABBRUCH: Ziel $NEU antwortet nicht ($PROBE). Nichts geändert."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
STAMP="$(date +%Y%m%d-%H%M%S)"
|
||||
ALT_RE="${ALT//./\\.}" # Punkte für sed escapen
|
||||
geaendert=0
|
||||
for f in "$HOME/.hermes/config.yaml" "$HOME"/.hermes/profiles/*/config.yaml; do
|
||||
[ -f "$f" ] || continue
|
||||
grep -q "$ALT" "$f" || continue
|
||||
cp "$f" "$f.bak-gwcut-$STAMP"
|
||||
sed -i "s|$ALT_RE|$NEU|g" "$f"
|
||||
echo "umgestellt: $f (Backup: $f.bak-gwcut-$STAMP)"
|
||||
geaendert=1
|
||||
done
|
||||
|
||||
if [ "$geaendert" -eq 0 ]; then
|
||||
echo "Nichts zu tun — '$ALT' kommt in keiner Hermes-Config vor."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "hermes-gateway neu starten …"
|
||||
systemctl --user restart hermes-gateway
|
||||
sleep 3
|
||||
if systemctl --user is-active --quiet hermes-gateway; then
|
||||
echo "hermes-gateway läuft."
|
||||
else
|
||||
echo "WARN: hermes-gateway ist nach dem Neustart NICHT aktiv!"
|
||||
echo " journalctl --user -u hermes-gateway -n 30 und ggf.: $0 --revert"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Empfohlener Nachweis: cd ~/.hermes/hermes-agent && venv/bin/hermes doctor"
|
||||
echo "FERTIG. Rückweg jederzeit: $0 --revert"
|
||||
@@ -0,0 +1,26 @@
|
||||
# systemd-USER-Unit für den MC2-Gateway — der /v1-Datenpfad als eigener Prozess (UMBAU v3 P1).
|
||||
# Durch diesen Prozess läuft JEDER LLM-Aufruf der Box (Lucys Hirn, Nacht-Crons, Worker-
|
||||
# Delegation, Vision) — er ist bewusst winzig, wird praktisch nie angefasst und startet
|
||||
# sich immer selbst neu (Restart=always: die Wirbelsäule steht, bevor es jemand merkt).
|
||||
# Loopback-only (:9010): alle kritischen Verbraucher sind box-lokal; LAN-Clients
|
||||
# (IDE-Lane) kommen weiter über MC2 :9001/v1, das roh hierher durchreicht.
|
||||
# Sudo-frei wie alle MC2-Units: ~/.config/systemd/user/ + systemctl --user.
|
||||
|
||||
[Unit]
|
||||
Description=MC2 Gateway (/v1-Datenpfad: model:auto-Routing + Bild-Weiche)
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
WorkingDirectory=%h/mission-control-v2/backend
|
||||
ExecStart=%h/mission-control-v2/backend/.venv/bin/python -m uvicorn gateway_app:app --host 127.0.0.1 --port 9010
|
||||
Environment=PYTHONPATH=%h/mission-control-v2
|
||||
Environment=MC_LLAMA_SWAP_URL=http://127.0.0.1:8080
|
||||
Environment=MC_CONFIG_PATH=/etc/llama-swap/config.yaml
|
||||
Environment=MC_MODELS_DIR=/srv/models
|
||||
Restart=always
|
||||
RestartSec=2
|
||||
|
||||
[Install]
|
||||
WantedBy=default.target
|
||||
@@ -21,6 +21,10 @@ Environment=MC_CONFIG_PATH=/etc/llama-swap/config.yaml
|
||||
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
|
||||
# Gateway-Auszug (UMBAU v3 P1): /v1 roh an den eigenständigen mc2-gateway-Prozess
|
||||
# durchreichen. Diese Zeile entfernen (+ daemon-reload + restart) = Rollback, MC2
|
||||
# bedient /v1 wieder selbst.
|
||||
Environment=MC_V1_UPSTREAM=http://127.0.0.1:9010
|
||||
# KEIN MC_ENGINE_UPDATE_CMD-Override mehr: Das alte /usr/local/bin/update-llamacpp zog den
|
||||
# ROCm-Build nach /opt/llamacpp (totes Rollback-Dir) statt des aktiven Vulkan-Builds → Updates
|
||||
# liefen ins Leere ("DONE", aber nichts passierte). Ohne Override nutzt das Backend den Default
|
||||
|
||||
Reference in New Issue
Block a user