4.3 KiB
Minimalne API dla bot-executora (k3s) + auth
Ten dokument opisuje minimalny zestaw endpointów i
zasad bezpieczeństwa dla warstwy execution plane
(bot-executor) i control plane (API do
sterowania botami) na VPS (k3s).
Cel: wysyłać transakcje na Drift bez wystawiania publicznie endpointu typu “podpisz i wyślij tx”.
Powiązane:
- Architektura botów:
doc/bots.md - DLOB / statsy na VPS:
doc/dlob-services.md - Topologia:
doc/rpc/README.md
Rozdział odpowiedzialności
bot-executor
(execution plane, private)
- Ma klucze prywatne (tylko tutaj).
- Podpisuje i wysyła transakcje na Drift przez prywatny Solana RPC.
- Czyta “desired state” z DB (
bot_config) i zapisuje audyt (bot_events) + heartbeat (bot_state). - Nie przyjmuje z zewnątrz “raw tx do podpisu”.
Control plane (public/edge, auth)
- Ustawianie
bot_config(mode/target/limity/kill switch). - Odczyt
bot_stateibot_events. - Autoryzacja: tokeny/ACL/WireGuard (zależnie od klienta).
Control plane może być zrobiony na dwa sposoby:
- Hasura GraphQL (z rolami i RLS) — szybkie, ale wymaga dopięcia uprawnień.
trade-apiendpointy (HTTP) — prostsze do “opiniowania” auth (Bearer token scopes).
Model danych (minimum)
Minimalne tabele (wg doc/bots.md):
bot_config: desired state (mode, market, limity, kill_switch, strategia)bot_state: heartbeat + ostatni błąd/akcjabot_events: log audytowy (decision/order/panic/error)
Auth (rekomendacja minimalna)
Warstwy:
- Sieć: tylko przez WireGuard / allowlist IP (najprostsze i skuteczne).
- Aplikacja: tokeny + scopes (np.
Authorization: Bearer ...). - (Opcjonalnie) mTLS/HMAC service-to-service w klastrze, jeśli chcesz twardsze granice.
W tym repo masz już wzorzec tokenów w api_tokens +
walidacja w services/api/server.mjs.
Scopes (propozycja)
bots:read— odczytbot_config/state/eventsbots:write— zmianabot_config(mode/params/kill switch)exec:panic— wymuszenie panic (jeśli zdecydujesz się na osobny endpoint; zwykle wystarczykill_switch=true)
Control plane API (HTTP) — propozycja endpointów
Te endpointy wystawiaj publicznie (za auth), ale niech one tylko zmieniają DB, a nie wysyłają transakcje.
Konfiguracja bota
GET /v1/bots(scope:bots:read)- lista botów (id, name, market, mode, kill_switch, updated_at)
GET /v1/bots/:id(scope:bots:read)- pełny
bot_config
- pełny
POST /v1/bots(scope:bots:write)- tworzy nowy
bot_config
- tworzy nowy
PATCH /v1/bots/:id(scope:bots:write)- aktualizacja (np. limity, target exposure, params)
Kill switch / mode (najczęstsze akcje)
POST /v1/bots/:id/mode(scope:bots:write)- body:
{ "mode": "off" | "observe" | "trade" }
- body:
POST /v1/bots/:id/kill-switch(scope:bots:write)- body:
{ "enabled": true | false } - Executor traktuje
enabled=truejako “panic” i wykonuje runbook (cancel_all+close_position) opisany wdoc/bots.md.
- body:
Status i audyt
GET /v1/bots/:id/state(scope:bots:read)- heartbeat, last_error, last_action_at
GET /v1/bots/:id/events?limit=200(scope:bots:read)- ostatnie eventy (decision/order/panic/error)
bot-executor
API (private) — minimalne endpointy
To API nie musi być wystawione poza klaster.
Wystarczy Service ClusterIP.
GET /healthz— liveness (bez auth)GET /readyz— readiness (bez auth; np. czy jest połączenie z RPC + DB)- (Opcjonalnie)
POST /v1/reconcile— ręczny reconcile (auth tylko wewnętrzny / admin)
Zamiast POST /v1/panic preferuj sterowanie przez DB
(kill_switch=true), bo to daje audyt i działa nawet, gdy
control plane jest odcięty od samego executora.
Deployment w k3s (propozycja)
Deployment/bot-executor:- env: RPC endpoints (po WG), Hasura URL, market list, itp.
- secret: keypair / seed, ewentualnie API tokeny
- zasoby: limity CPU/RAM (żeby executor nie “zjadał” node’a)
Service/bot-executor(ClusterIP)- brak Ingress (domyślnie)
Monitoring:
Prometheusscrape/metrics(jeśli dodasz)
Co z “wysłaniem kontraktu” na Drift?
bot-executorrobi to przez Drift SDK → Solana RPC (sendTransaction).- Control plane nie wysyła tx; tylko ustawia desired state.