Skip to content

Apache Superset

Deploy Apache Superset on Kubernetes — a modern business intelligence platform with 60+ database connectors, interactive dashboards, SQL editor, and chart builder. The chart deploys three independent components: a Gunicorn web server, Celery workers for async queries, and a Celery Beat scheduler for cache warming and alerts.

secretKey protects all sessions — losing it logs out every user simultaneously

superset.secretKey is the Flask SECRET_KEY used to sign all session cookies. Without superset.existingSecret, a reinstall auto-generates a new key and immediately invalidates all active sessions. Always persist it via superset.existingSecret before the first deployment.

PostgreSQL and Redis are enabled by default — both subcharts are bundled

Unlike most charts, Superset ships with postgresql.enabled: true and redis.enabled: true. No manual activation is needed for a quick start. Set both to false and configure database.mode: external and redisConfig.mode: external to use external services.

Key Features

  • Three-component architecture — web (Gunicorn), worker (Celery), beat (Celery Beat)
  • Init Job — runs superset db upgrade and admin creation on every install/upgrade
  • Bundled PostgreSQL and Redis — both enabled by default
  • superset_config.py override — arbitrary Python config via superset.extraConfig
  • pg_dump backup — scheduled PostgreSQL S3 backup CronJob

Installation

HTTPS repository:

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

OCI registry:

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

Deployment Examples

# values.yaml — Superset with bundled PostgreSQL + Redis (defaults)
superset:
  adminUsername: admin
  adminEmail: admin@example.com
  existingSecret: superset-secrets
  existingSecretPasswordKey: admin-password
  existingSecretSecretKeyKey: secret-key # Flask SECRET_KEY

postgresql:
  enabled: true
  auth:
    database: superset
    username: superset
    password: 'strong-db-password'

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

ingress:
  enabled: true
  ingressClassName: traefik
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
  hosts:
    - host: superset.example.com
      paths:
        - path: /
          pathType: Prefix
  tls:
    - secretName: superset-tls
      hosts:
        - superset.example.com
# values.yaml — Superset with scaled web, workers, and beat scheduler
superset:
  existingSecret: superset-secrets

web:
  replicaCount: 2 # web server pods
  workers: 4 # Gunicorn worker processes per web pod (NOT Celery workers)
  timeout: 120

worker:
  enabled: true
  replicaCount: 3 # Celery worker pods
  concurrency: 4 # simultaneous Celery tasks per worker pod

beat:
  enabled: true # Celery Beat: cache warming, alerts, reports

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

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

ingress:
  enabled: true
  ingressClassName: traefik
  hosts:
    - host: superset.example.com
      paths:
        - path: /
          pathType: Prefix
# values.yaml — Superset with external PostgreSQL and Redis
superset:
  existingSecret: superset-secrets

postgresql:
  enabled: false

redis:
  enabled: false

database:
  mode: external
  external:
    host: postgres.database.svc.cluster.local
    port: 5432
    name: superset
    username: superset
    existingSecret: superset-db-credentials
    existingSecretPasswordKey: password

redisConfig:
  mode: external
  external:
    host: redis.cache.svc.cluster.local
    port: 6379
    db: 0
    existingSecret: superset-redis-credentials
    existingSecretPasswordKey: password

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

ingress:
  enabled: true
  ingressClassName: traefik
  hosts:
    - host: superset.example.com
      paths:
        - path: /
          pathType: Prefix
# values.yaml — Superset with OIDC/OAuth2 via superset.extraConfig
superset:
  existingSecret: superset-secrets
  extraConfig: |
    from flask_appbuilder.security.manager import AUTH_OAUTH
    AUTH_TYPE = AUTH_OAUTH
    OAUTH_PROVIDERS = [
      {
        "name": "keycloak",
        "token_key": "access_token",
        "icon": "fa-key",
        "remote_app": {
          "client_id": "superset",
          "client_secret": "my-client-secret",
          "server_metadata_url": "https://auth.example.com/realms/myrealm/.well-known/openid-configuration",
          "client_kwargs": {"scope": "openid email profile"},
          "redirect_uri": "https://superset.example.com/oauth-authorized/keycloak",
        },
      }
    ]
    AUTH_USER_REGISTRATION = True
    AUTH_USER_REGISTRATION_ROLE = "Gamma"

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

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

