Skip to content

n8n

Deploy n8n on Kubernetes — a workflow automation platform with a visual editor, 200+ integrations, and code nodes. Supports SQLite (zero-configuration default), PostgreSQL, and MySQL, with Redis-backed queue mode for horizontal scaling of workflow executions.

encryptionKey protects all stored credentials — losing it invalidates every workflow connection

n8n.encryptionKey encrypts OAuth tokens, API keys, and passwords stored in workflow credentials. If the key changes (including during reinstall with a new auto-generated key), all saved credentials in all workflows become permanently unreadable. Always persist it via encryptionKey.existingSecret and never rotate it in production.

Key Features

  • Three database backends — SQLite (default), PostgreSQL, MySQL
  • Queue mode — Redis-backed horizontal scaling with separate worker Deployments
  • Encryption key protection — all workflow credentials encrypted at rest
  • Webhook URL required — must match the external-facing URL for triggers to work
  • Database-aware backuptar for SQLite, pg_dump for PostgreSQL, mysqldump for MySQL

Installation

HTTPS repository:

helm repo add helmforge https://repo.helmforge.dev
helm repo update
helm install n8n helmforge/n8n -f values.yaml

OCI registry:

helm install n8n oci://ghcr.io/helmforgedev/helm/n8n -f values.yaml

Deployment Examples

# values.yaml — n8n with SQLite (zero database configuration)
n8n:
  webhookUrl: 'https://n8n.example.com' # required for webhook triggers

encryptionKey:
  existingSecret: n8n-master-secret # key: encryption-key (never rotate)
  existingSecretKey: encryption-key

persistence:
  enabled: true
  size: 10Gi # SQLite DB + installed custom nodes

ingress:
  enabled: true
  ingressClassName: traefik
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
  hosts:
    - host: n8n.example.com
      paths:
        - path: /
          pathType: Prefix
  tls:
    - secretName: n8n-tls
      hosts:
        - n8n.example.com
# values.yaml — n8n with bundled PostgreSQL
n8n:
  webhookUrl: 'https://n8n.example.com'
  logLevel: info

encryptionKey:
  existingSecret: n8n-master-secret

postgresql:
  enabled: true
  auth:
    database: n8n
    username: n8n
    password: 'strong-db-password'
  primary:
    persistence:
      enabled: true
      size: 20Gi

persistence:
  enabled: true
  size: 5Gi # custom nodes (no SQLite when PostgreSQL is active)

ingress:
  enabled: true
  ingressClassName: traefik
  hosts:
    - host: n8n.example.com
      paths:
        - path: /
          pathType: Prefix
# values.yaml — n8n in queue mode with 3 workers
# Queue mode separates the main pod (editor + triggers) from worker pods (executions)
n8n:
  webhookUrl: 'https://n8n.example.com'

encryptionKey:
  existingSecret: n8n-master-secret

postgresql:
  enabled: true
  auth:
    password: 'strong-db-password'

redis:
  enabled: true
  auth:
    password: 'strong-redis-password'

queue:
  enabled: true
  workers: 3 # creates 3 separate worker Deployment pods
  concurrency: 10 # workflows executed simultaneously per worker

persistence:
  enabled: true
  size: 5Gi

ingress:
  enabled: true
  ingressClassName: traefik
  hosts:
    - host: n8n.example.com
      paths:
        - path: /
          pathType: Prefix
# values.yaml — n8n with external PostgreSQL and daily backup
n8n:
  webhookUrl: 'https://n8n.example.com'

encryptionKey:
  existingSecret: n8n-master-secret

postgresql:
  enabled: false

database:
  mode: external
  external:
    vendor: postgres
    host: postgres.database.svc.cluster.local
    name: n8n
    username: n8n
    existingSecret: n8n-db-credentials
    existingSecretPasswordKey: database-password

persistence:
  enabled: true
  size: 5Gi

backup:
  enabled: true
  schedule: '0 3 * * *'
  s3:
    endpoint: https://s3.amazonaws.com
    bucket: n8n-backups
    existingSecret: n8n-s3-credentials

Configuration Reference

Core

ParameterTypeDefaultDescription
nameOverridestring""Override the chart name.
fullnameOverridestring""Override the full release name.
commonLabelsobject{}Extra labels added to all resources.

Image

