Das Hermes-Update vom 25.09. scheiterte halb: neuer Code geholt, dann baute python-olm (Matrix-Extra) nicht – CMake 4 und kein clang auf der Box. MC2 startete das Gateway ohne daemon-reload neu, es lief weiter aus dem alten venv (neuer Code, alte Pakete), und die Übersicht zeigte „v0.0.0 · Aktuell“. - Update über Hermes' eigenen Starter (.hermes/bin/hermes), gebaut mit CC=gcc CXX=g++ CMAKE_POLICY_VERSION_MINIMUM=3.5, doctor-Hinweise nicht fatal, daemon-reload vor dem Neustart. - deploy/hermes-plugin-deps.sh legt trafilatura (mc2-web-lesen) in Hermes' aktive Umgebung. - Version: bei „0.0.0“ in der pyproject das Commit-Datum im Stil der neuen Tags. - Ehrliche Meldung „UNVOLLSTÄNDIG“, wenn der Code schon neu ist. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
8.4 KiB
Updates — die Sonntags-Kette, Festhalten, Freigeben
Stand 24.09.2026, Code in main = 75611be. Für Techniker und Agenten; für den User: Seite „Updates" in
BEDIENUNG.md.
Die Box aktualisiert ihre Fremd-Software jeden Sonntag selbst: erst llama-swap, dann den Motor (llama.cpp), dann Hermes. Jeder Baustein wird danach geprüft; ist die Prüfung rot, rollt die Box zurück und hält den Baustein fest, bis ihn jemand freigibt. Sicherheitsupdates des Betriebssystems laufen getrennt über unattended-upgrades. Modelle wechseln nie automatisch (Modell-Radar, Knopf „Übernehmen").
Ablauf
flowchart TD
T["mc2-autoupdate.timer<br/>So 04:30 (+≤10 min)"] --> S["jobs/sonntags-update.sh"]
S --> A["autoupdate.sh"]
A --> R["1 · llama-swap<br/>update-swap.sh"]
R --> E["2 · Motor<br/>update-engine.sh"]
E --> H["3 · Hermes<br/>Job über MC2"]
H --> W["Wochenbericht<br/>[Box-Update]"]
W --> N{"Neustart nötig?<br/>nur So 04–07 Uhr"}
mc2-autoupdate.timer(Persistent=true, bis 10 min Zufallsverzug) startetmc2-autoupdate.service(einmaliger Lauf nachmc2-backup.service, Zeitlimit 3 h). Die Unit ruftdeploy/jobs/sonntags-update.sh, dasdeploy/autoupdate.shstartet und nur dann selbst meldet, wennautoupdate.shmit Fehler endet (letzte 15 Zeilen). Der Hermes-Cron „Updates am Sonntag" ist seit 24.09. pausiert.autoupdate.shbricht mit Meldung ab, wenn MC2 (/api/health) nicht antwortet.- llama-swap und Motor: Ein festgehaltener Baustein wird übersprungen. Sonst liefert
GET /api/maintenance/update-details?kind=swapbzw.kind=enginedie installierte und die neueste Version. Gibt es Neues, läuftsudo -n bash deploy/update-swap.shbzw.update-engine.sh(fehlt die sudo-Freigabe, wartet der Baustein mit Hinweis). Die Skripte sichern die alte Version (/usr/local/bin/llama-swap.bak,/opt/llamacpp-vulkan.bak), stoppen llama-swap, tauschen, starten und prüfen mitstack-postcheck.sh. Ergebnis 0 = eingespielt, 1 = zurückgerollt (Baustein wird festgehalten, Meldung), 2 = Update und Rückweg gescheitert (Meldung „KRITISCH", dringend). - Hermes: Ein festgehaltener Hermes wird übersprungen. Sonst sagt
update-details?kind=hermes, wie viele Commits Hermes zurückliegt.autoupdate.shstartetPOST /api/maintenance/hermes-updateund wartet bis zu 20 Minuten. Der Job: Sicherung → Dashboard stoppen →hermes update --yes --no-gateway-restart→hermes doctor→ Dashboard-Oberfläche mit Basis/hermes-ui/bauen →hermes-gatewayundhermes-builtin-uineu starten →hermes-postcheck.sh. Seit dem Update vom 25.09.2026 hat Hermes einen eigenen Paketmanager (hermes pm): Das Gateway startet über~/.hermes/hermes-agent/.hermes/bin/hermesin einer eigenen Umgebung (Python 3.14 unter~/.hermes/installs/…); das altevenv(Python 3.11) bleibt liegen, das Dashboard startet noch daraus. Der Job ruft deshalb den neuen Starter, baut mitCC=gcc CXX=g++ CMAKE_POLICY_VERSION_MINIMUM=3.5(sonst scheitertpython-olmam fehlenden clang und an CMake 4), wertet Hinweise vondoctornicht als Fehler, legt mithermes-plugin-deps.shdie Pakete unserer Plugins nach (trafilatura) und lädt die Units neu, bevor er neu startet. Die Zusatzpakete, die Lucy braucht, merkt sich der Paketmanager (hermes pm install --extra telegram --extra ddgs --extra stt-whisper, am 25.09. eingerichtet); fehlen sie, meldethermes doctor„Configured features whose dependencies are still missing“, und nach dem nächsten Neustart wäre Telegram weg. Scheitert der Job, nachdem der neue Code schon da ist, heißt es „HERMES-UPDATE UNVOLLSTÄNDIG“ statt „alter Stand“.- Grün: Meldung.
- Rot oder Zeitlimit: erst
self-repair.sh(kommentiert eindeutige, nicht sicherheitsrelevante Config-Schlüssel aus, an denen die neue Version scheitert; der Gehirn-Check muss danach grün sein). - Hilft das nicht: Rückweg —
git reset --hardauf den alten Commit in~/.hermes/hermes-agent,config.yamlund.envaus der letzten Sicherung, Neustart, Gehirn-Check. Grün: Hermes wird festgehalten, Meldung. Sonst „KRITISCH" (dringend).
- Wochenbericht „Commander, die Wochenpflege der Box ist durch" mit einer Zeile je Baustein.
- Neustart, wenn Ubuntu ihn verlangt (
/var/run/reboot-required), nur sonntags 04:00–06:59; außerhalb gibt es nur eine Ankündigung. Vorher prüft das Skript: Linger an, keine laufenden Jobs,mission-control-2,mc2-gatewayundmc2-stewardim Autostart; sonst Meldung statt Neustart.MC_AUTOUPDATE_REBOOT=0schaltet den Neustart ab,MC_AUTOUPDATE_REBOOT_JETZT=1erzwingt ihn außerhalb des Fensters.
Nachts landen alle Meldungen außer „KRITISCH" in der Morgenmeldung um 07:00.
Prüfungen nach dem Update
stack-postcheck.sh(nach llama-swap, Motor und Betriebssystem): llama-swap aktiv;/v1/modelsantwortet (bis 120 s); das Hirn liefert eine echte Antwort (1 Token); das Embedding-Modell liefert Vektoren; MC2 meldet den Motor erreichbar; Gateway gesund; Steward aktiv.hermes-postcheck.sh(nach Hermes): keine Config-Warnungen im Gateway-Log der letzten 3 Minuten; Werkzeug-Test durch den echten Agenten (echo postcheck-ok, bis 3 Versuche); Sprach-Test über/api/voice/chat(bis 3 Versuche); Browser-Werkzeugagent-browserlauffähig (einen toten Link setzt das Skript selbst neu).
Festhalten und Freigeben
- Rot mit grünem Rückweg ergibt einen Eintrag in
/srv/models/mc2-pins.json:{"<baustein>": {"pinned": true, "version": …, "grund": …, "datum": …}}mit den Bausteinenswap,engine,hermes. Künftige Sonntage überspringen ihn. - Der Wächter zeigt jeden festgehaltenen Baustein als gelben Hinweis „… bekommt keine Updates mehr" mit Knopf
„Freigeben"; die Updates-Seite zeigt ihn ebenso. Freigeben löscht den Eintrag
(
POST /api/updates/festgehalten/{baustein}/freigeben); der nächste Sonntag versucht das Update erneut. - Warum sichtbar: Vom 06. bis 17.09. hielt die Box Motor und Hermes fest, ohne dass es jemand merkte, elf Tage ohne Updates.
Von Hand
- Seite „Updates": „Nach Neuem suchen" (
apt-get update), je Baustein „Aktualisieren", „Alles jetzt aktualisieren" (mit Rückfrage). Es läuft immer nur ein Wartungs-Job; ein zweiter Klick startet kein zweites Update. - „Alles jetzt aktualisieren" kettet in einem Job, was ansteht: Motor → llama-swap → Hermes → Betriebssystem
(
apt-get upgrade, danachstack-postcheck.sh). Scheitert ein Teil, stoppt die Kette. - Zeitlimits der Jobs: Suche 15 min, Betriebssystem 90 min, Motor 60 min, llama-swap 30 min, Hermes 45 min, alles zusammen 3 h. „Abbrechen" beendet die ganze Prozessgruppe.
- Per SSH:
bash ~/mission-control-v2/deploy/autoupdate.sh(neu gestartet wird trotzdem nur im Wartungsfenster). - Kann eine Update-Prüfung nicht prüfen (Netz, API, apt), zeigt die Oberfläche „Prüfung unklar" statt „aktuell". Nach jedem Update prüft sie sofort neu.
- Update-Jobs leben im MC2-Prozess; ein Neustart von MC2 bricht sie ab. Der Deploy wartet deshalb.
Update-Verlauf
backend/services/update_verlauf.py baut den Verlauf der Updates-Seite aus ~/mc2-notify.log. Es liest die Zeilen
OK telegram, OK telegram direkt (Zweitweg über die Bot-API), QUEUED für Morgen-Digest und FALLBACK (…).
Meldungen mit weniger als 45 Minuten Abstand gehören zu einem Lauf; die Morgenmeldung zählt nicht als eigener Lauf.
Der Wortlaut der Meldungen von autoupdate.sh und der Protokolleinträge muss deshalb bleiben: Eine Umformulierung
bricht den Verlauf ohne Fehlermeldung.
Betriebssystem
Sicherheitsupdates spielt unattended-upgrades ein. Wartet danach ein Kernel oder libc auf den Neustart, startet der
Sonntagslauf die Box im Wartungsfenster neu. Weitere Pakete: Knopf „Aktualisieren" beim Baustein Betriebssystem.
Fallen
- llama.cpp hat
--no-mmapgestrichen (seit b10936); die Config nutzt--load-mode none. Vor einem Engine-Sprung die Config-Zeilen mit dem neuenllama-serverprüfen. hermes updatemeldet Exit 1 trotz Erfolg, deshalb--no-gateway-restart.- Ein Timer mit
Persistent=trueholt verpasste Läufe beim Einschalten sofort nach (24.09.: Neustart um 14:51). - Der Updater läuft nicht mehr als Hermes-Cron (20.09.: Hermes startete sich beim eigenen Update neu).
Einzelheiten: wissen/FALLEN.md.