services:
  processd-sandbox-manager:
    image: ghcr.io/daimon-hq/processd-sandbox-manager:latest
    init: true
    cgroup: host
    cap_drop:
      - ALL
    cap_add:
      - SYS_ADMIN
      - SETUID
      - SETGID
      - SETFCAP
      - DAC_OVERRIDE
    security_opt:
      - seccomp=unconfined
      - apparmor=unconfined
      - systempaths=unconfined
    mem_limit: 8g
    cpus: 4
    pids_limit: 4096
    extra_hosts:
      - "host.docker.internal:host-gateway"
    # Uncomment network_mode below and remove the ports section to use host networking.
    # This bypasses Docker NAT, making sandbox MCP endpoints directly reachable via
    # the host's LAN IP without setting PROCESSD_MANAGER_PUBLIC_MCP_HOST.
    # Requires Docker host networking support (Linux only, not available on Docker Desktop for macOS).
    # network_mode: host
    ports:
      - "18080:18080"
      - "19000-19999:19000-19999"
    volumes:
      - type: bind
        source: /sys/fs/cgroup
        target: /sys/fs/cgroup
        read_only: false
      - processd-manager-runtime:/tmp/processd-manager/runtime
      - processd-manager-workspaces:/tmp/processd-manager/workspaces
    environment:
      PROCESSD_MANAGER_HOST: "${PROCESSD_MANAGER_HOST:-0.0.0.0}"
      PROCESSD_MANAGER_PORT: "${PROCESSD_MANAGER_PORT:-18080}"
      PROCESSD_MANAGER_RUNTIME_DIR: "${PROCESSD_MANAGER_RUNTIME_DIR:-/tmp/processd-manager/runtime}"
      PROCESSD_MANAGER_WORKSPACE_ROOT: "${PROCESSD_MANAGER_WORKSPACE_ROOT:-/tmp/processd-manager/workspaces}"
      PROCESSD_MANAGER_NSJAIL_BIN: "${PROCESSD_MANAGER_NSJAIL_BIN:-/usr/local/bin/nsjail}"
      PROCESSD_MANAGER_PROCESSD_BIN: "${PROCESSD_MANAGER_PROCESSD_BIN:-/usr/local/bin/processd-mcp}"
      PROCESSD_MANAGER_PORT_START: "${PROCESSD_MANAGER_PORT_START:-19000}"
      PROCESSD_MANAGER_PORT_END: "${PROCESSD_MANAGER_PORT_END:-19999}"
      PROCESSD_MANAGER_SANDBOX_MCP_HOST: "${PROCESSD_MANAGER_SANDBOX_MCP_HOST:-0.0.0.0}"
      PROCESSD_MANAGER_PUBLIC_MCP_HOST: "${PROCESSD_MANAGER_PUBLIC_MCP_HOST:-127.0.0.1}"
      PROCESSD_MANAGER_LIMITS_MODE: "${PROCESSD_MANAGER_LIMITS_MODE:-required}"
      PROCESSD_MANAGER_RLIMIT_NOFILE: "${PROCESSD_MANAGER_RLIMIT_NOFILE:-4096}"
      PROCESSD_MANAGER_RLIMIT_NPROC: "${PROCESSD_MANAGER_RLIMIT_NPROC:-256}"
      PROCESSD_MANAGER_RLIMIT_FSIZE_MB: "${PROCESSD_MANAGER_RLIMIT_FSIZE_MB:-2048}"
      PROCESSD_MANAGER_RLIMIT_CORE_MB: "${PROCESSD_MANAGER_RLIMIT_CORE_MB:-0}"
      PROCESSD_MANAGER_RLIMIT_STACK_MB: "${PROCESSD_MANAGER_RLIMIT_STACK_MB:-64}"
      PROCESSD_MANAGER_RLIMIT_AS_MB: "${PROCESSD_MANAGER_RLIMIT_AS_MB:-0}"
      PROCESSD_MANAGER_RLIMIT_CPU_SEC: "${PROCESSD_MANAGER_RLIMIT_CPU_SEC:-0}"
      PROCESSD_MANAGER_CGROUP_MEMORY_MAX_BYTES: "${PROCESSD_MANAGER_CGROUP_MEMORY_MAX_BYTES:-2147483648}"
      PROCESSD_MANAGER_CGROUP_SWAP_MAX_BYTES: "${PROCESSD_MANAGER_CGROUP_SWAP_MAX_BYTES:-0}"
      PROCESSD_MANAGER_CGROUP_PIDS_MAX: "${PROCESSD_MANAGER_CGROUP_PIDS_MAX:-256}"
      PROCESSD_MANAGER_CGROUP_CPU_MS_PER_SEC: "${PROCESSD_MANAGER_CGROUP_CPU_MS_PER_SEC:-1000}"
      PROCESSD_MANAGER_CGROUPV2_MOUNT: "${PROCESSD_MANAGER_CGROUPV2_MOUNT:-/sys/fs/cgroup}"
      PROCESSD_MANAGER_CGROUP_PARENT: "${PROCESSD_MANAGER_CGROUP_PARENT:-NSJAIL}"
      PROCESSD_MANAGER_ADMISSION_MODE: "${PROCESSD_MANAGER_ADMISSION_MODE:-resource}"
      PROCESSD_MANAGER_RESERVE_MEMORY_BYTES: "${PROCESSD_MANAGER_RESERVE_MEMORY_BYTES:-536870912}"
      PROCESSD_MANAGER_RESERVE_PIDS: "${PROCESSD_MANAGER_RESERVE_PIDS:-128}"
      PROCESSD_MANAGER_RESERVE_CPU_MS_PER_SEC: "${PROCESSD_MANAGER_RESERVE_CPU_MS_PER_SEC:-500}"
      PROCESSD_MANAGER_SANDBOX_REQUEST_MEMORY_BYTES: "${PROCESSD_MANAGER_SANDBOX_REQUEST_MEMORY_BYTES:-}"
      PROCESSD_MANAGER_SANDBOX_REQUEST_PIDS: "${PROCESSD_MANAGER_SANDBOX_REQUEST_PIDS:-}"
      PROCESSD_MANAGER_SANDBOX_REQUEST_CPU_MS_PER_SEC: "${PROCESSD_MANAGER_SANDBOX_REQUEST_CPU_MS_PER_SEC:-}"
      PROCESSD_MANAGER_SANDBOX_TTL_SECONDS: "${PROCESSD_MANAGER_SANDBOX_TTL_SECONDS:-3600}"
      PROCESSD_MANAGER_REAPER_INTERVAL_SECONDS: "${PROCESSD_MANAGER_REAPER_INTERVAL_SECONDS:-60}"
      PROCESSD_MANAGER_SHM_SIZE_MB: "${PROCESSD_MANAGER_SHM_SIZE_MB:-64}"
      MCP_DEFAULT_SHELL: "${MCP_DEFAULT_SHELL:-/bin/bash}"

volumes:
  processd-manager-runtime:
  processd-manager-workspaces:
