services:
  processd-sandbox-manager:
    image: ghcr.io/daimon-hq/processd-sandbox-manager:latest
    init: true
    cap_drop:
      - ALL
    cap_add:
      - SYS_ADMIN
      - SETUID
      - SETGID
      - SETFCAP
      - CHOWN
      - FOWNER
      - DAC_READ_SEARCH
      - KILL
      - SYS_PTRACE
    devices:
      - "/dev/net/tun:/dev/net/tun"
    security_opt:
      - seccomp=unconfined
      - apparmor=unconfined
      - systempaths=unconfined
    mem_limit: 8g
    cpus: 4
    pids_limit: 4096
    # Manager process soft nofile defaults to 1024 under Docker. Egress proxy
    # holds 2 FDs per tunnel (client+upstream); a single busy sandbox can hit
    # the ceiling and return EMFILE on accept. Raise for the manager itself
    # (sandbox nsjail rlimit_nofile is a separate PROCESSD_MANAGER_RLIMIT_*).
    ulimits:
      nofile:
        soft: 65536
        hard: 65536
    extra_hosts:
      - "host.docker.internal:host-gateway"
    ports:
      - "18080:18080"
    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:-65535}"
      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_PUBLIC_BASE_URL: "${PROCESSD_MANAGER_PUBLIC_BASE_URL:-http://127.0.0.1:18080}"
      PROCESSD_MANAGER_SANDBOX_NET_BASE: "${PROCESSD_MANAGER_SANDBOX_NET_BASE:-10.255.0.0}"
      PROCESSD_MANAGER_SANDBOX_NET_PREFIX: "${PROCESSD_MANAGER_SANDBOX_NET_PREFIX:-16}"
      PROCESSD_MANAGER_SERVICE_PORTS: "${PROCESSD_MANAGER_SERVICE_PORTS:-3000-3009}"
      PROCESSD_MANAGER_LIMITS_MODE: "${PROCESSD_MANAGER_LIMITS_MODE:-best_effort}"
      PROCESSD_MANAGER_RLIMIT_NOFILE: "${PROCESSD_MANAGER_RLIMIT_NOFILE:-65536}"
      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:-1073741824}"
      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:-256}"
      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_CAPACITY_MEMORY_BYTES: "${PROCESSD_MANAGER_CAPACITY_MEMORY_BYTES:-}"
      PROCESSD_MANAGER_CAPACITY_PIDS: "${PROCESSD_MANAGER_CAPACITY_PIDS:-}"
      PROCESSD_MANAGER_CAPACITY_CPU_MS_PER_SEC: "${PROCESSD_MANAGER_CAPACITY_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}"
      PROCESSD_MANAGER_SANDBOX_UID_ENABLED: "${PROCESSD_MANAGER_SANDBOX_UID_ENABLED:-true}"
      PROCESSD_MANAGER_SANDBOX_UID_BASE: "${PROCESSD_MANAGER_SANDBOX_UID_BASE:-100000}"
      PROCESSD_MANAGER_SANDBOX_UID_COUNT: "${PROCESSD_MANAGER_SANDBOX_UID_COUNT:-65536}"
      MCP_DEFAULT_SHELL: "${MCP_DEFAULT_SHELL:-/bin/bash}"
