Skip to content

Docker Compose Quickstart

Deploy the complete Everruns platform using Docker Compose. This guide sets up the control plane, workers, UI, and database in a single command.

  • Docker Engine 20.10+
  • Docker Compose v2.0+
  • 4GB available RAM
Terminal window
# Create directory and download docker-compose file
mkdir everruns && cd everruns
curl -o docker-compose.yaml https://raw.githubusercontent.com/everruns/everruns/main/examples/docker-compose-full.yaml

Everruns encrypts LLM API keys at rest. Generate a key:

Terminal window
python3 -c "import os, base64; print('kek-v1:' + base64.b64encode(os.urandom(32)).decode())"

Create a .env file with your encryption key and optional LLM API keys:

.env
SECRETS_ENCRYPTION_KEY=kek-v1:<your-generated-key>
# Optional: Add API keys here to skip UI configuration
DEFAULT_OPENAI_API_KEY=sk-...
DEFAULT_ANTHROPIC_API_KEY=sk-ant-...
Terminal window
docker compose pull # Fetch latest images
docker compose up -d

This starts:

  • PostgreSQL database
  • Control plane API
  • 3 worker instances
  • Next.js UI
  • Caddy reverse proxy
  • Jaeger tracing
ServiceURL
Web UIhttp://localhost:8080
Swagger API Docshttp://localhost:8080/swagger-ui/
Health Checkhttp://localhost:8080/health
Jaeger Tracinghttp://localhost:16686

If you didn’t set DEFAULT_OPENAI_API_KEY or DEFAULT_ANTHROPIC_API_KEY in your .env file, configure via UI:

  1. Open http://localhost:8080
  2. Navigate to Settings > Providers
  3. Add your OpenAI or Anthropic API key
  4. Save and verify connection
  1. Go to Agents in the UI
  2. Click Create Agent
  3. Set a name and system prompt
  4. Select your configured LLM provider
  5. Save the agent
Terminal window
# Create a session (agent_id in request body)
curl -X POST http://localhost:8080/api/v1/sessions \
-H "Content-Type: application/json" \
-d '{"agent_id": "{agent_id}"}'
# Send a message
curl -X POST http://localhost:8080/api/v1/sessions/{session_id}/messages \
-H "Content-Type: application/json" \
-d '{"message": {"role": "user", "content": [{"type": "text", "text": "Hello!"}]}}'

Add more workers by scaling the worker services:

Terminal window
# Scale to 5 workers
docker compose up -d --scale worker-1=1 --scale worker-2=1 --scale worker-3=3

Or modify docker-compose.yaml to add more worker services.

Terminal window
# All services
docker compose logs -f
# Specific service
docker compose logs -f api
docker compose logs -f worker-1

Jaeger UI is available at http://localhost:16686 for viewing request traces across services.

Terminal window
# Stop all services
docker compose down
# Stop and remove volumes (deletes data)
docker compose down -v

If services fail to connect to PostgreSQL:

Terminal window
# Check postgres health
docker compose ps postgres
# View postgres logs
docker compose logs postgres

Migrations are auto-applied when the API server starts. If migrations fail:

Terminal window
# Check API logs for migration errors
docker compose logs api
# Restart API to retry migrations
docker compose restart api

To check migration status before deployment:

Terminal window
docker compose exec api everruns-admin migrate-info

Verify workers can reach the control plane:

Terminal window
# Check worker logs
docker compose logs worker-1
# Verify gRPC connection
docker compose exec worker-1 /bin/sh -c "echo" || echo "Cannot exec (distroless image)"