5.7 KiB
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-frontendnamevnode_bot18787 -> trade-apiw klastrzetrade-staging18080 -> hasuraw klastrzetrade-staging
Najpierw sprawdź aktualny ClusterIP dla
trade-api i hasura:
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:
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_botUwagi:
13081obsługuje/whoami,/auth,/logout18787obsługuje/api18080obsługuje/graphqli/graphql-ws- jeśli tunel padnie, lokalny Vite zacznie zwracać
ECONNREFUSED 18080 -> 127.0.0.1:8080nie zakładaj w ciemno; Hasura nie musi być wystawiona lokalnie namevnode_bot
2. Sprawdź lokalną konfigurację visualizera
apps/visualizer/.env.local powinno mieć co najmniej:
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_URLma zostać ustawione na/graphqlVITE_HASURA_WS_URLma wskazywać bezpośrednio na tunel Hasuryws://127.0.0.1:18080/v1/graphql- nie ustawiaj
VITE_GRAPHQL_POLL_ONLY=1, jeśli chcesz livewsdla orderbooka i stats npm run visualizer:devrespektuje lokalne.env.*i nie powinno już nadpisywać tego adresem ztokens/hasura.json
3. Uruchom lokalny Vite
Z roota repo:
cd /home/user/dev/trade
npm install
npm run visualizer:devVisualiser wystartuje na:
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
ss -ltnp | rg ':(5174|13081|18080|18787)\b'Sprawdź sesję
curl -i http://localhost:5174/whoamiPo zalogowaniu powinno zwrócić 200 i
{"ok":true,"user":"...","mode":"session"}.
Sprawdź chart API
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
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/graphqlJeś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/loginprzechodzi /whoamizwraca200- w UI pola
DLOBiL2pokazująHasura HTTP 500 - w logu Vite widać
http proxy error: /v1/graphqlorazECONNRESETalboECONNREFUSED
Najczęstsza przyczyna:
- tunel
18080jest skierowany na zły remote target - nie zakładaj, że
mevnode_botma lokalny nasłuch Hasury na127.0.0.1:8080
Sprawdź aktualny adres Hasury:
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:
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_botSzybki test po poprawce:
curl -i \
-H 'content-type: application/json' \
--data '{"query":"query { __typename }"}' \
http://127.0.0.1:18080/v1/graphqlTo 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:
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/graphqlPotem sprawdź chart API:
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/chartzwracacandles: [], to problem siedzi w stagingowym API albo danych wejściowych do funkcji świec - jeśli
/api/v1/tickszwraca 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