# The control plane. Modules are brought up by `agentic-os up ` (each ships its own compose). services: control-plane: build: . command: uvicorn agentic_os.control_plane:app --host 0.0.0.0 --port 8080 ports: ["8080:8080"] environment: - AGENTIC_OS_CONFIG=/app/config.yaml - AGENTIC_OS_HOME=/data # The fleet routes (dispatch, up/down, approvals, jobs, fleet, status) answer 503 until one of these is set (both empty by default). - AGENTIC_OS_CONTROL_TOKEN=${AGENTIC_OS_CONTROL_TOKEN:-} - AGENTIC_OS_API_KEY=${AGENTIC_OS_API_KEY:-} # Optional READ-ONLY dashboard token (at least 24 characters, different from the two above): lets the dashboard page read the fleet, approvals, jobs and status, # and nothing else. Empty by default (the dashboard then needs a fleet credential). - AGENTIC_OS_DASHBOARD_TOKEN=${AGENTIC_OS_DASHBOARD_TOKEN:-} # The grant-store key: external, NO default. Created once by `make permissions-key`; the grants persist in /data. - "PERMISSIONS_KEY=${PERMISSIONS_KEY:?PERMISSIONS_KEY is required - create it once with make permissions-key (or agentic-os permissions key --env-file permissions.env) then run docker compose --env-file permissions.env up}" - PERMISSIONS_DIR=/data/permissions volumes: - ./config.yaml:/app/config.yaml:ro - agentic_os_data:/data # NOTE: do NOT bind-mount /var/run/docker.sock here. Mounting the host # Docker socket grants the container effective root on the host (it can # start privileged containers, mount the host FS, etc.). In dev the Fleet # shells out to `docker compose` on the host directly, so the control # plane container does not need access to the socket. restart: unless-stopped volumes: agentic_os_data: