9.4 KiB
Workflow: init bazy + app stack + ingest przez API (tokeny + basic auth)
Docelowy podział na 3 compose’y:
devops/db/docker-compose.yml→ Postgres/TimescaleDB + Hasura + pgAdmin (DB stack)devops/tools/bootstrap/docker-compose.yml→ one-shot tools (init SQL + Hasura metadata)devops/app/docker-compose.yml→ API + frontend (+ opcjonalny ingestor) (app stack)
TL;DR (local, end-to-end)
npm install- DB:
docker compose -f devops/db/docker-compose.yml up -d - Schema/metadata:
docker compose -f devops/tools/bootstrap/docker-compose.yml run --rm db-init+docker compose -f devops/tools/bootstrap/docker-compose.yml run --rm hasura-bootstrap - Tokeny: skopiuj
tokens/*.example.json→tokens/*.json+ ustaw RPC wtokens/heliusN.json(albo po prostucp tokens/helius.json tokens/heliusN.json) - API:
docker compose -f devops/app/docker-compose.yml up -d api+curl -sS http://localhost:8787/healthz - Tokeny (revocable):
npm run token:api -- --scopes write --out tokens/alg.json+npm run token:api -- --scopes read --out tokens/read.json - Frontend:
docker compose -f devops/app/docker-compose.yml up -d frontend - Ingestor:
docker compose -f devops/app/docker-compose.yml --profile ingest up -d - DLOB worker (Hasura stats/subscriptions):
docker compose -f devops/app/docker-compose.yml --profile dlob up -d dlob-worker
Uwaga: ceny w drift_ticks są NUMERIC
(Hasura zwykle zwraca/oczekuje stringów dla numeric);
trade-api normalizuje je do number w
/v1/chart.
DLOB worker (Drift DLOB → Hasura) + GraphQL subscriptions
Cel: UI dostaje “global stats” (best bid/ask/spread/depth) przez GraphQL + WS (Hasura subscriptions), bez wystawiania sekretów do przeglądarki.
- Worker:
dlob-workerpobiera snapshoty orderbooka zhttps://dlob.drift.trade/l2i upsertuje do Hasury. - Tabele:
dlob_l2_latest(raw L2 snapshot)dlob_stats_latest(wyliczone statystyki)
- UI: subskrybuje
dlob_stats_latestpo/graphql(proxy wtrade-frontendobsługuje też WS upgrade).
Start lokalnie:
docker compose -f devops/app/docker-compose.yml --profile dlob up -d --build dlob-workerOpcjonalne env:
DLOB_MARKETS=PUMP-PERP,SOL-PERP,BONK-PERP,BTC-PERP,ETH-PERPDLOB_POLL_MS=500DLOB_DEPTH=10
Uwaga: UI nie potrzebuje sekretów Hasury, bo w
devops/db/docker-compose.yml jest
HASURA_GRAPHQL_UNAUTHORIZED_ROLE=public, a
hasura-bootstrap nadaje roli public tylko
select na tabelach DLOB.
Migracja (bez kasowania danych)
Szybka sekwencja do migracji schematu + odpalenia stacka (bez
down -v) jest w r1.txt.
Wersjonowanie API/UI (v2, v3...) bez ruszania DB/Hasury
Cel: uruchamiasz nową wersję api+frontend(+ingestor)
równolegle, na nowych tabelach, na nowych
portach, a potem robisz cutover ingestora.
Konwencja:
- v1: tabela
drift_ticks, funkcjaget_drift_candles, porty8787/8081 - vN: tabela
drift_ticks_vN, funkcjaget_drift_candles_vN, porty8787+(N-1)i8081+(N-1) - wspólne: Postgres/Hasura/pgAdmin +
api_tokens(tokeny) zostają bez wersjonowania
Skrypty: scripts/ops/ (tworzą też env w
devops/versions/vN.env)
bash scripts/ops/version-init.sh 2migracja DB + createdrift_ticks_v2+ track w Hasurzebash scripts/ops/version-up.sh 2startapi+frontendv2 (host:8788/8082)bash scripts/ops/version-ingestor-up.sh 2start ingestor v2 (pisze do v2 API →drift_ticks_v2)bash scripts/ops/version-cutover.sh 1 2start v2 ingestor, potem stop v1 ingestorbash scripts/ops/version-backfill.sh 1 2backfill ALL:drift_ticks→drift_ticks_v2bash scripts/ops/version-down.sh 1usuń stare kontenery v1 (DB bez zmian)bash scripts/ops/version-check.sh 2healthz/ticks/chart dla v2
Reset (UWAGA: kasuje dane z bazy)
Jeśli uruchomisz
docker compose -f devops/db/docker-compose.yml down -v,
Postgres/Timescale traci cały wolumen (czyli rekordy z
drift_ticks).
Dane logowania (dev)
- Postgres:
postgres://admin:pass@localhost:5432/crypto - Hasura:
http://localhost:8080(admin secret:tokens/hasura.json→adminSecret) - pgAdmin:
http://localhost:5050(login:admin@example.com, hasło:admin) - Frontend UI:
http://localhost:8081(basic auth:tokens/frontend.json→username/password)
0) Start DB stack
Z root repo:
docker compose -f devops/db/docker-compose.yml up -dTen krok tworzy wspólną sieć Dockera trade-net, przez
którą app stack łączy się do Hasury.
1) Init / upgrade schematu bazy (idempotent)
Użyj zwłaszcza, jeśli masz istniejący wolumen Postgresa:
docker compose -f devops/tools/bootstrap/docker-compose.yml run --rm db-initTo jest też krok, który trzeba odpalić po zmianach w
devops/db/initdb/001_init.sql (np. migracja
DOUBLE PRECISION → NUMERIC).
2) Hasura metadata bootstrap (track tabel + permissions)
docker compose -f devops/tools/bootstrap/docker-compose.yml run --rm hasura-bootstrap3) Skonfiguruj API + frontend
Utwórz lokalne pliki (gitignored) w tokens/:
tokens/hasura.jsonztokens/hasura.example.json(URL + admin secret dla Hasury, używane przeztrade-api)tokens/api.jsonztokens/api.example.json(sekret admina do tworzenia/revoke tokenów API)tokens/frontend.jsonztokens/frontend.example.json(basic auth do UI)tokens/heliusN.json(RPC dla Drift; alboheliusApiKey, albo pełnyrpcUrl)
Jeśli odpalasz lokalne skrypty (npm run token:*,
npm run ingest:*) wykonaj też:
npm install4) Start API (trade-api)
docker compose -f devops/app/docker-compose.yml up -d api- API:
http://localhost:8787
Healthcheck:
curl -sS http://localhost:8787/healthz5) Wygeneruj tokeny (revocable)
Write token dla ingestora (domyślnie zapisuje do
tokens/alg.json):
npm run token:api -- --name algo1 --scopes write --out tokens/alg.jsonJeśli wcześniej uruchomiłeś frontend bez pliku
tokens/read.json, Docker mógł utworzyć katalog
tokens/read.json. Usuń go przed generacją tokena:
rm -rf tokens/read.jsonRead token dla frontendu (proxy wstrzykuje go serwerowo; nie trafia do JS):
npm run token:api -- --name reader-ui --scopes read --out tokens/read.json6) Start frontend (UI)
docker compose -f devops/app/docker-compose.yml up -d frontend- Frontend:
http://localhost:8081(basic auth)
Dev mode (Vite + proxy /api z tokenem z
tokens/read.json):
npm run visualizer:dev- Dev UI:
http://localhost:5173
7) Uruchom kontener ingestora, który wysyła ticki do API
W ramach app stack (profil ingest):
docker compose -f devops/app/docker-compose.yml --profile ingest up -dAlternatywnie (bez Dockera) możesz odpalić ingest lokalnie:
npm run ingest:oracle -- --ingest-via api --market-name PUMP-PERP --interval-ms 1000 --source drift_oracleWymaga: tokens/heliusN.json (RPC) +
tokens/alg.json (write token do API) + działającego
trade-api.
Override (przykład):
MARKET_NAME=PUMP-PERP INTERVAL_MS=250 SOURCE=drift_oracle \
docker compose -f devops/app/docker-compose.yml --profile ingest up -d8) Sprawdź, czy rekordy wpadają
Przez API (wymaga read tokena):
curl -sS "http://localhost:8787/v1/ticks?symbol=PUMP-PERP&limit=5" \
-H "Authorization: Bearer $(node -p 'require("./tokens/read.json").token')"W UI: http://localhost:8081 → wykres powinien się
aktualizować.
Sprawdź agregacje + wskaźniki (candles + indicators z backendu):
curl -sS "http://localhost:8787/v1/chart?symbol=PUMP-PERP&tf=1m&limit=120" \
-H "Authorization: Bearer $(node -p 'require("./tokens/read.json").token')"Checklist (copy/paste)
npm installzainstaluj zależności donpm run token:*/npm run ingest:*cp tokens/hasura.example.json tokens/hasura.jsonskopiuj konfigurację Hasurycp tokens/api.example.json tokens/api.jsonskopiuj konfigurację API (adminSecret)cp tokens/frontend.example.json tokens/frontend.jsonskopiuj basic auth do UIcp tokens/helius.json tokens/heliusN.jsonustaw RPC dla Drift (fallback jest teżtokens/helius.json)docker compose -f devops/db/docker-compose.yml up -duruchom Postgres/Timescale + Hasura + pgAdmindocker compose -f devops/tools/bootstrap/docker-compose.yml run --rm db-initzastosuj schemat PG (tabele/indeksy/hypertable)docker compose -f devops/tools/bootstrap/docker-compose.yml run --rm hasura-bootstraptrack tabel + permissions w Hasurzedocker compose -f devops/app/docker-compose.yml up -d apiuruchom APIcurl -sS http://localhost:8787/healthzsprawdź czy API działanpm run token:api -- --name algo1 --scopes write --out tokens/alg.jsonwygeneruj write token dla ingestoranpm run token:api -- --name reader-ui --scopes read --out tokens/read.jsonwygeneruj read token dla UI/curldocker compose -f devops/app/docker-compose.yml up -d frontenduruchom frontenddocker compose -f devops/app/docker-compose.yml --profile ingest up -duruchom ingestora (Drift → API → DB)curl -sS "http://localhost:8787/v1/ticks?symbol=PUMP-PERP&limit=5" -H "Authorization: Bearer $(node -p 'require("./tokens/read.json").token')"sprawdź czy ticki wpadającurl -sS "http://localhost:8787/v1/chart?symbol=PUMP-PERP&tf=1m&limit=120" -H "Authorization: Bearer $(node -p 'require("./tokens/read.json").token')"sprawdź candles + wskaźniki z backendu