Trading SaaS platform
- 9 services in the stack
- 32,926 lines · execution engine
- 115 commits · web platform
- 210,107 rows of market data backfilled
The constraint
One ARM64 host in a single region has to run the whole platform, and it holds other people’s exchange API keys.
The decision
Nothing on that server is changed by hand. Every change goes local → commit → push → server pull, and the production schema is committed to git as the single source of truth.
The evidence
- Deployed as a nine-service Docker Compose stack: postgres, redis, backend, worker, events, beat scheduler, flower, frontend, and the bot itself.
- CI runs on every push and pull request: uv on Python 3.11 with ruff, mypy and pytest, and separately pnpm on Node 20 for lint, typecheck and a production build.
- Secrets live in AWS SSM Parameter Store, and user exchange keys are sealed with AES-256-GCM under AWS KMS.
- Carried out a SOC 2 and ISO 27001 gap assessment, with a public security page describing the result.
- Python
- FastAPI
- Next.js
- TypeScript
- Celery
- PostgreSQL
- TimescaleDB
- Redis
- Docker Compose
- Oracle Cloud (Ampere ARM64)
- SSM Parameter Store
- AWS KMS
- nginx
- Cloudflare (DNS, strict TLS, Email Routing)
- GitHub Actions