Deploy-Robustheit: Selbst-Reset-Guard + TimeoutStopSec=5 (Lehren P1-Deploy 15.07.)

1) deploy.sh fuehrt sich nach dem git reset einmal frisch neu aus (exec-Guard,
   Env-Marke MC2_DEPLOY_REEXEC): der Reset ersetzt die laufende Datei, bash las
   einen alt/neu-Zeilen-Mix — beim P1-Deploy fielen so daemon-reload und der
   mc2-gateway-Start aus (Lucy 502, Heilung von Hand).
2) mc2-gateway.service TimeoutStopSec=5: uvicorn wartete beim Stop auf offene
   LLM-Streams (default 90 s SIGKILL-Fenster ohne Listener = 502-Fenster bei
   jedem Deploy-Restart, live gemessen 14:29->14:31). Stateless Proxy, Clients
   retrien — hart nach 5 s ist verlustarm.
UMBAUPLAN: Annahme-Hinweis fuer P2 (einmal deploy.sh von Hand nachlaufen lassen,
weil der Guard erst MIT diesem Deploy an Bord kommt).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-07-15 14:47:35 +02:00
parent a9c0239f8a
commit 7223ca96c1
3 changed files with 24 additions and 0 deletions
+10
View File
@@ -12,6 +12,16 @@ SRC="${MC2_SRC:-$HOME/mission-control-v2}"
cd "$SRC" cd "$SRC"
git fetch -q origin && git reset -q --hard origin/main git fetch -q origin && git reset -q --hard origin/main
# ★ Selbst-Reset-Falle (15.07. beim P1-Deploy live gebissen): der reset oben ersetzt auch
# DIESE Datei, und bash liest laufende Skripte häppchenweise von der Platte weiter — ab
# hier liefe ein Zeilen-Mix aus alter+neuer Version (beim P1-Deploy fielen so daemon-reload
# und der mc2-gateway-Start unter den Tisch). Darum: nach dem Reset genau EINMAL die
# frische Version neu ausführen; der zweite Durchlauf überspringt dank Env-Marke nichts.
if [ "${MC2_DEPLOY_REEXEC:-0}" != "1" ]; then
export MC2_DEPLOY_REEXEC=1
exec bash "$SRC/deploy/deploy.sh"
fi
# venv + Abhängigkeiten # venv + Abhängigkeiten
if [ ! -d "$SRC/backend/.venv" ]; then if [ ! -d "$SRC/backend/.venv" ]; then
python3 -m venv "$SRC/backend/.venv" python3 -m venv "$SRC/backend/.venv"
+5
View File
@@ -21,6 +21,11 @@ Environment=MC_CONFIG_PATH=/etc/llama-swap/config.yaml
Environment=MC_MODELS_DIR=/srv/models Environment=MC_MODELS_DIR=/srv/models
Restart=always Restart=always
RestartSec=2 RestartSec=2
# Stoppen darf nicht warten: der Gateway hält minutenlange LLM-Streams offen — uvicorns
# „Waiting for connections to close" + default 90 s TimeoutStop machten jeden Restart zum
# 502-Fenster (15.07. live gemessen, 14:29→14:31). Stateless Proxy → nach 5 s hart beenden
# ist verlustarm; Clients (Hermes api_max_retries=3) wiederholen abgerissene Anfragen.
TimeoutStopSec=5
[Install] [Install]
WantedBy=default.target WantedBy=default.target
+9
View File
@@ -89,6 +89,15 @@ Coder-Modell-Wissen gewinnen), React bleibt (Svelte/Solid schneller, aber irrele
reminders_loop (teilt Datei+CRUD mit /api/reminders — Zwei-Schreiber-Risiko) bleibt in MC2. reminders_loop (teilt Datei+CRUD mit /api/reminders — Zwei-Schreiber-Risiko) bleibt in MC2.
Danach gibt es genau ZWEI Zeitplan-Systeme mit klaren Rollen: systemd-Timer (Box-Pflege) + Danach gibt es genau ZWEI Zeitplan-Systeme mit klaren Rollen: systemd-Timer (Box-Pflege) +
Hermes-Crons (Agenten-Arbeit) — plus den Steward als dritten, eigenen Wächter-Prozess. Hermes-Crons (Agenten-Arbeit) — plus den Steward als dritten, eigenen Wächter-Prozess.
**Annahme-Hinweis (wichtig):** P2 ändert deploy.sh selbst → nach dem Klick EINMAL
`bash ~/mission-control-v2/deploy/deploy.sh` von Hand nachlaufen lassen. Grund =
Selbst-Reset-Falle: deploy.sh ersetzt sich beim `git reset` mitten im Lauf selbst, bash
liest dann einen alt/neu-Zeilen-Mix — genau daran hakte der P1-Deploy am 15.07.
(daemon-reload + Gateway-Start fielen aus, Lucy bekam 502; Heilung war daemon-reload +
`enable --now mc2-gateway` von Hand). P2 bringt den dauerhaften Fix mit (exec-Guard:
Skript führt sich nach dem Reset einmal frisch neu aus) + `TimeoutStopSec=5` für den
Gateway (Restarts rissen sonst 90-s-502-Fenster, weil uvicorn auf offene LLM-Streams
wartet). Ab dem P2-Deploy schützt der Guard alle künftigen Deploys automatisch.
- **P3 · Steuerpult-Modernisierung** (Kartenserie, reine UI/API-Arbeit, berührt nach P1 nie mehr - **P3 · Steuerpult-Modernisierung** (Kartenserie, reine UI/API-Arbeit, berührt nach P1 nie mehr
den Datenpfad): (a) EIN SSE-Eventstrom `/api/events` ersetzt die 53 `refetchInterval`-Poller in den Datenpfad): (a) EIN SSE-Eventstrom `/api/events` ersetzt die 53 `refetchInterval`-Poller in
`queries.ts`; (b) TanStack Router → echte URLs (`/modelle/coder`, `/auftrag/t_…`), Deep-Links, `queries.ts`; (b) TanStack Router → echte URLs (`/modelle/coder`, `/auftrag/t_…`), Deep-Links,