Skip to main content

Superset Common Shared Configuration Module

The Superset Common module defines the Apache Superset configuration for the RAD Modules ecosystem. It is a configuration and secrets module — it creates one Secret Manager secret and produces config, secret_ids, and storage_buckets outputs consumed by platform-specific wrapper modules (Superset CloudRun and Superset GKE).

1. Overview

Purpose: To centralise all Superset-specific configuration (custom container image with psycopg2, PostgreSQL 15 database setup, secret key generation, two-phase initialisation, health probes, and storage bucket) in a single module shared by both Cloud Run and GKE deployments.

Architecture:

Layer 3: Application Wrappers
├── Superset_CloudRun ──┐
└── Superset_GKE ──┤── instantiate Superset_Common

Superset_Common (this module)
Creates: Secret Manager secret (SUPERSET_SECRET_KEY)
Produces: config, secret_ids, storage_buckets

Layer 2: Platform Modules
├── App_CloudRun (serverless deployment)
└── App_GKE (Kubernetes deployment)

Key characteristics:

  • Creates one Secret Manager secretSUPERSET_SECRET_KEY (50-char random, no special characters). This key signs Flask sessions — rotating it invalidates all active user sessions.
  • Two-phase initialisationdb-init (database creation) followed by app-init (schema migration + admin user creation). Both phases run automatically on first deploy.
  • The bundled Dockerfile pre-installs psycopg2-binary for PostgreSQL connectivity, which requires native library compilation and must be done at image build time.
  • Health probes target /health — Superset's Gunicorn health endpoint.

2. Outputs

config

FieldValue / Description
app_name"superset"
application_versionVersion tag (default: "latest")
display_namevar.display_name (default: "Superset")
descriptionvar.description
container_image"apache/superset:latest"
image_source"custom" — custom image built with psycopg2 pre-installed
enable_image_mirroringvar.enable_image_mirroring (default false)
container_build_configdockerfile_path = "Dockerfile", context_path = abspath("${path.module}/scripts")
container_port8088
database_type"POSTGRES_15"
db_namevar.db_name (default: "superset_db")
db_uservar.db_user (default: "superset_user")
enable_cloudsql_volumevar.enable_cloudsql_volume (default true)
cloudsql_volume_mount_path"/cloudsql"
gcs_volumesvar.gcs_volumes
container_resourcesCPU: var.cpu_limit (default "2000m"), Memory: var.memory_limit (default "2Gi")
min_instance_countvar.min_instance_count (default 1)
max_instance_countvar.max_instance_count (default 5)
environment_variablesvar.environment_variables (passed through)
enable_postgres_extensionsfalse
initialization_jobsDefault two-phase pipeline or custom override — see §5
startup_probeHTTP GET /health, 60s initial delay, 5s timeout, 10s period, 12 failure threshold
liveness_probeHTTP GET /health, 30s initial delay, 5s timeout, 30s period, 3 failure threshold

secret_ids

KeySecret IDDescription
SUPERSET_SECRET_KEY{prefix}-secret-keyFlask session signing key. 50-char random, no special characters.

storage_buckets

FieldValue
name_suffix"superset-data"
storage_class"STANDARD"
versioning_enabledfalse
public_access_prevention"inherited"

3. Input Variables

Application

VariableTypeDefaultDescription
application_namestring"superset"Application name
application_versionstring"latest"Superset Docker image tag
display_namestring"Superset"Human-readable display name
descriptionstring(see module)Module description
db_namestring"superset_db"PostgreSQL database name
db_userstring"superset_user"PostgreSQL application user
cpu_limitstring"2000m"Container CPU limit
memory_limitstring"2Gi"Container memory limit
environment_variablesmap(string){}Environment variables passed through to the container
initialization_jobslist(object)[]Custom init jobs; empty triggers the default two-phase pipeline
startup_probeobjectsee §4Startup health probe
liveness_probeobjectsee §4Liveness health probe
enable_image_mirroringboolfalseMirror to Artifact Registry
min_instance_countnumber1Minimum running instances
max_instance_countnumber5Maximum running instances

