Docker Architecture
Three containers run on the same isolated bridge network (openclaw_9router_net):
┌──────────────────────────────────────────────────────┐
│ openclaw_9router_net │
│ │
│ ┌──────────┐ ┌──────────┐ │
│ │ openclaw │ │ 9router │ │
│ │ :18789 │ │ :20128 │ │
│ └────┬─────┘ └──────────┘ │
│ │ http://opentrader:8000 │
│ ▼ │
│ ┌────────────────────────────────────┐ │
│ │ opentrader │ │
│ │ ┌─────────────────────────────┐ │ │
│ │ │ uvicorn FastAPI :8000 │ │ │
│ │ └─────────────────────────────┘ │ │
│ └────────────────────────────────────┘ │
└──────────────────────────────────────────────────────┘
OpenClaw agents call the bot via HTTP rather than invoking python3 directly — completely separating the Python runtime from the Node.js container.
Entrypoint
entrypoint.sh (at the repo root, mounted into the image) is the Docker CMD. It starts two processes inside opentrader:
scripts/ops_runner.sh— runs in the background for operational automation tasks.uvicorn app.main:app— runs in the foreground. The container stays alive as long as uvicorn is running.
Scout and finance can call GET /api/market/{symbol} for on-demand multi-timeframe analysis. Cached market snapshots are exposed via GET /api/market/all.