95 lines
3.5 KiB
Markdown
95 lines
3.5 KiB
Markdown
# TODO przed zakupem bare metal (RPC+Geyser) — żeby dzień 0 poszedł gładko
|
||
|
||
Cel: zanim kupisz bare metal, dopinamy wszystko, co nie wymaga własnego RPC, żeby po zakupie:
|
||
- tylko postawić RPC+Geyser wg runbooka,
|
||
- przepiąć endpointy w k3s i zrobić rollout,
|
||
- zweryfikować stabilność feedu i gotowość do live.
|
||
|
||
---
|
||
|
||
## A) Decyzje i parametry (bez kodu, ale blokują implementację)
|
||
|
||
- [ ] **Docelowe porty i adresacja WireGuard**:
|
||
- WG subnet (np. `10.8.0.0/24`), IP bare metal i IP k3s/VPS
|
||
- port WG (np. `51820/udp`)
|
||
- private bind dla: RPC `8899`, WS `8900`, gRPC `10000`
|
||
- [ ] **Polityka dostępu**:
|
||
- allowlist IP do SSH
|
||
- czy gRPC wymaga auth/token dla klientów
|
||
- [ ] **Retencja danych (start)**:
|
||
- TS: 7 dni “gęsto” (np. 1–5s) + czy robimy downsample 1m na dłużej
|
||
- [ ] **Model intent**:
|
||
- potwierdzone: offset (ticks/bps) + desired-state (jest w `doc/drift-perp-contract.md`)
|
||
- [ ] **Ryzyko (hard caps)**:
|
||
- max position USD, max reprices/min, max slippage/spread, freshness
|
||
|
||
---
|
||
|
||
## B) Dane i historia (żeby warstwy działały live+history)
|
||
|
||
- [ ] **DLOB TS tables**: `dlob_stats_ts`, `dlob_depth_bps_ts`, `dlob_slippage_ts`
|
||
- indeksy `(market_name, ts)` i retencja 7 dni
|
||
- [ ] **Archiver/collector**:
|
||
- worker, który zapisuje TS (z `*_latest` do `*_ts`), albo rozszerzenie istniejących workerów
|
||
- [ ] **Downsample (opcjonalnie, ale pro)**:
|
||
- continuous aggregates (Timescale) lub job 1m/5m
|
||
- [ ] **Hasura bootstrap**:
|
||
- track tabel TS + uprawnienia `select` (public) dla UI history
|
||
|
||
---
|
||
|
||
## C) Kontrakty bota i audyt (must-have przed live)
|
||
|
||
- [ ] **Schema**:
|
||
- `bot_contracts` (desired-state + status)
|
||
- `bot_events` (audit log)
|
||
- mapowanie: `decision_id`, `client_order_id`, `drift_order_id`, `tx_sig`
|
||
- [ ] **Observe-only executor** (k3s):
|
||
- buduje features i zapisuje `decision` do `bot_events`, bez składania tx
|
||
- [ ] **Reconcile logic (no trade yet)**:
|
||
- start → odczyt observed state z Drift → porównanie do DB → log “diff”
|
||
- [ ] **Kill-switch w executorze**:
|
||
- env var + DB flag + safety triggers (feed stale, RPC lag)
|
||
|
||
---
|
||
|
||
## D) Vast (GPU tylko na kilka godzin) — przygotowanie pod ephemeral training
|
||
|
||
- [ ] **Dataset export** (z k3s/DB):
|
||
- jeden plik `parquet/jsonl.zst` + `dataset_version` (hash)
|
||
- minimalny “train split / eval split”
|
||
- [ ] **Training entrypoint** (jedna komenda):
|
||
- skrypt/komenda, która: download dataset → train → eval → export
|
||
- [ ] **Artifact upload**:
|
||
- preferowane: scp na VPS/k3s albo Gitea Packages
|
||
- wersjonowanie: `model_version` + `dataset_version`
|
||
- [ ] **Predictor contract test**:
|
||
- walidator JSON schema `trade_intent`
|
||
- test: “intent TTL expired” + “gates fail” + “panic”
|
||
|
||
---
|
||
|
||
## E) UI (warstwy + live/history, bez liczenia w JS)
|
||
|
||
- [ ] **Tryb Live/History**:
|
||
- Live: subscriptions na `*_latest`
|
||
- History: query na `*_ts` + timeframe `tf`
|
||
- [ ] **Warstwy/Panele z `doc/stats.md`**:
|
||
- mapowanie 1:1 na tabele (brak obliczeń w UI)
|
||
- [ ] **Podgląd kontraktów**:
|
||
- panel “Contracts” z `bot_contracts` + “Event timeline” z `bot_events`
|
||
|
||
---
|
||
|
||
## F) Operacje (żeby bare metal nie stał się snowflake)
|
||
|
||
- [ ] **Sekrety i endpointy**:
|
||
- w k3s: secret `trade-dlob-rpc` / analogiczny na nowy endpoint (WG)
|
||
- fallback endpoint (np. public provider) jako opcjonalny drugi URL
|
||
- [ ] **Monitoring/alerty na k3s**:
|
||
- freshness DLOB/ticks, error rate workerów, restart loops
|
||
- [ ] **Checklist “Day 0”**:
|
||
- przejście krok po kroku wg `doc/solana-rpc-geyser-setup.md`
|
||
- smoke test: `dlob-publisher` bez reconnect storm
|
||
|