Skip to main content

Configuration

This page is a guided map of what the Enterprise binary lets you tune. For the OIDC and Temporal blocks, see the dedicated pages.

Profile and configuration file

The backend loads its YAML config:

VariablePurpose
CONFIG_FILEAbsolute path to a config file.

Precedence is environment variable → YAML value → built-in default. So any field documented below as having an environment-variable name can be overridden at runtime without touching the YAML file.

REST API

The HTTP server that serves both the REST API and (optionally) the metrics endpoint.

VariableDefaultPurpose
REST_API_PORT8080Public API listen port.
REST_API_CONTEXT/URL prefix. Set to e.g. /api/v1 when sitting behind a path-based reverse proxy.
REST_READ_TIMEOUT30sHTTP request read timeout.
REST_WRITE_TIMEOUT60sHTTP response write timeout. Streaming endpoints (NDJSON exports) are bounded by this.
REST_IDLE_TIMEOUT120sKeep-alive idle connection timeout.
REST_MAX_HEADER_BYTES1 MiBMax request header size.
REST_MAX_BODY_BYTES5 MiBMax request body size. Raise if you deploy large BPMN/DMN XML uploads.
REST_ALLOWED_CORS_ORIGINS-Comma-separated CORS origin allowlist. Set to your SPA origin(s) in production. Wildcard is not supported.
REST_ALLOWED_WS_ORIGINS-Comma-separated WebSocket origin allowlist (used by the FEEL editor's LSP).
REST_METRICS_PORT9464Prometheus /metrics endpoint port. Separate HTTP server from the API.
REST_METRICS_ADDRempty (all interfaces)Bind address for the metrics server. Set to 127.0.0.1 to keep telemetry off ingress, or firewall the port.

Database

Connection settings for PostgreSQL. Internal schema migrations run automatically on every startup — there is no separate migration step.

VariableDefaultPurpose
DB_HOSTlocalhostPostgreSQL hostname.
DB_PORT5432PostgreSQL port.
DB_USER-PostgreSQL user.
DB_PASSWORD-PostgreSQL password.
DB_NAME-Database name.
DB_SSLMODEdisabledisable, require, verify-ca, or verify-full.
DB_MAX_CONNS50pgxpool max connections. Raise for high BPMN concurrency.
DB_MIN_CONNS5pgxpool min connections kept warm.

OIDC

See Authentication for the full picture. The five tunable variables are OIDC_ISSUER, OIDC_CLIENT_ID, OIDC_AUDIENCES, OIDC_ROLES_CLAIM, OIDC_PROJECTS_CLAIM.

Temporal

See Temporal setup. The Temporal block has a deep tail of connection, TLS, and tuning knobs — TEMPORAL_HOST_PORT, TEMPORAL_API_KEY[_FILE], the TEMPORAL_TLS_* family, the TEMPORAL_CONN_* family, and TEMPORAL_CAN_* for long-running workflows.

Caching

Two independent caches.

Access cache — caches the project-UUID → PostgreSQL schema-name lookup so request routing doesn't hit projects.schema_name on every call. Role and membership are read from the JWT every request and are not cached.

VariableDefaultPurpose
ACCESS_CACHE_MAX_SIZE100Max cache entries. Bump above your project count to eliminate cold-miss lookups.
ACCESS_CACHE_TTL30sCache entry time-to-live. Pure performance knob — see Operations → Access cache.

Compiled DMN cache — caches compiled decision tables so evaluation doesn't re-parse them on every call.

VariableDefaultPurpose
COMPILED_CACHE_MAX_SIZE100Max compiled tables held in memory. The cache is per-replica, expect cold misses after deploys or replica rotation.

FEEL evaluation budgets

Caps on what a single FEEL expression can do. They protect against pathological or hostile input, defaults are unreachable for normal expressions.

VariableDefaultPurpose
FEEL_MAX_DEPTH256Max recursion depth in evaluation. 0 disables the cap.
FEEL_MAX_ITERATIONS1000000Max combined iterations across all for / some / every loops in one evaluation. 0 disables the cap.
FEEL_DEFAULT_TIMEOUT5sWall-clock timeout. Enforced via context cancellation. 0 disables the default.

BPMN engine

The operator-facing subset of the BPMN configuration. A worker here means a Temporal worker (workflow + activity poller pair) running against one tenant's namespace.

VariableDefaultPurpose
BPMN_MAX_CALL_ACTIVITY_DEPTH64Max recursion depth for callActivity chains.
BPMN_DEFAULT_WORKERS1Default number of Temporal workers per project.
BPMN_TIMER_POLLER_INTERVAL30sHow often the engine checks for due timer events.
BPMN_INSTANCE_RECONCILER_INTERVAL30mHow often the reconciler scans for drift between PostgreSQL state and Temporal.

Per-tenant worker counts can be overridden in YAML:

bpmnWorkers:
defaultWorkers: 1
overrides:
"<project-uuid>": 4

Observability

VariableDefaultPurpose
ENABLE_OTELfalseEnable Prometheus metrics export on REST_METRICS_PORT. See Operations → Observability for what's actually exported.

Advanced tuning

  • BPMN worker concurrencyBPMN_MAX_CONCURRENT_ACTIVITY_TASK_POLLERS, BPMN_MAX_CONCURRENT_WORKFLOW_TASK_POLLERS, BPMN_MAX_CONCURRENT_ACTIVITY_EXECUTION_SIZE, BPMN_MAX_CONCURRENT_WORKFLOW_TASK_EXECUTION_SIZE. Defaults are computed from worker count, override if you're tuning a worker for unusual load shapes.
  • External job lease tuningBPMN_LEASE_DURATION, BPMN_LEASE_REFILL_PER_WAITER, BPMN_LEASE_REFILL_MAX_BATCH, BPMN_LEASE_POLL_WAKE_BUFFER, BPMN_LEASE_BATCH_HOLD, BPMN_LEASE_BATCH_SAFETY_MARGIN. These control how external jobs are leased to workers, defaults are tuned for typical workloads.
  • Temporal connection tuning — see Temporal.

If you find yourself wanting to tune these, talk to support@quantumbpm.com — we'd rather understand the workload and give you a recipe than have you guess.