homelab-codex-ws/docs/sessions/2026-06-09-flota-recovery-lustro-register.md
Oskar Kapala 5c2516d097 docs: session 2026-06-09 + skill/backlog update
- docs/sessions/2026-06-09-flota-recovery-lustro-register.md: flota
  recovery (root cause aerbot group, 3 warstwy maskujące), lustro register
  stan+plan, fix-event-bloat i OOM pending, worktree gotcha
- docs/backlog.md: nowy plik — tech-debt tracker; wpisy: --omit-dir-times,
  oskar∈aerbot deklaratywnie, worktree per task, observer staleness
- .claude/skills/node-onboarding/SKILL.md: step table aktualizacja (PROVEN:
  20-base, 30-node-agent; WRITTEN: 40-register, 50-verify), 3 nowe gotchas
  (rsync perm, observer restart, worktree branch)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 20:38:35 +02:00

4.3 KiB

Sesja 2026-06-09 — flota recovery + LUSTRO register

Cel

Diagnoza cichej awarii reportingu floty; dokończenie kroku REGISTER dla LUSTRO (40-register.sh + 50-verify.sh); update skilla node-onboarding.


GŁÓWNE: 8-dniowa cicha awaria reportingu floty — ROZWIĄZANA

Root cause

oskar (uid 1002) spoza grupy aerbot (1000) na VPS. /opt/homelab/events/* = aerbot:aerbot 775oskar w "other" (r-x). rsync push z każdego node'a (jako oskar przez SSH) = Permission denied przy zapisie → --remove-source-files nie czyścił backlogu → 292 000 plików nagromadzonych w staging cache node-agentów.

Fix

usermod -aG 1000 oskar    # na VPS; ssh re-login wymagany

Weryfikacja

  • VPS events/piha 3443 pliki (rośnie)
  • piha lokalnie: 2 pliki (staging wyczyszczony)
  • Panel agents.okit.pl: vps / piha / solaria — Last Seen świeże

Diagnoza — 5 warstw, 4 obalone hipotezy

Verify-before-fix obalił kolejno:

  1. authorized_keys missing — klucz był, SSH działał (piha→VPS ręcznie OK)
  2. Remote agent down — procesy rsync widoczne w ps, logi bez crash
  3. VPS IP zmiana — Tailscale IP niezmieniony 100.95.58.48
  4. Bridge/relay cutoff — ping VPS→piha OK przez mesh

5 warstwa (błąd uprawnienia) odkryta przez ręczny rsync jako oskar na VPS → Permission denied (13)stat /opt/homelab/events/aerbot:aerbot 775.

Dlaczego awaria była CICHA (3 warstwy maskujące)

Warstwa Mechanizm
(a) shipping fail Logowany jako WARNING, nie crash — node-agent nie failował, milczał
(b) observer staleness Stale node pokazywany NOMINAL — brak heartbeat TTL, observer trzyma ostatni znany stan
(c) brain-watchdog Ślepy na per-node freshness — nie monitoruje świeżości eventów per-node

Pozostały drobny błąd

rsync exit code 23: set-times na katalogu = EPERM (oskar nie jest właścicielem /opt/homelab/events/aerbot jest). Kosmetyka — rsync działa poprawnie. Fix: dodać --omit-dir-times do wywołania rsync w node-agent (wpisane do backlogu).


LUSTRO register: stan po sesji

Dokonane

  • 40-register.sh — napisany i zcommitowany na task/node-onboarding
    • Idempotentny: grep topology, [[ -f services.yaml ]], git diff --quiet
    • Commituje tylko inventory/topology.yaml + hosts/lustro/services.yaml na bieżącym branchu
    • BEZ git push (merge należy do operatora)
  • 50-verify.sh — napisany i zcommitowany
    • 4 checki: node-agent running, eventy, observer restart + heartbeat poll, world/nodes.json
    • Tabela pass/fail; exit 1 on failure
  • 40-deploy-node-agent.sh — scaffold usunięty (deploy w 30-node-agent.sh)
  • Dry-run 40-register.sh --dry-run przeszedł czysto

Mechanizm aktywacji observera (zbadany)

Observer bind-mountuje repo root jako /repo:ro z services/control-plane/docker-compose.yml (../..:/repo:ro/home/oskar/homelab-codex-ws na VPS). _load_inventory() wywoływane raz przy starcie. Aktywacja po merge: git pull VPS + docker restart control-plane-observer — bez redeploy.

Wpis lustro w topology.yaml (minimalistyczny, 1:1 z piha)

  lustro:
    roles:
      - edge
    services:
      - node-agent

PENDING (jutro)

  1. Commit B: onboard.sh --node lustro --step 40-register live → commit na branchu
  2. agent.sh merge task/node-onboarding → master
  3. git pull na VPS + docker restart control-plane-observer
  4. onboard.sh --node lustro --step 50-verify → lustro widoczny w agents.okit.pl

fix-event-bloat (task/fix-event-bloat)

Commit d483274 na branchu: batch rsync, backlog trim, timeout 120s, backlog warn. PENDING: review + deploy na flotę.


OOM ai-cluster (obserwacja live)

Zaobserwowany na VPS podczas sesji: cgroup OOM restart-loop, python workery ~195 MB, 0 swap. PENDING: migracja ai-cluster → SOLARIA + dodanie swap na VPS.


Gotcha sesji

Worktree branch confusion: ~/homelab-codex-ws-node-onboarding był przełączony ręcznie na task/fix-event-bloat (jeden worktree, dwa branche ręcznie switchwane). Anty-wzorzec: zawsze sprawdzać git branch --show-current na wejściu do worktree. Docelowo: osobny worktree per task.


Tech-debt złapany w sesji

→ wpisany do docs/backlog.md