homelab-codex-ws/docs/sessions/2026-06-24.md
oskar 4658089e21 fix(kb): przepiecie wszystkich odwolan wewnetrznych po migracji
126 plikow (md, yaml, sh, py) odwolywalo sie do sciezek sprzed migracji.

  15  markdown-linkow [..](..) -> policzona sciezka WZGLEDNA wobec pliku
      odsylajacego (wczesniej czesc z nich byla repo-root-relative i nie
      rozwiazywala sie z katalogu, w ktorym lezala)
 200  odwolan tekstowych (backticki, proza, yaml, importy w kodzie)
      -> nowa sciezka repo-root-relative, zgodnie z konwencja repo
   5  linkow rodzenstwa (gole nazwy plikow, np. "](DEPLOY.md)") — dzialaly
      tylko w starym katalogu; przeliczone recznie

Objete m.in.: CLAUDE.md (scripts/onboard/README.md -> kb/runbooks/
node-onboarding-tool.md, docs/backlog.md -> kb/phases/backlog.md),
README.md, .claude/skills/, 20 session logow, kod jobow.

Ostatnie 5 odwolan pochodzi z tresci wciagnietej rebasem z origin/master
(session log 2026-07-31, override node-agenta na SOLARII, dwie pozycje
backlogu) — wskazywaly na docs/incidents/, docs/kb/modules/ i
services/narty27/README.md sprzed migracji.

Dodany wzajemny link miedzy kb/services/control-plane.md (stub kodu)
a kb/subsystems/control-plane.md (opis, deprecated) — dwa dokumenty o tym
samym systemie, latwe do pomylenia.

Weryfikacja na 790 plikach: 0 odwolan do starych sciezek,
0 martwych linkow markdown. Lint OKF: 190/190 plikow ZGODNE.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 16:58:46 +02:00

5.5 KiB
Raw Permalink Blame History

okf type visibility status updated links
0.1 session-log private active 2026-06-24

Sesja 2026-06-24 — fleet-prometheus etap 1: scaffold + deploy-node hostname fix

Cel

Wdrożenie etapu 1 Prometheus-as-truth dla liveness floty: scaffold serwisu fleet-prometheus pod GitOps, poprawka krytycznego buga hostname w deploy-node.sh, uruchomienie kontenera na VPS.


ZROBIONE

Scaffold services/fleet-prometheus/ pod GitOps

  • prom/prometheus:v3.5.0 — pinned (nie latest).
  • Scrape: self + fleet-node (node_exporter VPS przez host.docker.internal:9100).
  • Retencja: 15d / 2 GB.
  • mem_limit: 512m, oom_score_adj: 200 — ofiara OOM przed control-plane (-900); VPS ma 4 GB RAM + 4 GB swap.
  • Healthcheck: wget in-container (/bin/-/healthy) — obraz ma wget i promtool, nie ma curl; zweryfikowane przed commitem.
  • alerting: i rule_files: obecne jako puste placeholdery — osobny krok.
  • Zarejestrowany w hosts/vps/services.yaml + inventory/topology.yaml.
  • Ekspozycja: tailscale-internal.

Bind fix — nasłuch na Tailscale IP, nie 0.0.0.0 (commit 43c47a0)

  • Port bind: ${TAILSCALE_BIND_IP}:9090:9090 zamiast 0.0.0.0.
  • .env z TAILSCALE_BIND_IP=100.95.58.48 tworzony ręcznie na każdym hoście (gitignored) — services/fleet-prometheus/.env na VPS już utworzony.
  • Defense-in-depth: nie polegamy na firewallu VPS poza repo.

Fix krytyczny: deploy-node.sh — rozwiązywanie HOST_DIR przez os_hostname (commity 644f32d + ae739b5)

Root cause: deploy-node.sh ustalał HOST_DIR przez hosts/$(hostname | lower). VPS ma OS-hostname ubuntu-4gb-hel1-1, a katalog to hosts/vps — mismatch powodował ciche "No services found" + exit 0 (fałszywe zielone). VPS nigdy nie deployował się tą ścieżką od początku istnienia skryptu.