Storage & Secrets

VariableTypeDefaultDescription
enable_cloudsql_volumebooltrueCloud SQL Auth Proxy sidecar
gcs_volumeslist(object)[]GCS Fuse volume mounts
regionstring"us-central1"Region for GCS bucket
project_idstringGCP project ID (required for Secret Manager)
resource_prefixstringPrefix for the secret-key secret name
labelsmap(string){}Labels applied to Secret Manager secrets

4. Health Probes

ProbePathInitial DelayTimeoutPeriodFailure Threshold
Startup/health60s5s10s12
Liveness/health30s5s30s3

The 60-second initial delay and 12-failure threshold give Superset up to 180 seconds of total startup tolerance. Gunicorn worker pool initialisation with psycopg2 connection pooling can be slow on first boot.


5. Initialization Jobs

Superset Common provides a two-phase init pipeline by default (when initialization_jobs = []):

Phase 1: db-init

FieldValue
Imagepostgres:15-alpine
Scriptscripts/db-init.sh
execute_on_applytrue
Timeout600s, 1 retry
CPU / Memory1000m / 512Mi

Creates the superset_db database and superset_user PostgreSQL user with appropriate privileges.

Phase 2: app-init

FieldValue
Imagenull (uses the Superset application container)
Scriptscripts/app-init.sh
depends_on_jobs["db-init"]
execute_on_applytrue
Timeout1800s (30 minutes), 1 retry
CPU / Memory1000m / 512Mi

Executes the Superset container to run:

  1. superset db upgrade — applies Flask-AppBuilder and Superset schema migrations
  2. superset fab create-admin — creates the initial admin user
  3. superset init — loads default roles and permissions

Note: The single app-init job combines both db upgrade and admin initialisation into a single pod execution. The 30-minute timeout accommodates complex schema migrations on first run.

Override initialization_jobs with a non-empty list to replace this default pipeline entirely.


6. Scripts and Container Image

Dockerfile

Wraps the public apache/superset:<version> image:

  • Installs psycopg2-binary for PostgreSQL connectivity (requires native compilation — not available as a runtime pip install without build dependencies).
  • Copies app-init.sh and db-init.sh to the container.
  • Exposes port 8088.

db-init.sh

Creates the Superset PostgreSQL database and user via the Cloud SQL Auth Proxy socket.

app-init.sh

Runs the Superset bootstrap sequence: db upgrade, fab create-admin, superset init. Reads admin credentials from environment variables or uses defaults.


7. Secret Manager Resources

ResourceDescription
google_secret_manager_secret.superset_secret_keySecret shell with ID {prefix}-secret-key.
google_secret_manager_secret_version.superset_secret_keyInitial 50-char random value (special=false).

Rotation warning: Rotating SUPERSET_SECRET_KEY invalidates all active user sessions. All logged-in users will be logged out immediately.


8. Platform-Specific Differences

AspectSuperset CloudRunSuperset GKE
min_instance_count11
redis_port typenumber (6379)string ("6379")
session_affinityNot applicable"ClientIP" (recommended)
DB_HOSTCloud SQL Auth Proxy socketCloud SQL private IP
Init jobs timeoutApp-init: 1800sApp-init: 1800s

9. Implementation Pattern

module "superset_app" {
source = "../Superset_Common"

application_name = var.application_name
application_version = var.application_version
db_name = var.db_name
db_user = var.db_user
cpu_limit = var.cpu_limit
memory_limit = var.memory_limit
startup_probe = var.startup_probe
liveness_probe = var.liveness_probe
enable_cloudsql_volume = var.enable_cloudsql_volume
project_id = var.project_id
resource_prefix = local.resource_prefix
region = var.region
labels = var.resource_labels
}

locals {
application_modules = { superset = module.superset_app.config }
module_env_vars = {}
module_secret_env_vars = module.superset_app.secret_ids
module_storage_buckets = module.superset_app.storage_buckets
scripts_dir = abspath("${path.module}/../Superset_Common/scripts")
}