feat(infra): colima-VM-Liveness-Guard in ensure-containers

Schließt das letzte SPOF-Loch: stirbt die colima-VM im laufenden Betrieb
(Crash/OOM), brachte bisher nichts sie zurück — startup.sh läuft nur beim
Boot, ensure-containers nahm an, docker sei oben (exit 1 bei totem docker).

Neu: vor dem docker-info-Check prüft das Script `colima status` und
startet die VM bei Bedarf. Sicherungen:
- Wartungs-Lock `/tmp/mana-colima-maintenance` (touch = Guard pausiert) —
  damit bewusste colima-Stopps (egress-/ssh-mux-Debug) nicht
  überschrieben werden.
- Backoff: nach 3 Fehlstarts in Folge KEIN Auto-Start mehr +
  urgent-Notification (z.B. stale in_use_by-Symlink → manueller Eingriff).
- send_notification bei Auto-Restart + bei Backoff-Stopp.
- set-e-sicher (if/else statt nacktem &&).

Deployed auf mana-server (Backup .bak-pre-colima-guard-20260525),
bash -n grün, einmal real ausgeführt (colima running → Guard no-op).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-05-25 15:04:37 +02:00
parent 800a91f1b5
commit 4e26637464

View file

@ -67,6 +67,45 @@ send_notification() {
fi
}
# --- colima-VM-Liveness-Guard ---------------------------------------------
# Wenn die colima-VM im laufenden Betrieb stirbt (Crash/OOM), bringt sonst
# nichts sie zurueck — startup.sh laeuft nur beim Boot. Dieser Guard heilt
# einen Mid-Run-Crash. Schutz vor ungewollten Starts in bewussten Wartungs-/
# Debug-Stopps (colima restart/stop gegen die egress-/ssh-mux-Bugs): das
# Lock-File pausiert den Guard. Backoff verhindert Endlos-Haemmern, wenn
# colima nicht hochkommt (z.B. stale in_use_by-Symlink auf der ManaData-Disk).
COLIMA_MAINT_LOCK="/tmp/mana-colima-maintenance" # `touch` = Guard pausiert
COLIMA_FAIL_TRACKER="/tmp/mana-colima-start-fails"
COLIMA_MAX_FAILS=3
if ! colima status >/dev/null 2>&1; then
if [ -f "$COLIMA_MAINT_LOCK" ]; then
log "colima-Guard: VM down, aber Wartungs-Lock aktiv ($COLIMA_MAINT_LOCK) — kein Auto-Start"
exit 0
fi
FAILS=$(cat "$COLIMA_FAIL_TRACKER" 2>/dev/null || echo 0)
case "$FAILS" in '' | *[!0-9]*) FAILS=0 ;; esac
if [ "$FAILS" -ge "$COLIMA_MAX_FAILS" ]; then
log "colima-Guard: VM down + bereits $FAILS Fehlstarts — KEIN weiterer Auto-Start, manueller Eingriff noetig (z.B. in_use_by-Symlink loeschen, dann '$COLIMA_FAIL_TRACKER' entfernen)"
send_notification "colima-VM down + $FAILS Fehlstarts auf mana-server — manueller Eingriff noetig" "urgent"
exit 1
fi
log "colima-Guard: VM ist DOWN — starte colima (Versuch $((FAILS + 1))/$COLIMA_MAX_FAILS)"
if colima start >/dev/null 2>&1; then
log "colima-Guard: colima start erfolgreich — VM wieder oben"
send_notification "colima-VM war down, automatisch neu gestartet (mana-server)" "high"
rm -f "$COLIMA_FAIL_TRACKER"
else
echo $((FAILS + 1)) > "$COLIMA_FAIL_TRACKER"
log "colima-Guard: colima start FEHLGESCHLAGEN (Fehlstart $((FAILS + 1))/$COLIMA_MAX_FAILS)"
exit 1
fi
else
# VM laeuft normal — Fehlerzaehler zuruecksetzen
rm -f "$COLIMA_FAIL_TRACKER" 2>/dev/null || true
fi
# --- Ende colima-Guard ----------------------------------------------------
# Check if docker is running
if ! docker info >/dev/null 2>&1; then
log "ERROR: Docker is not running"