ingress:
  enabled: true
  ingressClassName: traefik
  hosts:
    - host: superset.example.com
      paths:
        - path: /
          pathType: Prefix

Configuration Reference

Image

ParameterTypeDefaultDescription
image.repositorystringdocker.io/apache/supersetSuperset image.
image.tagstring"4.1.4"Image tag.

Superset Application

ParameterTypeDefaultDescription
superset.adminUsernamestringadminAdmin username created by the init Job.
superset.adminPasswordstring""Admin password. Auto-generated if empty. Use existingSecret.
superset.secretKeystring""Flask SECRET_KEY. Auto-generated if empty. Use existingSecret.
superset.existingSecretstring""Existing secret with admin password and SECRET_KEY.
superset.existingSecretPasswordKeystringadmin-passwordKey for the admin password in the existing secret.
superset.existingSecretSecretKeyKeystringsecret-keyKey for the Flask SECRET_KEY in the existing secret.
superset.loadExamplesbooleanfalseLoad example dashboards during init (use for demos only).
superset.extraConfigstring""Extra Python appended to superset_config.py (OAuth, cache, features).
superset.extraEnvarray[]Extra environment variables for all Superset containers.

Web Server

ParameterTypeDefaultDescription
web.replicaCountinteger1Number of web server pods.
web.workersinteger2Gunicorn worker processes per pod (not Celery workers).
web.timeoutinteger120Gunicorn worker timeout in seconds.
web.resourcesobject{}CPU and memory requests/limits for web pods.

Celery Worker

ParameterTypeDefaultDescription
worker.enabledbooleantrueEnable Celery worker Deployment.
worker.replicaCountinteger1Number of Celery worker pods.
worker.concurrencyinteger2Simultaneous Celery tasks per worker pod.
worker.resourcesobject{}CPU and memory requests/limits for worker pods.

Celery Beat

ParameterTypeDefaultDescription
beat.enabledbooleantrueEnable Celery Beat scheduler (cache warming, alerts, reports).
beat.resourcesobject{}CPU and memory requests/limits for the beat pod.

Init Job

ParameterTypeDefaultDescription
init.enabledbooleantrueEnable the init Job. Runs superset db upgrade + admin creation on every install/upgrade.
init.resourcesobject{}CPU and memory requests/limits for the init container.

Database

ParameterTypeDefaultDescription
database.modestringsubchartMode: subchart or external.
database.external.hoststring""External database hostname.
database.external.existingSecretstring""Existing secret with database password.
database.external.existingSecretPasswordKeystringpasswordKey for the password in the existing secret.
postgresql.enabledbooleantrueDeploy the bundled PostgreSQL subchart.
postgresql.auth.passwordstring""Password. Auto-generated if empty.

Redis

ParameterTypeDefaultDescription
redisConfig.modestringsubchartMode: subchart or external.
redisConfig.external.hoststring""External Redis hostname.
redisConfig.external.existingSecretstring""Existing secret with Redis password.
redis.enabledbooleantrueDeploy the bundled Redis subchart.
redis.auth.passwordstring""Password. Auto-generated if empty.

Service and Ingress

ParameterTypeDefaultDescription
service.typestringClusterIPService type.
service.portinteger80Service port.
ingress.enabledbooleanfalseEnable an Ingress resource.
ingress.ingressClassNamestringtraefikIngress class name.

Backup

Backup runs pg_dump on PostgreSQL. No backup for Redis data.

ParameterTypeDefaultDescription
backup.enabledbooleanfalseEnable scheduled pg_dump S3 backup.
backup.schedulestring"0 3 * * *"Cron schedule.
backup.s3.endpointstring""S3-compatible endpoint URL.
backup.s3.bucketstring""Target bucket name.
backup.s3.existingSecretstring""Existing secret with S3 credentials.
extraManifestsarray[]Extra Kubernetes manifests.

More Information