127 lines
5.4 KiB
Markdown
127 lines
5.4 KiB
Markdown
# 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.
|