homelab-codex-ws/docs/sessions/2026-06-24.md
oskar 510fe0b600 feat(kb): frontmatter OKF dla 39 session logow
Session logi zostaja w docs/sessions/ (decyzja z etapu 1). Dodany wylacznie
blok frontmattera: type: session-log, visibility: private, status: active,
updated = data ostatniego commita pliku.

Tresc nietknieta — kazdy plik to +9/-0 linii.

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

136 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
okf: "0.1"
type: session-log
visibility: private
status: active
updated: 2026-06-24
links: []
---
# 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:
```bash
# 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-plane**`test_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.