feat(hermes): restart-request guardian for post-update pod restarts #25

Open
forgejo-hermes-bot wants to merge 1 commit from feat/restart-request-guardian into main
Collaborator

Problem

Nach jedem hermes update (nightly cron) sind die neuen Module auf Disk, aber die laufenden Gateways haben alte Module im RAM. Resultat: ImportError: cannot import name CHECK_FN_CACHE_BYPASS bei allen Profilen. Bisheriger Fix: manuelles podman pod restart hermes.pod.

Lösung

Container-seitig (Maia Cron, nicht im Repo): Ein post-update-restart-check Cron (02:00, 1h nach dem nightly update) liest update.log, ein LLM entscheidet ob ein Neustart nötig ist, und ruft hermes-request-restart pod auf. Der Helper schreibt Counter in /var/lib/hermes/restart-requests.json auf dem shared Rootfs.

Host-seitig (im Repo): Ein systemd User-Timer (alle 60s) pollt die Request-Datei, vergleicht mit dem letzten bedienten Stand und führt systemctl --user restart hermes-pod oder podman restart <container> aus. Deployment direkt in der Hermes-Rolle, ohne die zentrale services-Rolle zu verändern.

Dateien

  • ansible/roles/hermes/templates/restart-guardian/* — Systemd-Templates (script, service, timer)
  • ansible/roles/hermes/tasks/main.yml — Deployt den Watcher direkt (kein include_role: services)

Deployment

ansible-playbook main.yml --tags hermes --limit io --diff

Der Timer startet automatisch. Container-seitige Scripts (hermes-request-restart.py, hermes-nightly-update.sh) sind nicht Teil dieses Repos — sie werden direkt auf dem Rootfs gemanagt.

## Problem Nach jedem `hermes update` (nightly cron) sind die neuen Module auf Disk, aber die laufenden Gateways haben alte Module im RAM. Resultat: `ImportError: cannot import name CHECK_FN_CACHE_BYPASS` bei allen Profilen. Bisheriger Fix: manuelles `podman pod restart hermes.pod`. ## Lösung **Container-seitig (Maia Cron, nicht im Repo):** Ein `post-update-restart-check` Cron (02:00, 1h nach dem nightly update) liest `update.log`, ein LLM entscheidet ob ein Neustart nötig ist, und ruft `hermes-request-restart pod` auf. Der Helper schreibt Counter in `/var/lib/hermes/restart-requests.json` auf dem shared Rootfs. **Host-seitig (im Repo):** Ein systemd User-Timer (alle 60s) pollt die Request-Datei, vergleicht mit dem letzten bedienten Stand und führt `systemctl --user restart hermes-pod` oder `podman restart <container>` aus. Deployment direkt in der Hermes-Rolle, ohne die zentrale `services`-Rolle zu verändern. ## Dateien - `ansible/roles/hermes/templates/restart-guardian/*` — Systemd-Templates (script, service, timer) - `ansible/roles/hermes/tasks/main.yml` — Deployt den Watcher direkt (kein `include_role: services`) ## Deployment ```bash ansible-playbook main.yml --tags hermes --limit io --diff ``` Der Timer startet automatisch. Container-seitige Scripts (`hermes-request-restart.py`, `hermes-nightly-update.sh`) sind nicht Teil dieses Repos — sie werden direkt auf dem Rootfs gemanagt.
Container-side: hermes-request-restart helper writes to
/var/lib/hermes/restart-requests.json on the shared rootfs. Any
profile can request a pod or per-container restart by incrementing a
monotonically-growing counter.

Host-side: systemd user timer (every 60s) polls the request file,
compares with last-served state, and executes podman restart or
systemctl restart hermes-pod when counters increase.

hermes-nightly-update.sh now requests a pod restart via the helper
when hermes update reports 'Code updated'.

This eliminates the post-update module-mismatch ImportError that has
required manual pod restarts.
forgejo-hermes-bot force-pushed feat/restart-request-guardian from 663e191f7a to 64e6720d43 2026-08-03 13:08:28 +00:00 Compare
This pull request is blocked because it's outdated.
This branch is out-of-date with the base branch
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin feat/restart-request-guardian:feat/restart-request-guardian
git switch feat/restart-request-guardian
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
rohrschacht/netcup-setup!25
No description provided.