Fix:

  • Dodano pole os_hostname do wszystkich 6 hosts/*/host.yaml (tylko VPS różni się: os_hostname: ubuntu-4gb-hel1-1; pozostałe = hostname).
  • deploy-node.sh mapuje HOST_DIR przez os_hostname == $(hostname) z fallbackiem na starą logikę + twardy exit 1 zamiast cichego skip.
  • Zweryfikowane: mapowanie ubuntu-4gb-hel1-1 → hosts/vps działa, deploy wszedł w pętlę serwisów.

SSH aliasy vps/piha na SOLARII

Dodane do ~/.ssh/config na SOLARII (parity z SATURN) — zamknięty backlog item.


NIEDOKOŃCZONE — następny krok (priorytet)

fleet-prometheus NIE jest jeszcze uruchomiony na VPS

deploy.sh vps --no-gate wszedł po raz pierwszy w pętlę serwisów (hostname fix zadziałał), ale padł na node-agent:

Container node-agent Recreate
Error: No such container: 1913f743ea38_node-agent

Przyczyna: rozjazd stanu Docker Compose — istniejące serwisy VPS (node-agent, control-plane, up ~714 dni) zostały utworzone inną ścieżką / project-name niż widzi deploy-node.sh (bo VPS nigdy wcześniej nie deployował się tą ścieżką). set -e przerwał pętlę na node-agent; fleet-prometheus jest dalej w kolejce — NIE powstał. node-agent prawdopodobnie wciąż żyje (błąd przy Recreate, nie kill).

Plan domknięcia — Wariant A (uzgodniony): Postawić fleet-prometheus ręcznie, z pominięciem rozjazdu stanu pozostałych serwisów:

# na VPS:
cd ~/homelab-codex-ws
docker compose \
  -f services/fleet-prometheus/docker-compose.yml \
  -f hosts/vps/runtime/fleet-prometheus/docker-compose.override.yml \
  --env-file services/fleet-prometheus/.env \
  up -d

Weryfikacja po uruchomieniu:

  • ss -tlnp | grep 9090 → musi pokazać 100.95.58.48:9090 (NIE 0.0.0.0).
  • Kontener healthy (docker ps).
  • Oba targety up: http://100.95.58.48:9090/api/v1/targets.

Dalsze etapy Prometheus-as-truth (osobne sesje)

  1. Targety floty 100.x (wszystkie nody przez Tailscale).
  2. Reguły liveness: up==0 for: 5m.
  3. Integracja brain-watchdog: odpyt /api/v1/alerts → Telegram.
  4. Rotacja tokenu HAOS w domowym prom (plaintext).
  5. Przepięcie observer / panel agents.okit.pl na źródło Prometheus.

Nowe tech-debty (dodane do kb/phases/backlog.md)

  1. Rozjazd stanu Docker Compose na VPS — serwisy node-agent, control-plane i inne stworzone innym project-name niż deploy-node.sh oczekuje; Recreate pada na stale container ID. Dotyka żywego control-plane (~7 dni uptime) — ostrożnie, osobna sesja.
  2. Flaky testy control-planetest_incident_lifecycle.py::test_run_once_quarantines_bad_event i ::test_run_once_skips_observer_emitted_events failują przez state-leak między przebiegami pytest (moduł-level EVENTS_DIR/FAILED_EVENTS_DIR/checkpoint, nie tmp_path). Kod observera zdrowy. Gate deploy.sh nierzetelny dopóki nie naprawione; musieliśmy użyć --no-gate.

Wnioski

  • Hostname-to-directory mismatch był cicho od zawsze: exit 0 bez deployu wyglądał jak sukces. Wzorzec os_hostname w host.yaml + twardy exit 1 eliminuje cichą kategorię błędów dla całej floty.
  • Rozjazd state Compose to dług z epoki przed GitOps-deployment na VPS — teraz widoczny, bo po raz pierwszy realna pętla serwisów na VPS. Dotykać ostrożnie (live control-plane).
  • --no-gate jako sygnał: gate deploy.sh jest zawodny przez flaky testy — każde ominięcie gate'u powinno być odnotowane i gonione naprawą testu.
  • Fleet-prometheus wchodzi nowym serwisem (zero state do rozjazdu) → ręczny docker compose up -d jest bezpieczny i wystarczający do domknięcia etapu 1.