125 lines
4.3 KiB
Markdown
125 lines
4.3 KiB
Markdown
|
|
# 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
|
||
|
|
|
||
|
|
```bash
|
||
|
|
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)
|
||
|
|
|
||
|
|
```yaml
|
||
|
|
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`
|