# ────────────────────────────────────────────────────────────────────── # OmniRoute — Docker Compose # ────────────────────────────────────────────────────────────────────── # # Profiles: # base → minimal image, no CLI tools # cli → CLIs installed inside the container (portable) # host → runner-base + host-mounted CLI binaries (Linux-first) # cliproxyapi → CLIProxyAPI sidecar on port 8317 # # Usage: # docker compose --profile base up -d # docker compose --profile cli up -d # docker compose --profile host up -d # docker compose --profile cliproxyapi up -d # docker compose --profile cli --profile cliproxyapi up -d # # Before first run, copy .env.example → .env and edit your secrets. # ────────────────────────────────────────────────────────────────────── x-common: &common restart: unless-stopped stop_grace_period: 40s env_file: .env environment: - DATA_DIR=/app/data # Must match the volume mount below - PORT=${PORT:-20128} - DASHBOARD_PORT=${DASHBOARD_PORT:-${PORT:-20128}} - API_PORT=${API_PORT:-20129} - API_HOST=${API_HOST:-0.0.0.0} volumes: - ./data:/app/data healthcheck: test: ["CMD", "node", "healthcheck.mjs"] interval: 30s timeout: 5s retries: 3 start_period: 15s services: # ── Profile: base (minimal, no CLI tools) ────────────────────────── omniroute-base: <<: *common container_name: omniroute build: context: . target: runner-base image: omniroute:base ports: - "${DASHBOARD_PORT:-${PORT:-20128}}:${DASHBOARD_PORT:-${PORT:-20128}}" - "${API_PORT:-20129}:${API_PORT:-20129}" profiles: - base # ── Profile: cli (CLIs installed inside container) ───────────────── omniroute-cli: <<: *common container_name: omniroute build: context: . target: runner-cli image: omniroute:cli ports: - "${DASHBOARD_PORT:-${PORT:-20128}}:${DASHBOARD_PORT:-${PORT:-20128}}" - "${API_PORT:-20129}:${API_PORT:-20129}" volumes: - ./data:/app/data - /var/run/docker.sock:/var/run/docker.sock - /usr/libexec/docker/cli-plugins:/usr/libexec/docker/cli-plugins:ro - ${AUTO_UPDATE_HOST_REPO_DIR:-.}:/workspace/omniroute:rw profiles: - cli # ── Profile: host (host-mounted CLI binaries, Linux-first) ──────── omniroute-host: <<: *common container_name: omniroute build: context: . target: runner-base image: omniroute:base ports: - "${DASHBOARD_PORT:-${PORT:-20128}}:${DASHBOARD_PORT:-${PORT:-20128}}" - "${API_PORT:-20129}:${API_PORT:-20129}" environment: - DATA_DIR=/app/data - PORT=${PORT:-20128} - DASHBOARD_PORT=${DASHBOARD_PORT:-${PORT:-20128}} - API_PORT=${API_PORT:-20129} - API_HOST=${API_HOST:-0.0.0.0} - CLI_MODE=host - CLI_EXTRA_PATHS=/host-local/bin:/host-node/bin - CLI_CONFIG_HOME=/host-home - CLI_ALLOW_CONFIG_WRITES=true # Uncomment per-tool overrides as needed: # - CLI_CURSOR_BIN=agent # - CLI_CLINE_BIN=cline # - CLI_CONTINUE_BIN=cn volumes: - ./data:/app/data # ── Host binary mounts (read-only) ── # Adjust paths below to match YOUR host system. - ~/.local/bin:/host-local/bin:ro # Node global binaries (adjust node version path) # - ~/.nvm/versions/node/v24.14.1/bin:/host-node/bin:ro # ── Host config mounts (read-write) ── - ~/.codex:/host-home/.codex:rw - ~/.claude:/host-home/.claude:rw - ~/.factory:/host-home/.factory:rw - ~/.openclaw:/host-home/.openclaw:rw - ~/.cursor:/host-home/.cursor:rw - ~/.config/cursor:/host-home/.config/cursor:rw profiles: - host # ── Profile: cliproxyapi (CLIProxyAPI as sidecar) ───────────────── cliproxyapi: container_name: cliproxyapi image: ghcr.io/router-for-me/cliproxyapi:v6.9.7 restart: unless-stopped ports: - "${CLIPROXYAPI_PORT:-8317}:${CLIPROXYAPI_PORT:-8317}" volumes: - cliproxyapi-data:/root/.cli-proxy-api environment: - PORT=${CLIPROXYAPI_PORT:-8317} - HOST=0.0.0.0 healthcheck: test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:${CLIPROXYAPI_PORT:-8317}/v1/models"] interval: 30s timeout: 5s retries: 3 start_period: 10s profiles: - cliproxyapi volumes: cliproxyapi-data: name: cliproxyapi-data