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. 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 pool routes each profile runtime only to capable runners.

Environment File

Create .env at the repo root for provider keys:
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. Sidecars write JSON-ish process logs from Node.

nginx Configuration

The repository nginx config proxies all traffic to the conductor pool 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.