Files
trade-doc/frontent-local-run.md

206 lines
5.7 KiB
Markdown

# Frontend Local Run
Ten dokument opisuje, jak uruchamiać lokalnie `apps/visualizer` i podpiąć go pod backend ze `trade-staging` na `mevnode_bot`.
## Założenia
- pracujesz w repo `/home/user/dev/trade`
- masz dostęp SSH do `user@mevnode_bot`
- chcesz uruchamiać tylko lokalny frontend; backend zostaje na stagingu
## 1. Uruchom tunel SSH
Frontend lokalny używa trzech upstreamów:
- `13081 -> trade-frontend` na `mevnode_bot`
- `18787 -> trade-api` w klastrze `trade-staging`
- `18080 -> hasura` w klastrze `trade-staging`
Najpierw sprawdź aktualny `ClusterIP` dla `trade-api` i `hasura`:
```bash
ssh user@mevnode_bot "kubectl -n trade-staging get svc trade-api hasura -o custom-columns=NAME:.metadata.name,CLUSTER_IP:.spec.clusterIP"
```
Potem uruchom tunel. Wstaw zwrócone adresy zamiast `TRADE_API_CLUSTER_IP` i `HASURA_CLUSTER_IP`:
```bash
ssh -o ExitOnForwardFailure=yes -N \
-L 13081:127.0.0.1:30081 \
-L 18787:TRADE_API_CLUSTER_IP:8787 \
-L 18080:HASURA_CLUSTER_IP:8080 \
user@mevnode_bot
```
Uwagi:
- `13081` obsługuje `/whoami`, `/auth`, `/logout`
- `18787` obsługuje `/api`
- `18080` obsługuje `/graphql` i `/graphql-ws`
- jeśli tunel padnie, lokalny Vite zacznie zwracać `ECONNREFUSED`
- `18080 -> 127.0.0.1:8080` nie zakładaj w ciemno; Hasura nie musi być wystawiona lokalnie na `mevnode_bot`
## 2. Sprawdź lokalną konfigurację visualizera
`apps/visualizer/.env.local` powinno mieć co najmniej:
```env
VITE_DEV_PORT=5174
VITE_API_URL=/api
VITE_HASURA_URL=/graphql
VITE_HASURA_WS_URL=ws://127.0.0.1:18080/v1/graphql
VITE_GRAPHQL_POLL_MS=1000
VITE_SYMBOL=SOL-PERP
VITE_TF=1s
VITE_POLL_MS=1000
VITE_LIMIT=300
API_PROXY_TARGET=http://127.0.0.1:18787
API_PROXY_STRIP_PREFIX=/api
FRONTEND_PROXY_TARGET=http://127.0.0.1:13081
GRAPHQL_PROXY_TARGET=http://127.0.0.1:18080
GRAPHQL_PROXY_PATH=/v1/graphql
```
Ważne:
- `VITE_HASURA_URL` ma zostać ustawione na `/graphql`
- `VITE_HASURA_WS_URL` ma wskazywać bezpośrednio na tunel Hasury `ws://127.0.0.1:18080/v1/graphql`
- nie ustawiaj `VITE_GRAPHQL_POLL_ONLY=1`, jeśli chcesz live `ws` dla orderbooka i stats
- `npm run visualizer:dev` respektuje lokalne `.env.*` i nie powinno już nadpisywać tego adresem z `tokens/hasura.json`
## 3. Uruchom lokalny Vite
Z roota repo:
```bash
cd /home/user/dev/trade
npm install
npm run visualizer:dev
```
Visualiser wystartuje na:
```text
http://localhost:5174/
```
## 4. Zaloguj się
Po wejściu na `http://localhost:5174/` aplikacja powinna pokazać ekran logowania.
Użyj stagingowych danych sesyjnych. W local dev nie polegamy już na `DEV_PROXY_AUTH_USER`.
## 5. Smoke check
Po zalogowaniu sprawdź:
- górny pasek pokazuje użytkownika i przycisk `Wyloguj`
- orderbook ma rekordy dla `SOL-PERP`
- panel DLOB pokazuje `live`
- chart nie pokazuje `Failed to fetch`
## Szybki troubleshooting
### Sprawdź porty
```bash
ss -ltnp | rg ':(5174|13081|18080|18787)\b'
```
### Sprawdź sesję
```bash
curl -i http://localhost:5174/whoami
```
Po zalogowaniu powinno zwrócić `200` i `{"ok":true,"user":"...","mode":"session"}`.
### Sprawdź chart API
```bash
curl -i 'http://localhost:5174/api/v1/chart?symbol=SOL-PERP&tf=1s&limit=5'
```
Jeśli tu jest `ECONNREFUSED`, problem siedzi w tunelu `18787`.
### Sprawdź GraphQL proxy
```bash
curl -i \
-H 'content-type: application/json' \
--data '{"query":"query { dlob_hot_snapshot_latest(limit: 1, where: {market_name: {_eq: \"SOL-PERP\"}}) { market_name } }"}' \
http://localhost:5174/graphql
```
Jeśli przeglądarka próbuje iść do `localhost:8080` zamiast do `localhost:5174/graphql`, to Vite nie wczytał poprawnego `.env.local`. Zrestartuj `npm run visualizer:dev`.
### Objaw: logowanie działa, ale DLOB / L2 pokazuje `Hasura HTTP 500`
Typowy objaw:
- logowanie przez `/auth/login` przechodzi
- `/whoami` zwraca `200`
- w UI pola `DLOB` i `L2` pokazują `Hasura HTTP 500`
- w logu Vite widać `http proxy error: /v1/graphql` oraz `ECONNRESET` albo `ECONNREFUSED`
Najczęstsza przyczyna:
- tunel `18080` jest skierowany na zły remote target
- nie zakładaj, że `mevnode_bot` ma lokalny nasłuch Hasury na `127.0.0.1:8080`
Sprawdź aktualny adres Hasury:
```bash
ssh user@mevnode_bot "kubectl -n trade-staging get svc hasura -o wide"
```
Jeśli `ClusterIP` Hasury to np. `10.43.174.102`, to tunel powinien wyglądać tak:
```bash
ssh -o ExitOnForwardFailure=yes -N \
-L 13081:127.0.0.1:30081 \
-L 18787:TRADE_API_CLUSTER_IP:8787 \
-L 18080:10.43.174.102:8080 \
user@mevnode_bot
```
Szybki test po poprawce:
```bash
curl -i \
-H 'content-type: application/json' \
--data '{"query":"query { __typename }"}' \
http://127.0.0.1:18080/v1/graphql
```
To powinno zwrócić `200 OK` i `{"data":{"__typename":"query_root"}}`.
### Objaw: DLOB działa, ale `Last` / `Oracle` albo chart są puste
To nie musi oznaczać problemu z frontendem.
Najpierw sprawdź live DLOB:
```bash
curl -sS \
-H 'content-type: application/json' \
--data '{"query":"query($market:String!){ dlob_hot_derived_latest(where:{market_name:{_eq:$market},is_indicative:{_eq:false}},limit:1){ market_name mark_price oracle_price best_bid_price best_ask_price updated_at }}","variables":{"market":"SOL-PERP"}}' \
http://localhost:5174/graphql
```
Potem sprawdź chart API:
```bash
curl -i 'http://localhost:5174/api/v1/chart?symbol=SOL-PERP&tf=1s&limit=5'
curl -i 'http://localhost:5174/api/v1/ticks?symbol=SOL-PERP&limit=5'
```
Interpretacja:
- jeśli GraphQL zwraca świeże `updated_at`, ale `/api/v1/chart` zwraca `candles: []`, to problem siedzi w stagingowym API albo danych wejściowych do funkcji świec
- jeśli `/api/v1/ticks` zwraca tylko stare rekordy, staging nie ma świeżych ticków dla chart API
- summary w UI może wtedy żyć z fallbacku DLOB, ale sam wykres dalej będzie pusty, dopóki staging nie zacznie zwracać świec