homelab-codex-ws/docs/sessions/2026-06-11-lustro-ssh-shipping.md

3.9 KiB

Sesja 2026-06-10/11 — lustro SSH shipping fix + ha-diag-agent piha

Cel

Naprawa shippingu eventów lustro → VPS; domknięcie deploy-configu ha-diag-agent na piha; zachowanie poison-quarantine (Codex) do osobnego review.


GŁÓWNE: LUSTRO event shipping — NAPRAWIONY (merged a5a1352)

Root cause

_ship_events_to_vps() (services/node-agent/src/node_agent.py) woła ssh bez -i, więc klucz jest szukany w $HOME/.ssh = /home/homelab/.ssh (kontener działa jako uid 1000 homelab od dodania user: "1000:1000" do bazowego services/node-agent/docker-compose.yml). Override lustra montował klucz w /root/.sshślepy mount, ssh tam nie patrzy → oskar@100.95.58.48: Permission denied.

Fix

hosts/lustro/runtime/node-agent/docker-compose.override.yml:

- /home/pi/.ssh:/home/homelab/.ssh:ro   # było: /root/.ssh — ślepe

Klucz pi@pimirror2 dodany do authorized_keys oskar@VPS. uid match (pi=1000 = homelab=1000) spełnia strict ownership check OpenSSH.

Weryfikacja

  • 5 nodów NOMINAL w world state; lustro w /opt/homelab/world/nodes.json (online, świeży last_seen)
  • 7600+ eventów backlogu spłynęło na VPS (/opt/homelab/events/lustro/)
  • Staging na lustrze drenowany do zera (--remove-source-files działa)
  • "Permission denied" zniknął z logów node-agenta

Diagnoza — lekcja verify-before-fix

Oba agenty (Claude Code, Codex) błędnie wskazały observer (poison event / race) na nieaktualnym stanie (events=2 z ręcznego testu). Verify-before-fix obalił obie hipotezy: events/lustro na VPS było puste → problem w warstwie dostarczania (klucz SSH), nie w observerze.


ha-diag-agent piha — deploy config merged (5e9db5c), deploy NIEDOKOŃCZONY

  • .env utworzony na piha: /opt/homelab/config/ha-diag-agent/.env, chmod 600
  • ALE token = PLACEHOLDER — chelsty-ha offline → brak tokenu i połączenia
  • Przed shadow_mode=false: target restartu w supervisorze = nazwa kontenera homeassistant5; curl endpointu z tokenem musi dać HTTP 200
  • Decyzja PENDING: cel HA = chelsty-ha vs HA Ken (homeassistant5 na piha — z kontenera NIE localhost)

observer poison-quarantine (Codex)

Zachowany na branchu task/observer-poison-quarantine (78c9e4a) — NIE w master. Do osobnego review: czy observer realnie wiesza się na malformed evencie (poison NIE był przyczyną lustra; hipoteza niezweryfikowana). Realny bug → merge; inaczej → drop.


🔴 FLOTA-BOMBA — odkryta, NIE naprawiona (backlog, BLOKUJĄCE)

solaria / piha / chelsty to wciąż stare root kontenery node-agenta (piha Created 2026-05-27, uid 0). Ich mount /root/.ssh działa tylko dlatego, że kontenery są sprzed user: "1000:1000". Pierwszy --force-recreate / reboot hosta / update obrazu przełączy je na uid 1000 i shipping padnie jak na lustrze. NIE RECREATE bez fixu. Szczegóły i fix: docs/backlog.md.


Tech-debt złapany w sesji

→ wpisany do docs/backlog.md (flota-bomba, ha-diag-agent blocked, poison-quarantine review, --omit-dir-times, stale komentarz node_agent.py, shipping success na logger.debug, event-bloat lustro na VPS).

Session 20:19

Commits

fa59625 docs(ha-diag-agent): replace curl verify commands with docker exec d7e0d31 fix(ha-diag-agent): remove host port mapping for 8087

Files changed

services/ha-diag-agent/DEPLOY.md | 4 ++-- services/ha-diag-agent/README.md | 4 ++-- services/ha-diag-agent/docker-compose.yml | 3 --- services/ha-diag-agent/service.yaml | 3 --- 4 files changed, 4 insertions(+), 10 deletions(-))

Deploys

None recorded

Narrative

user-provided summary

Session 20:35

Commits

(brak nowych — commity d7e0d31 i fa59625 z tej sesji trafiły do mastera przed tym wpisem)

Files changed

(bez zmian — zob. Session 20:19)

Deploys

None recorded

Narrative

user-provided summary