Message Ops

Message Ops does not use a single customer YAML configuration file. Infrastructure supplies process environment variables and secret references; the application stores environments, broker credentials, users, roles, sign-in policy, SSO providers, telemetry settings and retention settings in PostgreSQL through the UI/API.

Set NODE_ENV=production explicitly. Only development and test relax runtime hardening; an unset value defaults to development. Startup settings require a restart/redeployment. Saved application settings apply according to their reload or session rules. Configuration Examples shows the production origin and secret mapping.

Required production secrets

Required production secrets
VariableConsumersRequirement
DATABASE_URLAPI, WorkerNonempty PostgreSQL URL using the restricted runtime login and certificate-verified TLS.
DATABASE_URLMigration jobSeparate privileged owner connection; never inject this into runtime apps.
SSO_SECRET_ENCRYPTION_KEY_BASE64API, WorkerEach comma-separated encryption key decodes to exactly 32 bytes. Same ordered list on both services. Also protects telemetry credentials.
CREDENTIAL_SECRET_ENCRYPTION_KEY_BASE64API, WorkerExactly 32 bytes per key; same list on both. Protects broker passwords.
MFA_TOTP_SECRET_ENCRYPTION_KEY_BASE64APIExactly 32 bytes per encryption key.
COMPLIANCE_SIGNING_KEY_BASE64APIGenerate 32 bytes. Signing requires at least 32 decoded bytes; boot checks presence, not minimum signing length. Only the first entry signs and verifies.
DATABASE_SSL_CA_BASE64Database clients, including operator jobsOptional base64 PEM for a private database CA.

These secret variables accept a <NAME>_FILE alternative pointing to a readable UTF-8 secret mount. Direct and file forms together are an error. File contents are trimmed at both ends; empty database input fails outside development/test. API-only keys are not Worker requirements. Bootstrap/migration need the database credential and applicable database trust, not all API encryption keys.

Use versionless Key Vault references in Azure, with application and migration identities restricted to their own secrets. Encryption keys are not interchangeable with signing keys. Follow Security and Secret Rotation before changing any key.

Network and authentication

Network and authentication
VariableCode defaultProduction use
API_PORT / HOST3000 / 0.0.0.0Reference Azure API target is 3000.
API_UPSTREAMSupplied by deploymentWeb uses the internal API ingress FQDN without scheme or :3000.
AUTH_MODEoidcKeep oidc; local is development header authentication and is rejected in production. Password sign-in is controlled in Admin.
WEB_BASE_URLhttp://localhost:5173Set the public HTTPS browser origin.
CORS_ALLOWED_ORIGINShttp://localhost:5173Explicit comma-separated allowed origins; do not leave the development fallback.
CSRF_PROTECTION_ENABLEDtrueKeep enabled for cookie-authenticated changes.
SSO_CALLBACK_BASE_URLhttp://localhost:3000/api/v1/auth/sso/callbackSet the full same-origin HTTPS callback registered at the IdP.
SSO_SESSION_STATE_TTL_SECONDS600Positive state/nonce/PKCE lifetime.
SSO_JIT_PROVISIONING_ENABLEDfalseEnable only with deliberate provider and access policy.
MFA_TOTP_ISSUER / WEBAUTHN_RP_NAMEParticle Horizon | Message OperationsUser-visible authenticator/passkey labels.
WEBAUTHN_RP_IDlocalhostSet the browser hostname.
WEBAUTHN_ORIGINOrigin of WEB_BASE_URLSet the exact HTTPS origin when needed.
TRUST_PROXYfalseReference Azure deployment sets true; keep the API internal.
TRUST_PROXY_HOPS1Reference Azure path sets 3: Web ingress, Web nginx, API ingress.
TRUST_PROXY_CIDRSLoopback and private-network rangesNarrow to actual trusted proxy subnets. Invalid or empty entries prevent startup.
DATABASE_SSL_REJECT_UNAUTHORIZEDtrueKeep certificate verification enabled.
ALLOW_INSECURE_DATABASEfalseKeep false for the supported TLS database deployment.
NODE_EXTRA_CA_CERTSUnsetOptional mounted PEM extending Node HTTPS trust; set on both services when required.
RATE_LIMIT_WINDOW_MS / RATE_LIMIT_MAX60000 / 300Global HTTP throttle window and request budget.

