Docker Compose
Bring up the full MPCKit stack on a single host with docker compose.
The repo ships a docker-compose.yml that boots backend, dashboard,
docs, postgres, redis, and the gas station. Right for evaluation,
single-box prod, and local development that mirrors production.
In 5 minutes
git clone https://github.com/dwallet-labs/mpckit
cd mpckit
cp .env.example .env
# Fill in HOT_WALLET_SUI_SECRET_HEX, BILLING_DEPOSIT_MASTER_SEED_HEX,
# SUI_GAS_STATION_SPONSOR_KEYPAIR_B64, MPCKITCORE_TESTNET_* (or _MAINNET_*),
# ADMIN_API_KEY, BETTER_AUTH_SECRET at minimum.
docker compose up -d
curl http://localhost:3000/v1/health
open http://localhost:3011 # dashboard
open http://localhost:3010 # docsThe compose file brings up:
postgres:16-alpinefor accounts, audit log, billing, presign pool.redis:7-alpinefor locks, idempotency, rate limits.gas-stationbuilt frominfra/gas-station/Dockerfile, exposing:9527(HTTP) and:9184(Prometheus).backendrunning both the HTTP server and the pg-boss worker (PROCESS_TYPE=both).dashboardon:3011.docson:3010.
All host ports bind to 127.0.0.1 by default; front the box with a
reverse proxy (Caddy, nginx, your cloud LB) that terminates TLS and
proxies to the published ports.
Required configuration
The minimum env block to boot a working testnet stack:
IKA_NETWORK=testnet
HOT_WALLET_SUI_SECRET_HEX=<ed25519 secret hex of the protocol signer>
# Output of `bun run apps/backend/scripts/deploy.ts` for the network.
MPCKITCORE_TESTNET_PACKAGE_ID=0x…
MPCKITCORE_TESTNET_ADMIN_CAP_ID=0x…
MPCKITCORE_TESTNET_OPERATOR_CAP_ID=0x…
MPCKITCORE_TESTNET_TREASURY_ID=0x…
# Gas station sponsor (separate from the protocol signer).
SUI_GAS_STATION_AUTH=<long random string>
SUI_GAS_STATION_SPONSOR_KEYPAIR_B64=<flag||privkey base64>
SUI_GAS_STATION_FULLNODE_URL=https://fullnode.testnet.sui.io:443
# Billing.
BILLING_DEPOSIT_MASTER_SEED_HEX=<32 bytes hex; derives per-user deposit addresses>
BILLING_SWEEP_DESTINATION_ADDRESS=0x… # where swept deposits land
# Bootstrap admin + dashboard auth.
ADMIN_API_KEY=<long random string>
BETTER_AUTH_SECRET=<long random string>See Configuration for the full reference.
Upgrades
git pull
docker compose pull # if you're pinning published images
docker compose up -d --buildThe backend container runs Drizzle migrations on boot; idempotent on re-runs.
Switching networks
docker-compose.yml reads IKA_NETWORK from .env and the matching
MPCKITCORE_<NETWORK>_* env block. To run both networks on one box
side-by-side, copy the compose file and override the project name +
ports:
# testnet stack
docker compose -p mpckit-testnet up -d
# mainnet stack with a second .env file + different ports
COMPOSE_PROJECT_NAME=mpckit-mainnet docker compose --env-file .env.mainnet up -dFor real production, run on Kubernetes instead — see Kubernetes.