4.8 KiB
Configuration
This project keeps runtime configuration explicit and treats secret diagnostics
as a
public surface. Application code should receive configuration through typed
loaders, provider options, or handler dependencies instead of reading
process.env inside package internals.
Explicit environment access
Only runtime entrypoints should read from process.env. Worker-owned
environment reads are limited to the worker runtime and health entrypoints.
Those entrypoints immediately validate values and convert them into explicit
dependencies for queues, Mailjet, browser runtime integrations, and
handlers.
Package adapters must accept an environment object or concrete provider options
from their caller. This keeps hidden environment coupling out of packages such
as packages/mail and packages/queue, makes tests deterministic, and lets
diagnostics report configuration status without exposing raw secret values.
Worker enablement
The worker is opt-in. Set WORKER_ENABLED=true only on deployments that should
start queue processors. In multi-resource platforms such as Coolify, do not put
WORKER_ENABLED=false into a shared production environment group that is also
injected into the worker resource; leave it unset for web/API resources and set
it explicitly to true on each worker resource.
When the worker is enabled, provide queue configuration explicitly:
WORKER_QUEUE_GROUPmust be one ofgeneral,mail,import,webhook, orpluginfor grouped worker resources.WORKER_HEALTH_PORTandWORKER_ADMIN_PORTshould be unique per Coolify worker app when those endpoints are exposed.BULLMQ_REDIS_URLis the worker Redis URL.REDIS_URLis accepted only as a fallback whenBULLMQ_REDIS_URLis absent.
If the worker is disabled, queue processors should not start. Health and runtime diagnostics may still report enablement and readiness status, but they must not include the Redis URL value.
Mailjet configuration
Mailjet is the transactional mail provider boundary for API and worker runtimes. Mail delivery requires the provider key and verified sender domain address to be configured together:
MAILJET_API_KEYis the Mailjet API token.MAILJET_FROM_EMAILis the default sender email from a verified Mailjet domain.MAILJET_FROM_NAMEis an optional sender display name.
Treat MAILJET_API_KEY and MAILJET_FROM_EMAIL as a required pair
whenever Mailjet delivery is enabled. Supplying only one of the pair is
invalid configuration because the provider cannot safely send mail without both
authentication and an approved sender address.
Browser runtime configuration
Worker browser runtime settings are explicit worker configuration, not package-global state:
BROWSER_RUNTIME_URLidentifies the browser runtime service endpoint when that integration is enabled.BROWSER_RUNTIME_API_KEYauthenticates requests to the browser runtime service.BROWSER_SESSION_TIMEOUT_MSconfigures the session timeout and must parse as a valid millisecond duration.
Browser runtime diagnostics should report key names, parse status, and diagnostic codes only. They must never include endpoint secrets, API keys, tokens, or raw values.
Safe diagnostics and redaction
Configuration validation must use the central redacted secret validator for required and optional secret-like values. Errors, health JSON, and logs may include:
- environment key names;
- diagnostic codes;
- parse status;
- high-level messages;
- queue readiness or worker enablement status.
They must not include raw secret values. This applies to Redis URLs, database URLs, API keys, tokens, Mailjet sender secrets, browser runtime credentials, and any future provider secret.
When reporting invalid or missing configuration, prefer messages such as
missing required env key MAILJET_API_KEY or
invalid duration for BROWSER_SESSION_TIMEOUT_MS. Do not interpolate the
rejected value into thrown errors, logs, or health responses.
Seed Credentials
Local demo users and demo tenants are opt-in through SEED_DEMO_DATA=true and
are refused in production. Production bootstrap seeding requires
SEED_ADMIN_EMAIL and SEED_ADMIN_PASSWORD, creates only the configured admin
plus roles, permissions, and entitlements, and refuses local default seed emails
or the default password.
Adding new configuration
When adding a new runtime setting:
- Decide which runtime entrypoint owns the environment read.
- Validate and normalize the value before passing it to packages or handlers.
- Use the redacted secret validator for secret-like required or optional values.
- Pass normalized values through explicit options or dependencies.
- Add tests that assert diagnostics expose keys and codes, not raw values.
- Update this document and the environment inventory when the setting is user-facing.