The default trusted proxy ranges are 127.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, ::1/128, fc00::/7 and fe80::/10. Client-IP resolution stops at the first untrusted hop or the hop limit. Validate the live path before relying on service-account IP allowlists.

Production database clients reject insecure URL transport settings and apply an explicit TLS policy. URL ssl* and uselibpqcompat options are removed before connection; use the database CA setting above rather than relying on a URL sslrootcert file. Do not disable verification to fix a missing CA.

LOCAL_AUTH_ENABLED is a compatibility setting and does not control current password sign-in. OIDC_ISSUER_URL and OIDC_AUDIENCE configure the legacy direct bearer validation path, not multi-provider SSO. Configure browser providers through Admin.

Sessions and MFA

Sessions and MFA
VariableDefaultMeaning
MFA_PRE_AUTH_TTL_SECONDS300Pre-authentication challenge lifetime.
MFA_STEP_UP_TTL_SECONDS600Absolute recent-MFA window.
MFA_MAX_ATTEMPTS5MFA attempt budget.
LOGIN_MAX_ATTEMPTS10Password failure/in-flight budget; integer 1–1,000.
LOGIN_ATTEMPT_WINDOW_SECONDS900Fixed password budget window; integer 1–3,600.
SESSION_IDLE_TIMEOUT_SECONDS900Regular session idle limit.
SESSION_ABSOLUTE_TIMEOUT_SECONDS7200Regular session absolute limit.
ADMIN_SESSION_IDLE_TIMEOUT_SECONDS600Administrator idle limit.
ADMIN_SESSION_ABSOLUTE_TIMEOUT_SECONDS3600Administrator absolute limit.
SESSION_IDLE_WRITE_INTERVAL_SECONDS60Throttles persisted idle-deadline updates; sessions may expire slightly earlier.

Broker and message controls

Configure endpoints, VPN and broker passwords through Manage Environments, not static broker environment variables. Set shared controls consistently on API and Worker.

Broker and message controls
VariableDefaultMeaning
SOLACE_ADAPTERmockSet real on both API and Worker for production brokers.
SOLACE_CONNECT_TIMEOUT_MS10000Broker session connection timeout.
SOLACE_CONNECT_RETRIES0Broker connection retries.
SOLACE_BROWSE_TIMEOUT_MS60000Bounded queue browse time.
SOLACE_PUBLISH_ACK_TIMEOUT_MS10000Guaranteed publish acknowledgement wait; timeout is an uncertain outcome.
SOLACE_DISCONNECT_TIMEOUT_MS5000Bounded disconnect wait before disposal.
SOLACE_MAX_PAYLOAD_BYTES5242880Per-message payload size bound.
MESSAGE_SEARCH_DEFAULT_MAX_SCAN100000Default browse depth; hard ceiling 500,000.
MESSAGE_PAYLOAD_LOOKUP_MAX_SCAN100000Browse depth when finding a selected payload again.
MESSAGE_REF_TTL_SECONDS3600New reference lifetime; use the same value on API and Worker.
MAX_BULK_MESSAGES500Positive bulk selection bound, including criteria/schedules.
DISABLE_DELETE_OPERATIONSfalseBlocks deletes and moves.
DISABLE_MOVE_OPERATIONSfalseBlocks moves.
REQUIRE_CHANGE_REF_FOR_DELETE / REQUIRE_CHANGE_REF_FOR_MOVEParsed as trueIneffective compatibility entries in v1.7.1; changing them does not disable the production change-reference requirement.
PAYLOAD_MASKING_DISABLED_CATEGORIESEmptyComma-separated masking categories to disable; keep empty unless reviewed for your data.

