3.9 KiB
Docker Deployment
Docker Compose stack for running the full turnstone platform or the simulator.
Quick Start
# Copy and edit environment config
cp .env.example .env
# Full stack (needs an LLM API on the host)
docker compose up
# Simulator only (no LLM needed)
docker compose --profile sim up redis console sim
Console dashboard: http://localhost:8090
Services
| Service | Port | Profile | Description |
|---|---|---|---|
redis |
6379 | default | Message broker, pub/sub, node registry |
server |
8080 | default | Web UI + chat workstreams + LLM |
bridge |
— | default | Redis-to-HTTP bridge (multi-node routing) |
console |
8090 | default | Cluster dashboard |
sim |
— | sim | Multi-node cluster simulator |
Profiles
Default (no flag) — starts redis, server, bridge, console. Requires an OpenAI-compatible LLM API running on the host (default: http://localhost:8000/v1).
docker compose up
Sim — adds the simulator. Can run alongside the full stack or standalone with just Redis and the console:
# Sim + console (no LLM needed)
docker compose --profile sim up redis console sim
# Everything including sim
docker compose --profile sim up
Configuration
All configuration is via environment variables in .env (copy from .env.example):
LLM Backend
| Variable | Default | Description |
|---|---|---|
LLM_BASE_URL |
http://host.docker.internal:8000/v1 |
OpenAI-compatible API URL |
OPENAI_API_KEY |
dummy |
API key (dummy for local servers) |
TAVILY_API_KEY |
— | Web search API key (optional) |
Redis
| Variable | Default | Description |
|---|---|---|
REDIS_PASSWORD |
— | Redis auth password (empty = no auth) |
REDIS_PORT |
6379 |
Host port mapping |
Server
| Variable | Default | Description |
|---|---|---|
SERVER_PORT |
8080 |
Host port mapping |
SKIP_PERMISSIONS |
— | Set to any value to auto-approve all tools |
Console
| Variable | Default | Description |
|---|---|---|
CONSOLE_PORT |
8090 |
Host port mapping |
CONSOLE_POLL_INTERVAL |
10 |
Node polling interval (seconds) |
Auth
| Variable | Default | Description |
|---|---|---|
TURNSTONE_AUTH_ENABLED |
— | Set to 1 to require Bearer token auth |
TURNSTONE_AUTH_TOKEN |
— | Shared auth token for server/bridge/console |
Simulator
| Variable | Default | Description |
|---|---|---|
SIM_NODES |
100 |
Number of simulated nodes |
SIM_SCENARIO |
steady |
Scenario: steady, burst, node_failure, directed, lifecycle |
SIM_DURATION |
60 |
Duration in seconds |
SIM_MPS |
5.0 |
Messages per second (steady scenario) |
SIM_LOG_LEVEL |
INFO |
Log verbosity |
SIM_SEED |
— | Random seed for reproducibility |
SIM_METRICS_FILE |
— | Write JSON report to file |
Scaling
Scale to multiple server/bridge pairs:
docker compose up --scale server=3 --scale bridge=3
Each bridge auto-generates a unique node ID from its container hostname. When scaling server, remove the host port mapping (or use a reverse proxy) to avoid port conflicts.
Volumes
| Volume | Mount | Purpose |
|---|---|---|
redis-data |
/data |
Redis persistence |
turnstone-data |
/data |
SQLite database (.turnstone.db) |
Building
The image uses a multi-stage Dockerfile:
# Build all services
docker compose build
# Rebuild without cache
docker compose build --no-cache
All five entry points are installed in a single image: turnstone-server, turnstone-bridge, turnstone-console, turnstone-sim, turnstone-eval.
Cleanup
# Stop and remove containers
docker compose down
# Stop, remove containers and volumes
docker compose down -v