Job queue
Source of truth: Postgres
DATABASE_URL=postgres://...
Workers claim jobs with FOR UPDATE SKIP LOCKED. There is no file-backed job queue — it does not survive multi-replica deploys.
Optional broker (wake-up only)
For KEDA / faster fan-out:
STEW_QUEUE_BROKER=rabbitmq # or nats | pulsar
RABBITMQ_URL=amqp://...
Jobs are still written to Postgres first; broker publish is best-effort.
Disaster recovery
If the broker loses messages:
- Workers still process pending jobs via Postgres poll
- Platform operators can republish pending jobs to rehydrate broker depth:
GET /v1/platform/queue
POST /v1/platform/queue/republish
UI: Settings → Platform ops → Job queue recovery
Compose helper: deploy/compose/docker-compose.queue.yml.