# 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 ~7–14 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.
