Dokploy

Inngest

Inngest is a developer platform for serverless event-driven workflows. Build reliable, scalable background functions and workflows with built-in retries, scheduling, and observability.

Inngest logo

Configuration

version: '3.8'

services:
  inngest:
    image: inngest/inngest:v1.12.1
    restart: unless-stopped
    command: >
      inngest start
      --host 0.0.0.0
      --port 8288
      --event-key ${INNGEST_EVENT_KEY}
      --signing-key ${INNGEST_SIGNING_KEY}
      --postgres-uri ${INNGEST_POSTGRES_URI}
      --redis-uri ${INNGEST_REDIS_URI}
      --poll-interval ${INNGEST_POLL_INTERVAL:-60}
      --queue-workers ${INNGEST_QUEUE_WORKERS:-100}
    environment:
      # Core Configuration
      - INNGEST_PORT=8288
      - INNGEST_HOST=0.0.0.0
      - INNGEST_EVENT_KEY=${INNGEST_EVENT_KEY}
      - INNGEST_SIGNING_KEY=${INNGEST_SIGNING_KEY}

      # Database & Cache
      - INNGEST_POSTGRES_URI=${INNGEST_POSTGRES_URI}
      - INNGEST_REDIS_URI=${INNGEST_REDIS_URI}

      # Performance Tuning
      - INNGEST_POLL_INTERVAL=${INNGEST_POLL_INTERVAL:-60}
      - INNGEST_QUEUE_WORKERS=${INNGEST_QUEUE_WORKERS:-100}
      - INNGEST_RETRY_INTERVAL=${INNGEST_RETRY_INTERVAL:-1}
      - INNGEST_TICK=${INNGEST_TICK:-150}

      # Logging
      - INNGEST_LOG_LEVEL=${INNGEST_LOG_LEVEL:-info}
      - INNGEST_JSON=${INNGEST_JSON:-false}
      - INNGEST_VERBOSE=${INNGEST_VERBOSE:-false}
    ports:
      - 8288
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
    volumes:
      - inngest_data:/home/inngest/.inngest
    healthcheck:
      test: ['CMD', 'curl', '-f', 'http://localhost:8288/health']
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 30s

  postgres:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      - POSTGRES_DB=${POSTGRES_DB}
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      - POSTGRES_INITDB_ARGS=--encoding=UTF-8 --lc-collate=C --lc-ctype=C
      - PGUSER=${POSTGRES_USER}
    volumes:
      - postgres_data:/var/lib/postgresql/data
    ports:
      - 5432
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}']
      interval: 10s
      timeout: 5s
      retries: 5

  redis:
    image: redis:7-alpine
    restart: unless-stopped
    command: redis-server --appendonly yes --maxmemory 512mb --maxmemory-policy allkeys-lru --save 60 1000
    sysctls:
      - net.core.somaxconn=1024
    volumes:
      - redis_data:/data
    ports:
      - 6379
    healthcheck:
      test: ['CMD', 'redis-cli', 'ping']
      interval: 10s
      timeout: 3s
      retries: 3

volumes:
  inngest_data:
  postgres_data:
  redis_data:
[variables]
main_domain = "${domain}"
event_key = "${jwt:32}" # Must be hex string with even number of chars
signing_key = "${jwt:32}" # Must be hex string with even number of chars
postgres_password = "${password:24}"

[config]
mounts = []

[[config.domains]]
serviceName = "inngest"
port = 8_288
host = "${main_domain}"

[config.env]
# Production Inngest Authentication Keys
INNGEST_EVENT_KEY = "${event_key}"
INNGEST_SIGNING_KEY = "${signing_key}"

# Database Configuration
INNGEST_POSTGRES_URI = "postgresql://inngest:${postgres_password}@postgres:5432/inngest?sslmode=disable"
POSTGRES_DB = "inngest"
POSTGRES_USER = "inngest"
POSTGRES_PASSWORD = "${postgres_password}"

# Redis Configuration
INNGEST_REDIS_URI = "redis://redis:6379"

