Files
trade-frontend/doc/k3s-runtime-map.md
2026-02-01 21:44:45 +01:00

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

# k3s runtime map (VPS `qstack`) — co działa i po co
Ten dokument opisuje **aktualny runtime na VPS** (k3s) dla projektu `trade`: jakie komponenty działają w klastrze, jak płynie dane oraz które tabele/metrki są “źródłem prawdy” dla UI.
Zakładamy namespace: `trade-staging`.
## TL;DR (logika)
- **Dane są zbierane i liczone na backendzie** (k3s).
- UI (`trade-frontend`) **tylko wizualizuje** i proxyuje ruch (API + GraphQL + WS).
- Hasura to **jedyny GraphQL/WS** na “metrics/live” (subscriptions).
- Postgres/Timescale trzyma:
- ticki (`drift_ticks`) + candles (funkcja `get_drift_candles`)
- “latest” warstw DLOB (`dlob_*_latest`)
- (opcjonalnie) historię warstw (`dlob_*_ts`)
## Mapa (ruch z zewnątrz)
```
Internet
|
v
Ingress/Traefik
|
+--> trade-frontend (https://trade.mpabi.pl)
| - /api -> trade-api
| - /graphql -> hasura
| - /graphql-ws -> hasura (WS subscriptions; protokół graphql-ws)
|
+--> (opcjonalnie inne ingressy w tym samym klastrze)
```
### `trade-frontend` (UI + reverse-proxy)
- **Rola:** UI + proxy do usług w klastrze.
- **Dlaczego:** przeglądarka nie dostaje sekretów; token read jest wstrzykiwany serverside, a WS działa przez proxy.
- **Wejście:** HTTP/WS od użytkownika.
- **Wyjście:**
- `/api/*``trade-api`
- `/graphql` (HTTP) → `hasura`
- `/graphql-ws` (WS) → `hasura`
## Mapa (dane rynkowe — ticki / candles)
```
Solana RPC/WS (zewn.)
|
v
trade-ingestor
|
v
trade-api -> Postgres/Timescale (drift_ticks)
|
+--> /v1/chart (candles + wskaźniki liczone na backendzie)
|
v
Hasura (GraphQL query/subscriptions dla wybranych tabel)
```
### `trade-ingestor`
- **Rola:** pobiera dane (oracle/mark) i wysyła ticki do API.
- **Wyjście:** ticki zapisane do `drift_ticks` przez `trade-api`.
### `trade-api`
- **Rola:** API dla UI i algów (healthz, ticks, chart).
- **DB:** zapis do `drift_ticks`.
- **Agregacje:** candles (`get_drift_candles`) + wskaźniki (backend).
## Mapa (DLOB — orderbook + metryki warstw)
```
Solana RPC/WS (zewn.)
|
v
dlob-publisher ----> dlob-redis <---- dlob-server (/l2, /l3)
\
\ (opcjonalne źródło L2)
v
dlob-worker (kolektor L2)
|
v
Postgres/Hasura: dlob_l2_latest + dlob_stats_latest
|
+------------+------------+
| |
v v
dlob-depth-worker dlob-slippage-worker
(bands ±bps) (impact vs size USD)
| |
v v
Postgres/Hasura: dlob_depth_bps_latest Postgres/Hasura: dlob_slippage_latest
|
v
(opcjonalnie) dlob-ts-archiver
|
v
Postgres/Timescale: dlob_stats_ts / dlob_depth_bps_ts / dlob_slippage_ts
```
### `dlob-publisher`
- **Rola:** utrzymuje “żywy” DLOB (onchain) i publikuje snapshoty do Redis.
- **Wejście:** Solana RPC/WS.
- **Wyjście:** publikacja do `dlob-redis`.
### `dlob-redis`
- **Rola:** cache/pubsub pomiędzy publisherem i serwerem HTTP.
### `dlob-server`
- **Rola:** serwuje REST `/l2` i `/l3` na podstawie cache Redis (do debugowania i/lub jako źródło L2).
### `dlob-worker` (kolektor L2 + “basic stats”)
- **Rola:** pobiera snapshoty L2 i liczy podstawowe metryki (`dlob_stats_latest`).
- **Źródło L2:** w praktyce:
- albo zewnętrzne `https://dlob.drift.trade/l2`
- albo wewnętrzne `http://dlob-server:6969/l2` (jeśli tak ustawione)
- **Zapis do tabel:**
- `dlob_l2_latest` (raw L2)
- `dlob_stats_latest` (bid/ask/mid/spread/depth/imbalance)
### `dlob-depth-worker` (depth bands ±bps)
- **Rola:** liczy płynność w pasmach ±bps wokół mid.
- **Źródło:** `dlob_l2_latest`
- **Zapis:** `dlob_depth_bps_latest` (klucz: `market_name + band_bps`)
### `dlob-slippage-worker` (slippage vs size)
- **Rola:** symuluje market fill po L2 dla zadanych rozmiarów (USD) i liczy `impact_bps`.
- **Źródło:** `dlob_l2_latest`
- **Zapis:** `dlob_slippage_latest` (klucz: `market_name + side + size_usd`)
### `dlob-ts-archiver` (historia warstw)
- **Rola:** zapisuje “timeline” dla warstw do hypertabli Timescale (historia pod UI).
- **Źródło:** `dlob_stats_latest`, `dlob_depth_bps_latest`, `dlob_slippage_latest`
- **Zapis:** `dlob_stats_ts`, `dlob_depth_bps_ts`, `dlob_slippage_ts`
- **Retencja (startowo):** ~7 dni (policy w Timescale).
## Co UI realnie czyta (dla “nowych funkcji”)
- live/subscriptions:
- `dlob_stats_latest`
- `dlob_depth_bps_latest`
- `dlob_slippage_latest`
- (jeśli dołączymy w UI wykres “historia”):
- `dlob_stats_ts`
- `dlob_depth_bps_ts`
- `dlob_slippage_ts`
## Najczęstsze miejsca problemów (diagnostyka)
- Jeśli UI nie pokazuje warstw:
- sprawdź czy Hasura trackuje tabele i ma `public select` (bootstrap job),
- sprawdź, czy workery odświeżają `updated_at` w `dlob_*_latest`.
- Jeśli `dlob-worker` loguje 503:
- to zwykle problem na ścieżce `DLOB_HTTP_URL` (upstream/LB/IPv6) — wtedy przełącz na `http://dlob-server:6969`.
- Jeśli WS subscriptions nie łączą:
- sprawdź proxy `/graphql-ws` w `trade-frontend` i origin/CORS w Hasurze.