docker-compose.edge.yml 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. name: dataops-enterprise-edge
  2. services:
  3. edge-gateway:
  4. build:
  5. context: ../..
  6. dockerfile: deploy/edge/Dockerfile.edge
  7. image: "${EDGE_IMAGE:-dataops-edge:local}"
  8. pull_policy: "${EDGE_PULL_POLICY:-build}"
  9. command: ["python", "-m", "app.edge_gateway"]
  10. user: "${EDGE_RUNTIME_UID:?}:${EDGE_RUNTIME_GID:?}"
  11. read_only: true
  12. cap_drop:
  13. - ALL
  14. security_opt:
  15. - no-new-privileges:true
  16. pids_limit: 128
  17. mem_limit: 1g
  18. cpus: "1.0"
  19. restart: unless-stopped
  20. init: true
  21. stop_grace_period: 30s
  22. environment:
  23. EDGE_CONFIG_PATH: "${EDGE_CONFIG_PATH:-/run/edge/config/edge.json}"
  24. EDGE_CREDENTIAL_FILE: /run/edge/secrets/control-credential
  25. EDGE_CLIENT_CERTIFICATE_PATH: /run/edge/certificates/client.pem
  26. EDGE_CLIENT_PRIVATE_KEY_PATH: "${EDGE_CLIENT_PRIVATE_KEY_PATH:-/run/edge/secrets/client.key}"
  27. EDGE_CA_BUNDLE_PATH: /run/edge/certificates/ca.pem
  28. EDGE_SERVER_CRL_PATH: "${EDGE_SERVER_CRL_PATH:-/run/edge/certificates/control-plane-server.crl.pem}"
  29. EDGE_HEALTH_PATH: "${EDGE_HEALTH_PATH:-/run/edge/tmp/health.json}"
  30. EDGE_RELEASE_SIGNING_KEYS_PATH: /run/edge/signing/release-public-keys.json
  31. EDGE_TASK_SIGNING_KEYS_PATH: /run/edge/signing/task-public-keys.json
  32. EDGE_CONTROL_ORIGIN: "${EDGE_CONTROL_ORIGIN:?exact https control origin required}"
  33. EDGE_PROXY_ORIGIN: "${EDGE_PROXY_ORIGIN:-}"
  34. EDGE_ALLOWED_CONTROL_HOSTS: "${EDGE_ALLOWED_CONTROL_HOSTS:?exact control hosts required}"
  35. EDGE_ALLOWED_PROXY_HOSTS: "${EDGE_ALLOWED_PROXY_HOSTS:-}"
  36. EDGE_LOG_LEVEL: "${EDGE_LOG_LEVEL:-INFO}"
  37. EDGE_LOG_MAX_BYTES: "${EDGE_LOG_MAX_BYTES:-10485760}"
  38. EDGE_LOG_BACKUP_COUNT: "${EDGE_LOG_BACKUP_COUNT:-3}"
  39. EDGE_POLL_INTERVAL_SECONDS: "${EDGE_POLL_INTERVAL_SECONDS:-5}"
  40. volumes:
  41. - "${EDGE_CONFIG_DIR:?}:/run/edge/config:ro"
  42. - "${EDGE_QUEUE_DIR:?}:/var/lib/dataops-edge/queue:rw"
  43. - "${EDGE_ARTIFACT_DIR:?}:/var/lib/dataops-edge/artifacts:rw"
  44. - "${EDGE_RELEASE_DIR:?}:/var/lib/dataops-edge/releases:rw"
  45. - "${EDGE_SECRET_DIR:?}:/run/edge/secrets:ro"
  46. - "${EDGE_CERTIFICATE_DIR:?}:/run/edge/certificates:ro"
  47. - "${EDGE_SIGNING_KEY_DIR:?}:/run/edge/signing:ro"
  48. tmpfs:
  49. - /tmp:rw,noexec,nosuid,nodev,size=64m,mode=1777
  50. - /run/edge/tmp:rw,noexec,nosuid,nodev,size=16m,mode=0700,uid=${EDGE_RUNTIME_UID:?},gid=${EDGE_RUNTIME_GID:?}
  51. healthcheck:
  52. test: ["CMD", "python", "-m", "app.edge_gateway.healthcheck"]
  53. interval: 30s
  54. timeout: 5s
  55. retries: 3
  56. start_period: 20s
  57. logging:
  58. driver: json-file
  59. options:
  60. max-size: "10m"
  61. max-file: "3"
  62. networks:
  63. - edge-egress
  64. networks:
  65. edge-egress:
  66. driver: bridge
  67. internal: false
  68. labels:
  69. dataops.network-contract: "outbound-only; enforce exact egress destinations outside Compose"