# Performance & Scaling Configuration
INNGEST_POLL_INTERVAL = "60"
INNGEST_QUEUE_WORKERS = "100"
INNGEST_RETRY_INTERVAL = "1"
INNGEST_TICK = "150"

# Logging Configuration
INNGEST_LOG_LEVEL = "info"
INNGEST_JSON = "true"
INNGEST_VERBOSE = "false"

Base64

To import this template in Dokploy: create a Compose service → AdvancedBase64 import and paste the content below:

ewogICJjb21wb3NlIjogInZlcnNpb246ICczLjgnXG5cbnNlcnZpY2VzOlxuICBpbm5nZXN0OlxuICAgIGltYWdlOiBpbm5nZXN0L2lubmdlc3Q6djEuMTIuMVxuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG4gICAgY29tbWFuZDogPlxuICAgICAgaW5uZ2VzdCBzdGFydFxuICAgICAgLS1ob3N0IDAuMC4wLjBcbiAgICAgIC0tcG9ydCA4Mjg4XG4gICAgICAtLWV2ZW50LWtleSAke0lOTkdFU1RfRVZFTlRfS0VZfVxuICAgICAgLS1zaWduaW5nLWtleSAke0lOTkdFU1RfU0lHTklOR19LRVl9XG4gICAgICAtLXBvc3RncmVzLXVyaSAke0lOTkdFU1RfUE9TVEdSRVNfVVJJfVxuICAgICAgLS1yZWRpcy11cmkgJHtJTk5HRVNUX1JFRElTX1VSSX1cbiAgICAgIC0tcG9sbC1pbnRlcnZhbCAke0lOTkdFU1RfUE9MTF9JTlRFUlZBTDotNjB9XG4gICAgICAtLXF1ZXVlLXdvcmtlcnMgJHtJTk5HRVNUX1FVRVVFX1dPUktFUlM6LTEwMH1cbiAgICBlbnZpcm9ubWVudDpcbiAgICAgICMgQ29yZSBDb25maWd1cmF0aW9uXG4gICAgICAtIElOTkdFU1RfUE9SVD04Mjg4XG4gICAgICAtIElOTkdFU1RfSE9TVD0wLjAuMC4wXG4gICAgICAtIElOTkdFU1RfRVZFTlRfS0VZPSR7SU5OR0VTVF9FVkVOVF9LRVl9XG4gICAgICAtIElOTkdFU1RfU0lHTklOR19LRVk9JHtJTk5HRVNUX1NJR05JTkdfS0VZfVxuXG4gICAgICAjIERhdGFiYXNlICYgQ2FjaGVcbiAgICAgIC0gSU5OR0VTVF9QT1NUR1JFU19VUkk9JHtJTk5HRVNUX1BPU1RHUkVTX1VSSX1cbiAgICAgIC0gSU5OR0VTVF9SRURJU19VUkk9JHtJTk5HRVNUX1JFRElTX1VSSX1cblxuICAgICAgIyBQZXJmb3JtYW5jZSBUdW5pbmdcbiAgICAgIC0gSU5OR0VTVF9QT0xMX0lOVEVSVkFMPSR7SU5OR0VTVF9QT0xMX0lOVEVSVkFMOi02MH1cbiAgICAgIC0gSU5OR0VTVF9RVUVVRV9XT1JLRVJTPSR7SU5OR0VTVF9RVUVVRV9XT1JLRVJTOi0xMDB9XG4gICAgICAtIElOTkdFU1RfUkVUUllfSU5URVJWQUw9JHtJTk5HRVNUX1JFVFJZX0lOVEVSVkFMOi0xfVxuICAgICAgLSBJTk5HRVNUX1RJQ0s9JHtJTk5HRVNUX1RJQ0s6LTE1MH1cblxuICAgICAgIyBMb2dnaW5nXG4gICAgICAtIElOTkdFU1RfTE9HX0xFVkVMPSR7SU5OR0VTVF9MT0dfTEVWRUw6LWluZm99XG4gICAgICAtIElOTkdFU1RfSlNPTj0ke0lOTkdFU1RfSlNPTjotZmFsc2V9XG4gICAgICAtIElOTkdFU1RfVkVSQk9TRT0ke0lOTkdFU1RfVkVSQk9TRTotZmFsc2V9XG4gICAgcG9ydHM6XG4gICAgICAtIDgyODhcbiAgICBkZXBlbmRzX29uOlxuICAgICAgcG9zdGdyZXM6XG4gICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5XG4gICAgICByZWRpczpcbiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHlcbiAgICB2b2x1bWVzOlxuICAgICAgLSBpbm5nZXN0X2RhdGE6L2hvbWUvaW5uZ2VzdC8uaW5uZ2VzdFxuICAgIGhlYWx0aGNoZWNrOlxuICAgICAgdGVzdDogWydDTUQnLCAnY3VybCcsICctZicsICdodHRwOi8vbG9jYWxob3N0OjgyODgvaGVhbHRoJ11cbiAgICAgIGludGVydmFsOiAzMHNcbiAgICAgIHRpbWVvdXQ6IDEwc1xuICAgICAgcmV0cmllczogM1xuICAgICAgc3RhcnRfcGVyaW9kOiAzMHNcblxuICBwb3N0Z3JlczpcbiAgICBpbWFnZTogcG9zdGdyZXM6MTYtYWxwaW5lXG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICBlbnZpcm9ubWVudDpcbiAgICAgIC0gUE9TVEdSRVNfREI9JHtQT1NUR1JFU19EQn1cbiAgICAgIC0gUE9TVEdSRVNfVVNFUj0ke1BPU1RHUkVTX1VTRVJ9XG4gICAgICAtIFBPU1RHUkVTX1BBU1NXT1JEPSR7UE9TVEdSRVNfUEFTU1dPUkR9XG4gICAgICAtIFBPU1RHUkVTX0lOSVREQl9BUkdTPS0tZW5jb2Rpbmc9VVRGLTggLS1sYy1jb2xsYXRlPUMgLS1sYy1jdHlwZT1DXG4gICAgICAtIFBHVVNFUj0ke1BPU1RHUkVTX1VTRVJ9XG4gICAgdm9sdW1lczpcbiAgICAgIC0gcG9zdGdyZXNfZGF0YTovdmFyL2xpYi9wb3N0Z3Jlc3FsL2RhdGFcbiAgICBwb3J0czpcbiAgICAgIC0gNTQzMlxuICAgIGhlYWx0aGNoZWNrOlxuICAgICAgdGVzdDogWydDTUQtU0hFTEwnLCAncGdfaXNyZWFkeSAtVSAke1BPU1RHUkVTX1VTRVJ9IC1kICR7UE9TVEdSRVNfREJ9J11cbiAgICAgIGludGVydmFsOiAxMHNcbiAgICAgIHRpbWVvdXQ6IDVzXG4gICAgICByZXRyaWVzOiA1XG5cbiAgcmVkaXM6XG4gICAgaW1hZ2U6IHJlZGlzOjctYWxwaW5lXG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICBjb21tYW5kOiByZWRpcy1zZXJ2ZXIgLS1hcHBlbmRvbmx5IHllcyAtLW1heG1lbW9yeSA1MTJtYiAtLW1heG1lbW9yeS1wb2xpY3kgYWxsa2V5cy1scnUgLS1zYXZlIDYwIDEwMDBcbiAgICBzeXNjdGxzOlxuICAgICAgLSBuZXQuY29yZS5zb21heGNvbm49MTAyNFxuICAgIHZvbHVtZXM6XG4gICAgICAtIHJlZGlzX2RhdGE6L2RhdGFcbiAgICBwb3J0czpcbiAgICAgIC0gNjM3OVxuICAgIGhlYWx0aGNoZWNrOlxuICAgICAgdGVzdDogWydDTUQnLCAncmVkaXMtY2xpJywgJ3BpbmcnXVxuICAgICAgaW50ZXJ2YWw6IDEwc1xuICAgICAgdGltZW91dDogM3NcbiAgICAgIHJldHJpZXM6IDNcblxudm9sdW1lczpcbiAgaW5uZ2VzdF9kYXRhOlxuICBwb3N0Z3Jlc19kYXRhOlxuICByZWRpc19kYXRhOlxuIiwKICAiY29uZmlnIjogIlt2YXJpYWJsZXNdXG5tYWluX2RvbWFpbiA9IFwiJHtkb21haW59XCJcbmV2ZW50X2tleSA9IFwiJHtqd3Q6MzJ9XCIgIyBNdXN0IGJlIGhleCBzdHJpbmcgd2l0aCBldmVuIG51bWJlciBvZiBjaGFyc1xuc2lnbmluZ19rZXkgPSBcIiR7and0OjMyfVwiICMgTXVzdCBiZSBoZXggc3RyaW5nIHdpdGggZXZlbiBudW1iZXIgb2YgY2hhcnNcbnBvc3RncmVzX3Bhc3N3b3JkID0gXCIke3Bhc3N3b3JkOjI0fVwiXG5cbltjb25maWddXG5tb3VudHMgPSBbXVxuXG5bW2NvbmZpZy5kb21haW5zXV1cbnNlcnZpY2VOYW1lID0gXCJpbm5nZXN0XCJcbnBvcnQgPSA4XzI4OFxuaG9zdCA9IFwiJHttYWluX2RvbWFpbn1cIlxuXG5bY29uZmlnLmVudl1cbiMgUHJvZHVjdGlvbiBJbm5nZXN0IEF1dGhlbnRpY2F0aW9uIEtleXNcbklOTkdFU1RfRVZFTlRfS0VZID0gXCIke2V2ZW50X2tleX1cIlxuSU5OR0VTVF9TSUdOSU5HX0tFWSA9IFwiJHtzaWduaW5nX2tleX1cIlxuXG4jIERhdGFiYXNlIENvbmZpZ3VyYXRpb25cbklOTkdFU1RfUE9TVEdSRVNfVVJJID0gXCJwb3N0Z3Jlc3FsOi8vaW5uZ2VzdDoke3Bvc3RncmVzX3Bhc3N3b3JkfUBwb3N0Z3Jlczo1NDMyL2lubmdlc3Q/c3NsbW9kZT1kaXNhYmxlXCJcblBPU1RHUkVTX0RCID0gXCJpbm5nZXN0XCJcblBPU1RHUkVTX1VTRVIgPSBcImlubmdlc3RcIlxuUE9TVEdSRVNfUEFTU1dPUkQgPSBcIiR7cG9zdGdyZXNfcGFzc3dvcmR9XCJcblxuIyBSZWRpcyBDb25maWd1cmF0aW9uXG5JTk5HRVNUX1JFRElTX1VSSSA9IFwicmVkaXM6Ly9yZWRpczo2Mzc5XCJcblxuIyBQZXJmb3JtYW5jZSAmIFNjYWxpbmcgQ29uZmlndXJhdGlvblxuSU5OR0VTVF9QT0xMX0lOVEVSVkFMID0gXCI2MFwiXG5JTk5HRVNUX1FVRVVFX1dPUktFUlMgPSBcIjEwMFwiXG5JTk5HRVNUX1JFVFJZX0lOVEVSVkFMID0gXCIxXCJcbklOTkdFU1RfVElDSyA9IFwiMTUwXCJcblxuIyBMb2dnaW5nIENvbmZpZ3VyYXRpb25cbklOTkdFU1RfTE9HX0xFVkVMID0gXCJpbmZvXCJcbklOTkdFU1RfSlNPTiA9IFwidHJ1ZVwiXG5JTk5HRVNUX1ZFUkJPU0UgPSBcImZhbHNlXCJcbiIKfQ==

Tags

workflow, automation, self-hosted, serverless, events


Version: v1.12.1

On this page