Skip to content

Background Worker

AxumKit runs a separate worker binary (worker) that processes background jobs via NATS JetStream and runs scheduled cron tasks.

Architecture

server                                  worker
+--------------+                        +----------------------+
|   Handler    |                        |  NATS Consumers      |
|      |       |   NATS JetStream       |  |- Email             |
|   Bridge ----+----------------------->|  |- Index User        |
|              |                        |  `- Reindex Users    |
+--------------+                        |                      |
                                        |  Cron Scheduler      |
                                        |  |- Cleanup           |
                                        |  `- Sitemap           |
                                        +----------------------+

NATS JetStream Consumers

Each consumer is a durable pull subscriber with:

  • WorkQueue retention (messages deleted after ack)
  • Exponential backoff: 1s, 2s, 4s, 8s, 16s (5 retries)
  • Concurrency control via Tokio semaphore
  • 30-second ack timeout

Email Consumer

Sends transactional emails via SMTP (Lettre). Templates are rendered with MRML + MiniJinja.

Subject: axumkit.jobs.email

User Index Consumer

Indexes user documents in MeiliSearch when users are created or updated.

Subject: axumkit.jobs.index.user

User Reindex Consumer

Bulk reindexes all users in MeiliSearch.

Subject: axumkit.jobs.reindex.users

Cron Jobs

The worker runs tokio-cron-scheduler with configurable timezone (CRON_TIMEZONE, default: UTC).

JobScheduleDescription
CleanupSaturday 4:00 AMClean up expired auth/session data
SitemapSunday 3:00 AMGenerate sitemap.xml and upload to R2 assets bucket

Worker Context

All consumers share a WorkerContext with SMTP, database, Redis cache, R2 client, JetStream, and runtime config. Cron locking uses a dedicated Redis lock connection configured separately from cache.

Configuration

VariableRequiredDefaultDescription
NATS_URLNonats://localhost:4222NATS server URL
SMTP_HOSTYes-SMTP server host
SMTP_PORTNo587SMTP server port
SMTP_USERYes-SMTP username
SMTP_PASSWORDYes-SMTP password
SMTP_TLSNotrueEnable TLS
EMAILS_FROM_EMAILYes-Sender email address
EMAILS_FROM_NAMENoSevenWikiSender display name
FRONTEND_HOSTYes-Frontend URL for email links
PROJECT_NAMEYes-Project name in emails
R2_ENDPOINTYes-R2-compatible S3 endpoint
R2_REGIONNoautoR2 region
R2_ACCESS_KEY_IDYes-R2 access key
R2_SECRET_ACCESS_KEYYes-R2 secret key
R2_ASSETS_BUCKET_NAMEYes-R2 assets bucket
R2_ASSETS_PUBLIC_DOMAINYes-Public domain for assets
CRON_TIMEZONENoUTCTimezone for cron schedules
REDIS_LOCK_HOSTNo127.0.0.1Worker lock Redis host
REDIS_LOCK_PORTNo6381Worker lock Redis port

Released under the MIT License.