ParameterTypeDefaultDescription
image.repositorystringdocker.io/n8nio/n8nn8n container image.
image.tagstring"2.20.6"Image tag.
image.pullPolicystringIfNotPresentImage pull policy.

n8n Configuration

ParameterTypeDefaultDescription
n8n.encryptionKeystring""Credential encryption key. Auto-generated if empty. Use existingSecret.
n8n.webhookUrlstring""Full external URL for webhook triggers. Required for all webhook nodes.
n8n.editorBaseUrlstring""Editor base URL. Auto-detected from Ingress if empty.
n8n.logLevelstringinfoLog level: silent, error, warn, info, debug, verbose.
n8n.logOutputstringconsoleLog output destination: console or file.
n8n.extraEnvarray[]Extra environment variables (e.g. GENERIC_TIMEZONE, N8N_DIAGNOSTICS_ENABLED).

Encryption Key

ParameterTypeDefaultDescription
encryptionKey.existingSecretstring""Existing secret containing the encryption key.
encryptionKey.existingSecretKeystringencryption-keyKey for the encryption key in the existing secret.

Queue Mode

ParameterTypeDefaultDescription
queue.enabledbooleanfalseEnable Redis-backed queue mode (main pod + separate worker Deployments).
queue.workersinteger1Number of worker replica Deployments.
queue.concurrencyinteger10Simultaneous workflow executions per worker.
queue.resourcesobject{}CPU and memory requests/limits for worker pods.
queue.external.hoststring""External Redis host (alternative to subchart).
queue.external.existingSecretstring""Existing secret for external Redis password.

Database

Auto-detection precedence (database.mode: auto):

PriorityConditionResult
1database.external.host or external.existingSecretExternal DB
2postgresql.enabled: truePostgreSQL subchart
3mysql.enabled: trueMySQL subchart
4None of the aboveSQLite (default)
ParameterTypeDefaultDescription
database.modestringautoDatabase mode: auto, sqlite, external, postgresql, mysql.
database.sqlite.filestring/home/node/.n8n/database.sqliteSQLite file path inside the data volume.
database.external.vendorstringpostgresExternal DB vendor: postgres or mysql.
database.external.hoststring""External database hostname.
database.external.existingSecretstring""Existing secret with database password.
database.external.existingSecretPasswordKeystringdatabase-passwordKey for the password.

Subcharts

ParameterTypeDefaultDescription
postgresql.enabledbooleanfalseDeploy the bundled PostgreSQL subchart.
postgresql.auth.passwordstring""Password. Auto-generated if empty.
postgresql.primary.persistence.sizestring8GiPVC size for PostgreSQL.
mysql.enabledbooleanfalseDeploy the bundled MySQL subchart.
mysql.primary.persistence.sizestring8GiPVC size for MySQL.
redis.enabledbooleanfalseDeploy the bundled Redis subchart.
redis.primary.persistence.sizestring1GiPVC size for Redis.

Persistence

ParameterTypeDefaultDescription
persistence.enabledbooleantrueEnable PVC for /home/node/.n8n (SQLite DB + custom nodes).
persistence.sizestring5GiPVC size.
persistence.storageClassstring""StorageClass for the PVC.
persistence.existingClaimstring""Use an existing PVC.

Backup

Backup mode is automatically selected based on the active database vendor.

ParameterTypeDefaultDescription
backup.enabledbooleanfalseEnable scheduled S3 backup CronJob.
backup.schedulestring"0 3 * * *"Cron schedule.
backup.archivePrefixstringn8nPrefix for backup archive filenames.
backup.s3.endpointstring""S3-compatible endpoint URL.
backup.s3.bucketstring""Target bucket name.
backup.s3.existingSecretstring""Existing secret with S3 credentials.
backup.database.postgresDumpArgsstring""Extra arguments for pg_dump.
backup.database.mysqlDumpArgsstring--single-transaction ...Extra arguments for mysqldump.

Service, Ingress, Probes

ParameterTypeDefaultDescription
service.typestringClusterIPService type.
ingress.enabledbooleanfalseEnable an Ingress resource.
ingress.ingressClassNamestring""Ingress class name.
startupProbe.enabledbooleantrueStartup probe on /healthz.
livenessProbe.enabledbooleantrueLiveness probe on /healthz.
readinessProbe.enabledbooleantrueReadiness probe on /healthz.
resourcesobject{}CPU and memory requests/limits.
extraManifestsarray[]Extra Kubernetes manifests.

More Information