docs: add rpc/dlob/candles notes

This commit is contained in:
u1
2026-02-01 21:17:58 +01:00
parent 89415f6793
commit b06fe7f9a4
15 changed files with 2077 additions and 0 deletions

165
doc/k3s-runtime-map.md Normal file
View File

@@ -0,0 +1,165 @@
# 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.