- 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>
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 775 → oskar 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/piha3443 pliki (rośnie) pihalokalnie: 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:
authorized_keysmissing — klucz był, SSH działał (piha→VPS ręcznie OK)- Remote agent down — procesy
rsyncwidoczne wps, logi bez crash - VPS IP zmiana — Tailscale IP niezmieniony 100.95.58.48
- 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 natask/node-onboarding- Idempotentny: grep topology,
[[ -f services.yaml ]],git diff --quiet - Commituje tylko
inventory/topology.yaml+hosts/lustro/services.yamlna bieżącym branchu - BEZ
git push(merge należy do operatora)
- Idempotentny: grep topology,
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-runprzeszedł 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)
- Commit B:
onboard.sh --node lustro --step 40-registerlive → commit na branchu agent.sh merge task/node-onboarding→ mastergit pullna VPS +docker restart control-plane-observeronboard.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