Image and port
Connection behaviour
The BullMQ client readsREDIS_HOST and REDIS_PORT lazily when the first queue is registered. If either variable is empty and a worker tries to enqueue a job, IMP logs an error and throws — it does not silently discard work.
IMP uses enableOfflineQueue: false on every queue connection, so the client fails fast when Redis is unreachable rather than buffering commands indefinitely. The startup path waits for the connection to be ready before accepting jobs and reports a clear error if Redis does not respond within the startup timeout.
Configuration reference
Compose excerpt
Persistence and rate-limit state
Redis stores the email-inbound rate-limit sliding-window counters (two sliding-window counters per email trigger (one per-trigger, one per-sender), each spanning two hourly bucket keys with a 2-hour TTL). These keys are best-effort: a Redis flush or restart resets the windows, which means a sender who hit the hourly limit could immediately send again. The impact is bounded — no application data is lost, the windows simply refill from zero. Message-ID deduplication is not Redis-backed; it is stored in the Postgresjob_results table and survives a Redis restart without gaps.
Guest rate-limit state is held in-process and is also not Redis-backed.
Operational notes
Worker env file. The worker compose file (docker-compose.worker.yml) does not include an env_file entry by default. Outside Dokploy, add env_file: [.env] to the worker service or inject the variables another way, or the worker starts without Redis credentials and fails on first job.
Worker heap size. Workers need at least 8 GB of Node.js heap for knowledge processing tasks. Set NODE_OPTIONS='--max-old-space-size=8192' in the worker container’s environment.
Queue licence requirement. Queue registration requires the EXULU_ENTERPRISE_LICENSE env var to be set to a valid enterprise licence key. IMP throws on startup if you attempt to register a queue without a licence.