homelab-codex-ws/docs/sessions/2026-06-24.md
oskar a55c0928e6 docs(sessions): add 2026-06-24 session log (fleet-prometheus etap 1)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-24 23:37:49 +02:00

5.4 KiB
Raw Permalink Blame History

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 docs/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.