With NODE_ENV=production, direct move/delete always require a change reference. Every production schedule template also requires one, including resubmission. No change-reference variable disables these production gates.

Deletion/move containment must be configured on both services and followed by restart. Terraform uses shared disable_delete_operations and disable_move_operations inputs; per-component entries for these switches are rejected. Resubmission is unaffected by these two switches. An environment’s read-only setting blocks all three mutations. Already executing broker work is not rolled back. Queued attempts and later items recheck controls; failed jobs need a new submission after remediation. Schedule disable/delete remains possible.

Worker and queue

Worker and queue
VariableDefaultMeaning
JOB_QUEUE_NAMEjobsMust agree across API, Worker and migrator; exhausted delivery queue is <name>-dead.
JOB_MAX_ATTEMPTS3Total delivery attempts including the first.
JOB_BACKOFF_DELAY_MS5000Base exponential retry delay.
JOB_EXPIRE_SECONDS900Stalled-job recovery interval.
WORKER_CONCURRENCY4Concurrent jobs per Worker replica.
POLLING_INTERVAL_SECONDS2Worker poll interval.
QUEUE_BATCH_SIZE1Fetch batch size.
SHUTDOWN_TIMEOUT_MS30000API/Worker job-queue graceful shutdown wait.
WORKER_METRICS_PORT9090Worker health port; it is not a Prometheus metrics endpoint.
SCHEDULE_TICK_ENABLEDtrueEnables Worker schedule firing.
SCHEDULE_TICK_INTERVAL_MS60000Schedule due-check cadence.
RUN_MIGRATIONS_ON_BOOTDeployment pins falseCompatibility marker; runtime never performs migrations. Use the dedicated job.

Changing queue settings does not create missing queues: apply the matching dedicated migration configuration first. Never use the in-memory test queue driver in production. Job delivery retries do not imply that an uncertain publication is safe to repeat.

Background polling, retention and telemetry

Background polling, retention and telemetry
VariableDefaultMeaning
ENVIRONMENT_HEARTBEAT_ENABLEDtrueFallback heartbeat enablement.
ENVIRONMENT_HEARTBEAT_INTERVAL_MS30000Fallback heartbeat interval.
ENVIRONMENT_HEARTBEAT_RETRIES0Heartbeat retries.
QUEUE_INVENTORY_REFRESH_ENABLEDtrueFallback scheduled inventory enablement.
QUEUE_INVENTORY_REFRESH_INTERVAL_MS86400000Fallback inventory interval.
MESSAGE_REFS_RETENTION_DAYS30Reference age cap, independent of earlier per-row expiry.
AUDIT_EVENTS_RETENTION_DAYS365Audit fallback; 0 retains indefinitely. Finite values below 90 are clamped.
COMPLIANCE_EVIDENCE_RETENTION_DAYS90Expiry assigned to new evidence.
RETENTION_SCHEDULER_ENABLEDtrueAPI retention maintenance; automatically disabled in tests.
COMPLIANCE_SCHEDULER_ENABLEDtrueAPI weekly evidence generation/daily purge; disabled in tests.
OTEL_TRACES_SAMPLER_RATIO1Startup trace sampling; saved settings replace it.
OBSERVABILITY_RELOAD_INTERVAL_MS30000Saved telemetry reload; 0 disables automatic polling.

SEMP Traffic overrides its deployment fallbacks after settings are saved. Admin → Settings overrides retention fallbacks; evidence changes apply to new bundles. Monitoring and Logging describes saved telemetry destinations and credentials.

Development compatibility and test-only switches are not a production configuration method. In particular, API and Worker refuse DISABLE_LICENSE_CHECK=true outside development/test.

Confirm