Skip to main content
This is a self-hosting guide. The hosted product at https://www.orcapods.ai needs none of this: sign in and go.

Compose Stack Overview

The root docker-compose.yml is profile-driven: make dev is an alias for make stack.

Full Backend Stack

This starts: The dashboard is not containerized by the stack. Run it separately:

Building Images

For normal local development, prefer:
Compose builds the required images for the selected profile.

MCP Bridge

The standalone mcp-bridge service is the deployment boundary for Composio credentials and traffic. It listens on port 8091 by default, serves GET /healthz, exposes a bearer-gated GET /metrics, and accepts bridge operations only on its signed internal API. Configure it with: The service fails startup when the current signing key is missing, malformed, or too short, when COMPOSIO_SUBJECT_PEPPER is unset, or when REDIS_URL is unset or not a valid redis:///rediss:// URL. There is no in-memory nonce-store fallback. Use docker/railway-mcp-bridge.toml as the Railway deployment reference.

Shared Storage

All compose profiles inherit the same S3-compatible storage environment:
Host access uses http://localhost:8333. The Makefile has storage helpers:

Stack Configuration

The stack profile uses two runners and two conductors:
Both conductors are stateless and can route any session because session IDs include the owning runner hash.

Specialized Poly Topology

Use the poly profile when you want capability-aware routing across runner shapes:
This is useful for testing that the conductor pod routes each profile runtime only to capable runners.

Environment File

Create .env at the repo root for provider keys:
The stack profile also requires these to be set in .env:
CLERK_JWKS_URL is enforced at compose parse time: the conductor services refuse to start without it. CHAT_GATEWAY_SIGNING_KEY_CURRENT and VFS_INTERNAL_SIGNING_KEY_CURRENT are read by the conductor and vfs service for their internal signing planes, and VFS_AUTH_TOKEN gates bearer auth on the vfs service. Docker Compose loads .env automatically.

Health Checks

/healthz returns text ok. The SeaweedFS S3 root may return 403 without credentials; that still means the service is reachable.

Logs

Go services use Zap structured logs. Agent-worker processes write JSON-ish logs from Node.

nginx Configuration

The repository nginx config proxies all traffic to the conductor pod and disables stream buffering:
This keeps /api/runs/{id}/stream, /api/workflows/runs/{id}/stream, and runner NDJSON streams usable through the proxy.

Scaling Notes

To add a runner:
  1. Give it a stable, unique RUNNER_BASE_URL.
  2. Set accurate RUNNER_CAPABILITIES.
  3. Add that same URL to every conductor’s RUNNER_URLS.
Existing sessions stay on their original runner. New sessions are round-robined across runners that advertise the profile runtime.
Last modified on September 6, 2026