homelab-codex-ws/docs/sessions/2026-06-24.md

136 lines
5.5 KiB
Markdown
Raw Normal View History

---
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 `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-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.