# Build Enterprise.Dockerfile and replace the image with its reviewed digest.
# Initialize ./policy, ./identity and ./secrets using enterprise-setup.md first.
services:
  gateway:
    image: REPLACE_WITH_REVIEWED_IMAGE_AT_SHA256_DIGEST
    user: '10001:10001'
    read_only: true
    cap_drop: [ALL]
    security_opt: [no-new-privileges:true]
    mem_limit: 3g
    cpus: 2
    pids_limit: 128
    stop_grace_period: 150s
    tmpfs: ['/tmp:rw,noexec,nosuid,size=256m,mode=1777']
    environment:
      GUARD_POLICY_FILE: /policy/policy.json
      GUARD_DIRECTORY_FILE: /identity/directory.json
      GUARD_TLS_KEY_FILE: /secrets/tls-key.pem
      GUARD_TLS_CERT_FILE: /secrets/tls-cert.pem
      GUARD_CLIENT_CA_FILE: /secrets/client-ca.pem
      GUARD_AUDIT_KEY_FILE: /secrets/audit-private.pem
      GUARD_AUDIT_FILE: /audit/events.jsonl
      OPENAI_KEY_FILE: /secrets/openai.key
      ANTHROPIC_KEY_FILE: /secrets/anthropic.key
      GEMINI_KEY_FILE: /secrets/gemini.key
    volumes:
      - ./policy:/policy:ro
      - ./identity:/identity:ro
      - ./gateway-secrets:/secrets:ro
      - ./request-audit:/audit
      - inspection_socket:/inspection:ro
    depends_on:
      inspection:
        condition: service_healthy
    networks: [protected_workloads, provider_egress]
  inspection:
    image: REPLACE_WITH_REVIEWED_IMAGE_AT_SHA256_DIGEST
    command: [node, inspection-service.mjs]
    user: '10002:10001'
    network_mode: none
    read_only: true
    cap_drop: [ALL]
    security_opt: [no-new-privileges:true]
    mem_limit: 3g
    cpus: 2
    pids_limit: 128
    stop_grace_period: 150s
    tmpfs: ['/tmp:rw,noexec,nosuid,size=256m,mode=1777']
    environment:
      GUARD_INSPECTION_SOCKET: /inspection/extractor.sock
    volumes:
      - inspection_socket:/inspection
      - ./models:/models:ro
    healthcheck:
      test: [CMD, node, -e, "require('http').get({socketPath:'/inspection/extractor.sock',path:'/healthz'},r=>process.exit(r.statusCode===200?0:1)).on('error',()=>process.exit(1))"]
      interval: 10s
      timeout: 3s
      retries: 3
  administration:
    image: REPLACE_WITH_REVIEWED_IMAGE_AT_SHA256_DIGEST
    command: [node, governance.mjs]
    user: '10001:10001'
    read_only: true
    cap_drop: [ALL]
    security_opt: [no-new-privileges:true]
    mem_limit: 512m
    cpus: 1
    pids_limit: 64
    tmpfs: ['/tmp:rw,noexec,nosuid,size=16m,mode=1777']
    ports: ['127.0.0.1:8444:8444']
    environment:
      GUARD_ADMIN_BIND: 0.0.0.0
      GUARD_POLICY_FILE: /policy/policy.json
      GUARD_DIRECTORY_FILE: /identity/directory.json
      GUARD_ADMINISTRATORS_FILE: /secrets/administrators.json
      GUARD_OIDC_CONFIG_FILE: /secrets/oidc-config.json
      GUARD_SCIM_CREDENTIAL_FILE: /secrets/scim-credential.json
      GUARD_ADMIN_TLS_KEY_FILE: /secrets/tls-key.pem
      GUARD_ADMIN_TLS_CERT_FILE: /secrets/tls-cert.pem
      GUARD_ADMIN_CA_FILE: /secrets/admin-ca.pem
      GUARD_ADMIN_AUDIT_KEY_FILE: /secrets/admin-audit-private.pem
      GUARD_ADMIN_AUDIT_FILE: /admin-audit/events.jsonl
      GUARD_AUDIT_FILE: /request-audit/events.jsonl
      GUARD_AUDIT_PUBLIC_KEY_FILE: /secrets/audit-public.pem
    volumes:
      - ./policy:/policy
      - ./identity:/identity
      - ./admin-secrets:/secrets:ro
      - ./admin-audit:/admin-audit
      - ./request-audit:/request-audit:ro
    networks: [identity_egress]
networks:
  protected_workloads:
    internal: true
  provider_egress: {}
  identity_egress: {}

volumes:
  inspection_socket: {}
