From a969898a16b2f4462a4cc9f7af2c84f6c6e68ef8 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 27 Aug 2026 15:51:48 +0200 Subject: [PATCH] fix(deploy): Skript gegen sich selbst absichern - alles in main() Beim Deploy am 27.08.2026 live erlebt: der `git pull` in Schritt 1 brachte eine neue Fassung von deploy.sh mit, ausgefuehrt wurde danach trotzdem die alte Logik (die Ausgabe zeigte den alten Text des Config-Sync-Schritts). Ursache: bash liest ein Skript haeppchenweise WAEHREND es laeuft. Wird die Datei mitten im Lauf ersetzt, liest bash am selben Byte-Offset im neuen Text weiter - im harmlosen Fall greift die alte Logik, im schlimmen Fall fuehrt es eine zerschnittene Zeile aus. Fix: der komplette Ablauf liegt jetzt in main(), aufgerufen als letzte Zeile. Eine Funktion wird vollstaendig geparst, bevor sie startet. Aenderungen an deploy.sh greifen damit sauber ab dem naechsten Aufruf statt mittendrin. Co-Authored-By: Claude Opus 5 --- deploy/deploy.sh | 120 ++++++++++++++++++++++++++--------------------- 1 file changed, 66 insertions(+), 54 deletions(-) diff --git a/deploy/deploy.sh b/deploy/deploy.sh index 33a212d..50c4f14 100644 --- a/deploy/deploy.sh +++ b/deploy/deploy.sh @@ -1,64 +1,76 @@ #!/bin/bash set -e -echo "Starte MC2 Deployment..." +# ‼️ Das ganze Skript liegt in EINER Funktion — das ist Absicht, kein Stil. +# Bash liest ein Skript haeppchenweise WAEHREND es laeuft. `git pull` unten ersetzt +# genau diese Datei mitten im Lauf; danach liest bash am selben Byte-Offset im NEUEN +# Text weiter und fuehrt zerschnittene Zeilen aus. Live erlebt am 27.08.2026: der Pull +# brachte eine neue Fassung dieses Schrittes mit, ausgefuehrt wurde trotzdem die alte. +# Eine Funktion wird komplett geparst, bevor sie startet -> der Lauf bleibt in sich +# stimmig, und Aenderungen greifen ab dem naechsten Aufruf statt mittendrin. +main() { -# 1. Neuesten Code holen -git pull origin main + echo "Starte MC2 Deployment..." + + # 1. Neuesten Code holen + git pull origin main -# 2. Abhängigkeiten prüfen (falls sich was geändert hat) -echo "Aktualisiere Python Abhängigkeiten..." -backend/.venv/bin/pip install -r backend/requirements.txt + # 2. Abhängigkeiten prüfen (falls sich was geändert hat) + echo "Aktualisiere Python Abhängigkeiten..." + backend/.venv/bin/pip install -r backend/requirements.txt -# 3. Llama-Swap Konfiguration prüfen und synchronisieren -# -# ‼️ ACHTUNG (27.08.2026): /etc/llama-swap/config.yaml ist die LEBENDE Wahrheit — MC2 -# schreibt sie selbst (backend/services/llamaswap.py::write_config), sobald jemand über -# die Oberfläche ein Modell hinzufügt oder eine Rolle ändert. deploy/llama-swap.config.yaml -# ist nur ein Abzug und hinkt regelmäßig hinterher (aktuell fehlt ihm z. B. der -# `kritiker`/Devstral-Eintrag, den STACK.md und der Modell-Katalog voraussetzen). -# Bis hierher wurde die Live-Datei kommentarlos mit dem Abzug überschrieben — alles per -# UI Hinzugefügte war nach jedem Deploy weg. Jetzt: erst sichern, dann kopieren, und die -# Abweichung sichtbar machen. MC_DEPLOY_SKIP_SWAP_CONFIG=1 überspringt den Schritt ganz. -if ! cmp -s deploy/llama-swap.config.yaml /etc/llama-swap/config.yaml; then - if [ "${MC_DEPLOY_SKIP_SWAP_CONFIG:-0}" = "1" ]; then - echo "Llama-Swap Konfiguration weicht ab — uebersprungen (MC_DEPLOY_SKIP_SWAP_CONFIG=1)." - else - SWAP_BAK="/etc/llama-swap/config.yaml.bak-$(date +%Y%m%d-%H%M%S)" - echo "Llama-Swap Konfiguration hat sich geändert." - echo " Abweichung (live -> Repo-Abzug):" - diff -u /etc/llama-swap/config.yaml deploy/llama-swap.config.yaml | head -40 || true - echo " Sichere die laufende Datei nach $SWAP_BAK" - # NOPASSWD für llama-swap Neustart ist vorausgesetzt (siehe AGENTS.md) - sudo cp /etc/llama-swap/config.yaml "$SWAP_BAK" - sudo cp deploy/llama-swap.config.yaml /etc/llama-swap/config.yaml - sudo systemctl restart llama-swap - echo " Rueckweg bei Verlust: sudo cp $SWAP_BAK /etc/llama-swap/config.yaml" - fi -fi - -# 4. Systemd Units neu laden (falls sich .service Dateien geändert haben) -systemctl --user daemon-reload - -# 4.5 Hermes Skills synchronisieren -echo "Synchronisiere Hermes Skills..." -mkdir -p ~/.hermes/skills -# Kopiere alle Skills aus dem Repo, ersetze - durch _ in den Ordnernamen für Hermes Kompatibilität -for skill_dir in deploy/skills/*; do - if [ -d "$skill_dir" ]; then - skill_name=$(basename "$skill_dir" | tr '-' '_') - mkdir -p ~/.hermes/skills/"$skill_name" - cp -r "$skill_dir"/* ~/.hermes/skills/"$skill_name"/ + # 3. Llama-Swap Konfiguration prüfen und synchronisieren + # + # ‼️ ACHTUNG (27.08.2026): /etc/llama-swap/config.yaml ist die LEBENDE Wahrheit — MC2 + # schreibt sie selbst (backend/services/llamaswap.py::write_config), sobald jemand über + # die Oberfläche ein Modell hinzufügt oder eine Rolle ändert. deploy/llama-swap.config.yaml + # ist nur ein Abzug und hinkt regelmäßig hinterher (aktuell fehlt ihm z. B. der + # `kritiker`/Devstral-Eintrag, den STACK.md und der Modell-Katalog voraussetzen). + # Bis hierher wurde die Live-Datei kommentarlos mit dem Abzug überschrieben — alles per + # UI Hinzugefügte war nach jedem Deploy weg. Jetzt: erst sichern, dann kopieren, und die + # Abweichung sichtbar machen. MC_DEPLOY_SKIP_SWAP_CONFIG=1 überspringt den Schritt ganz. + if ! cmp -s deploy/llama-swap.config.yaml /etc/llama-swap/config.yaml; then + if [ "${MC_DEPLOY_SKIP_SWAP_CONFIG:-0}" = "1" ]; then + echo "Llama-Swap Konfiguration weicht ab — uebersprungen (MC_DEPLOY_SKIP_SWAP_CONFIG=1)." + else + SWAP_BAK="/etc/llama-swap/config.yaml.bak-$(date +%Y%m%d-%H%M%S)" + echo "Llama-Swap Konfiguration hat sich geändert." + echo " Abweichung (live -> Repo-Abzug):" + diff -u /etc/llama-swap/config.yaml deploy/llama-swap.config.yaml | head -40 || true + echo " Sichere die laufende Datei nach $SWAP_BAK" + # NOPASSWD für llama-swap Neustart ist vorausgesetzt (siehe AGENTS.md) + sudo cp /etc/llama-swap/config.yaml "$SWAP_BAK" + sudo cp deploy/llama-swap.config.yaml /etc/llama-swap/config.yaml + sudo systemctl restart llama-swap + echo " Rueckweg bei Verlust: sudo cp $SWAP_BAK /etc/llama-swap/config.yaml" fi -done + fi -# 5. Dienste neu starten -# ‼️ mc2-steward gehoert hier dazu: er laeuft aus DEMSELBEN Checkout (backend/steward.py). -# Ohne ihn lief der Waechter-Prozess nach jedem Deploy mit dem alten Code weiter — der -# Neustart wurde 27.08.2026 nachgetragen. `--user restart` auf einer nicht installierten -# Unit ist folgenlos, darum ohne Vorabpruefung. -echo "Starte Backend neu..." -systemctl --user restart mc2-gateway.service mission-control-2.service mc2-steward.service + # 4. Systemd Units neu laden (falls sich .service Dateien geändert haben) + systemctl --user daemon-reload -echo "✅ Deployment erfolgreich abgeschlossen!" + # 4.5 Hermes Skills synchronisieren + echo "Synchronisiere Hermes Skills..." + mkdir -p ~/.hermes/skills + # Kopiere alle Skills aus dem Repo, ersetze - durch _ in den Ordnernamen für Hermes Kompatibilität + for skill_dir in deploy/skills/*; do + if [ -d "$skill_dir" ]; then + skill_name=$(basename "$skill_dir" | tr '-' '_') + mkdir -p ~/.hermes/skills/"$skill_name" + cp -r "$skill_dir"/* ~/.hermes/skills/"$skill_name"/ + fi + done + + # 5. Dienste neu starten + # ‼️ mc2-steward gehoert hier dazu: er laeuft aus DEMSELBEN Checkout (backend/steward.py). + # Ohne ihn lief der Waechter-Prozess nach jedem Deploy mit dem alten Code weiter — der + # Neustart wurde 27.08.2026 nachgetragen. `--user restart` auf einer nicht installierten + # Unit ist folgenlos, darum ohne Vorabpruefung. + echo "Starte Backend neu..." + systemctl --user restart mc2-gateway.service mission-control-2.service mc2-steward.service + + echo "✅ Deployment erfolgreich abgeschlossen!" +} + +main "$@"