Running Apache Superset with Docker Compose: limits for production

Docker Compose is a sound way to evaluate Apache Superset, but production use needs an external metadata database, backups, a custom image, TLS and a clear point for moving to Kubernetes.

On this page

Running Apache Superset with Docker Compose in production: where it fits

Docker Compose suits evaluation and small internal use of Apache Superset, and it does not make the decisions a production deployment needs. If your team has a working Compose stack and must decide whether it can carry real dashboards for business users, treat the stack as a starting point rather than a finished production design. The default stack brings up the application, a PostgreSQL metadata database, Redis, and Celery worker and beat processes, but it leaves the operational choices to you. The Superset architecture documentation names four components: the Flask and React application, the metadata database, an optional caching layer, and optional Celery worker and beat processes. Alerts and reports, async queries and dashboard thumbnails depend on the caching layer and workers, so a stack that runs them must keep those services healthy as well as the web tier. The Docker Compose guide states that operators must still back up the metadata database and extend the image with their own database drivers and settings. Both tasks fall to your team, and neither is handled by the file you start with.

Before you accept the Compose stack for production, confirm several points in writing. Check whether the metadata database is an external, managed or separately operated PostgreSQL or MySQL instance with a tested backup and restore path, since the architecture documentation does not recommend the Compose PostgreSQL container for production. Confirm that your SECRET_KEY is set from a secret store and not from the example file. Confirm who owns the custom image, how it is rebuilt when Superset releases a new version, and where TLS terminates. Ask the vendor or your platform team which of these responsibilities they will carry after go-live. The answers decide whether Compose remains viable. If the team needs high availability, several web replicas behind a load balancer, managed backups and a routine upgrade process run by a regular release cycle, a single Compose host usually becomes the constraint, and the next step is a platform such as Kubernetes. The Superset Helm chart and the newer Kubernetes Operator each carry their own maturity notes, so verify their status before you choose. Making that call early avoids rebuilding the deployment after dashboards are already in use.

Which production gaps Compose leaves open

The Compose file starts a PostgreSQL container alongside Superset, Redis, and the Celery worker and beat processes. The Superset docs say the bundled database suits trying the stack, not production, and that operators must still back up the metadata database themselves. That database holds dashboards, charts, users, roles and data source connections, so it is the state you have to recover.

  • Move the database out of Compose. Point the metadata connection at a PostgreSQL or MySQL service you run or buy, using a version from the supported range (PostgreSQL 10 to 17, MySQL 5.7 and 8.x).
  • Schedule backups outside the containers. Dump or snapshot the metadata database with the service's own tooling, and store copies away from the host running Compose.
  • Test restores. A backup that has never been restored is unproven. Restore it into a separate instance and open a dashboard to confirm it works.
  • Keep credentials out of the file. Supply the database password through environment variables or a secrets store, not through a Compose file committed to Git.

Confirm who owns the database service, how long backups are retained and how quickly the business expects service to return after a failure.

Deployment options and when each fits

This table compares four ways to run Superset: Compose with the bundled PostgreSQL container, Compose against an external metadata database, a PyPI install on a VM, and Kubernetes. Read each row against your team's skills and who will own backups and upgrades. The main takeaway is that the bundled Compose database suits evaluation, while production needs an external, backed-up metadata database whichever option you choose.

OptionFit and main trade-offTeam skills and failure handlingBackup and upgrade ownership
Compose with bundled PostgreSQLFastest path to a running stack, but the project does not recommend its PostgreSQL container for productionDocker and Compose knowledge; restarts and volume recovery are your jobYou back up the metadata database and extend the image yourself
Compose with external PostgreSQL or MySQLKeeps the metadata database on a service you already operate, the common step up from the bundled containerDocker plus database administration; confirm the database version is within the supported rangeDatabase team or provider owns backups; you own the upgrade sequence and staging tests
PyPI install on a VMFits teams that run Python services on Linux and want no container layerPython packaging, OS libraries, process supervision; you add Redis and Celery yourself for full featuresYou back up the metadata database and manage each upgrade in place
Kubernetes with the Helm chartThe chart is marked deprecated in current development docs, so confirm its status before choosing it for new workCluster operations, Helm, ingress and secrets management; failure handling depends on cluster designPlatform team owns cluster upgrades; you own Superset chart and release changes
Kubernetes Superset OperatorNewer path that the current docs point new deployments toward, but it is alpha with a v1alpha1 API that may change between releasesKubernetes operator skills plus tolerance for schema changes between releasesPlan for manifest rewrites on upgrade; confirm backup and restore steps with the project

Moving a Compose evaluation stack toward production

This sequence turns a Docker Compose evaluation into a stack with a pinned version, an external metadata database, managed secrets, TLS and tested backups. Each step closes with a check the team can repeat before users depend on the stack.

  1. Pin the Superset version and review releases

    The platform team chooses one Superset version and records it in the build and deployment files, so no step pulls a floating tag. Before choosing, they read the release list on the project's GitHub releases page and check the PyPI package history for the candidate release, noting that pre-release tags such as release candidates should not be used for production. Done means the chosen version appears in version control with a short note on why it was selected and which release notes were reviewed.

  2. Build a custom image with required drivers

    The team extends the official Superset image with the database drivers their analysts need, and adds any other packages their configuration depends on. The Compose file then references this image by a versioned tag instead of building from the default. Done means the image builds from a clean checkout, the driver imports succeed inside a running container, and the image tag is stored in the same repository as the Compose file.

  3. Set a SECRET_KEY outside the image

    The security or platform engineer generates a unique SECRET_KEY and injects it at runtime from a secret store or protected environment file, so it never lands in the image or in Git. Superset requires a user-specified key to start, so the stack will fail to boot without it, which makes the check straightforward. Done means the application starts with the injected key, the key is absent from the repository and image layers, and the team has recorded where the key is held and who can read it.

  4. Point the metadata database at an external instance

    The database team provisions a PostgreSQL or MySQL instance that Superset is tested with, using a version within the range listed in the configuration documentation, and removes the Compose PostgreSQL container from the production file. The connection string is supplied through secrets. Done means Superset connects to the external host, superset db upgrade completes against it, and the database version is confirmed as supported in the project's configuration documentation.

  5. Configure Redis and Celery workers

    The team confirms that Redis, the Celery worker and the Celery beat service run as separate, supervised services with their own configuration, since alerts and reports, async queries and dashboard thumbnails depend on them. Connection details for the caching layer come from the same secret source. Done means a test async query returns results through the worker, a scheduled test task runs on the beat schedule, and restarting the worker does not lose queued work the team expects to keep.

  6. Place a reverse proxy with TLS in front

    The network or platform team puts a reverse proxy or cloud load balancer in front of the web service, terminates TLS there with certificates from the organization's authority, and configures the proxy settings Superset expects. The proxy also needs routing for WebSocket connections used by async queries. Done means the application loads only over HTTPS, the browser shows a valid certificate chain, and an async query completes through the proxy path.

  7. Set up and test metadata database backups

    The database owner schedules backups of the external metadata database and stores copies outside the host that runs Superset. A restore is then performed into a separate instance, and the team checks that users, dashboards and saved configuration appear. Done means a restore from the most recent backup has been completed on a test instance and verified by opening a known dashboard, and the restore steps are written down with the owner named.

  8. Rehearse an upgrade in staging

    Before any production change, the team applies the target Superset version to a staging copy with a restored database, following the upgrade guide. They back up the database first, run superset db upgrade and superset init, and review UPDATING.md for breaking changes between the current and target versions. Done means staging runs the new version with no migration errors, key dashboards and alerts behave as before, and the team has a written rollback plan tied to the pre-upgrade backup.

Security risks in a Compose stack that reaches production

A Compose file that works on one host can carry risks that a production stack cannot accept. The cards below cover the secrets, network exposure, credentials, authentication, patching and data handling that connect the Superset containers to your databases and your users.

SECRET_KEY and rotation

Superset requires a user-specified SECRET_KEY to start, and the value signs session data. Compose stacks often ship a placeholder or commit the value to the repository. Store it in a secret manager or an environment file outside Git, and confirm who can read it. When you rotate it, use PREVIOUS_SECRET_KEY so existing sessions keep working during the change, then remove the old value once the rotation is complete.

Exposed ports and network segmentation

The default Compose file publishes ports on the host, and the metadata database and Redis may be reachable from the same network as the web tier. Publish only the reverse proxy port, keep PostgreSQL and Redis on an internal Docker network, and confirm with docker compose ps and a scan from outside the host. Ask whether your hosting environment adds its own firewall rules that override Docker's port publishing.

Metadata and warehouse credentials

The metadata database holds Superset's users, dashboards and database connection details, so its password is a high-value target. Each warehouse connection should use a dedicated read-only account scoped to the schemas its dashboards need, not a personal or administrator login. Rotate these passwords on a schedule you can document, and keep them out of superset_config.py and image layers.

Authentication source and role mapping

Superset's login can come from OAuth2 providers, LDAP or the built-in database users. Choosing a source decides who can sign in after an employee leaves. Map identity provider groups to Superset roles with AUTH_ROLES_MAPPING, and test that a removed group loses access on the next sign-in. Confirm whether local database accounts remain enabled as a fallback and who controls them.

Host and image patching

Compose pins images by tag, and nothing updates them automatically. The host operating system, Docker Engine, the Superset image, PostgreSQL and Redis each have their own patch cycle. Record the versions in use, subscribe to the project's release notes, and plan a staging test before each upgrade. Read the upgrade notes for breaking changes before you move a tag forward.

Logs and backup access

Container logs, the metadata database dump and Docker volumes can each expose user names, query text and connection details. Restrict who can read docker logs, the volume paths on the host and backup storage, and encrypt backups at rest. Ask who holds restore rights and whether restores are logged, because a backup copy of the metadata database is as sensitive as the live system.

Questions teams ask before running Superset on Compose

How much effort does it take to move Superset off the default Compose stack?

Moving off the default stack is mainly a set of changes to the metadata database, the image, secrets, TLS and the backup routine, so the effort depends on how many of those are already in place. The default Compose file uses a PostgreSQL container for metadata, which the Superset architecture documentation does not recommend for production, so you will usually replace it with a managed or separately operated PostgreSQL or MySQL instance. Supported metadata versions are PostgreSQL 10 to 17 and MySQL 5.7 and 8.x, so confirm your target version against that list. Effort rises with the number of database drivers you need, the number of environments, whether you run alerts, reports and async queries with Redis and Celery, and how much of the configuration lives in environment variables versus superset_config.py. Ask any partner to break the work down by these items.

Can our own platform team do this work internally?

Often yes, if your team already operates containers, managed databases, a reverse proxy and an identity provider, and has someone who can read Superset's upgrade notes. The skills that matter most are database operations, secret handling, certificate management and release testing, not Superset-specific knowledge alone. Check three things before deciding: whether you have a staging environment that mirrors production, whether someone owns the backup and restore test, and whether the people on call know how Celery workers and beat behave when Redis is unavailable. If any of these are missing, an implementation partner can build them under a written scope, and you keep the operating runbook. Compare the internal estimate against the same checklist so the two options are measured the same way.

What does the work need from our side before it starts?

Expect to provide access and decisions rather than hands-on build time alone. The usual inputs are a metadata database host or managed instance with credentials, DNS names for the Superset and any worker-facing endpoints, TLS certificates or the ability to issue them from your certificate authority, the identity provider details if you use OAuth2, OIDC or LDAP, a staging environment, and a named owner who can approve the production cut-over. You will also need to decide where secrets live, since SECRET_KEY must be set before Superset starts. Confirm the exact list with your own network and security teams, because firewall rules, proxy policies and DNS change requests often have longer lead times than the software work itself.

How long does the migration take, and what changes the timeline?

No duration figure is supplied for this work, so treat any number you hear as a claim to verify against a written scope. The timeline is driven by the number of components in scope (web application only, or web application plus Redis, Celery worker and beat), the metadata database migration path, the count of custom database drivers and images, identity provider integration, and how many approval cycles your change process requires. Staging validation and a rehearsed restore usually take longer than the configuration changes. Ask for milestones tied to each component and a list of the decisions that must be made before build starts.

At what point is Kubernetes a better choice than Compose?

Compose suits a single host or a small set of hosts with a clear owner, a managed metadata database and a stable workload. Kubernetes becomes the better option when you already run a cluster platform, need scheduling across several nodes, want standard rolling updates and health probes, or must follow platform-wide policies for networking and secrets. Be aware that the Superset 6.1.0 documentation describes installs with the official Helm chart, while the current development documentation marks that chart as deprecated and points new deployments to the Apache Superset Kubernetes Operator. The operator is in alpha with a v1alpha1 API whose schemas may change between releases, so plan for changes to your manifests during upgrades.

What happens to backups and upgrades when we run Superset on Compose?

Compose does not back up your data for you. The Superset docs state that operators must still back up the metadata database, so the backup schedule, retention and restore test sit with your team or your partner. Before each upgrade, the Superset upgrade documentation says to back up the metadata database, run superset db upgrade and superset init, test in staging first, and check UPDATING.md for breaking changes between versions. Keep the Compose file, image tag and superset_config.py in version control so you can roll back to a known state. Confirm your restore time objective and recovery point objective with your own risk owners, since neither is provided here.

Does the Compose stack meet our compliance and security requirements?

The Compose file alone does not settle compliance or security. It is a starting point that lacks a production metadata database, a defined secret strategy, TLS termination and an upgrade process, and each of these must be designed and evidenced. DeployOpen prepares systems, controls and evidence for compliance assessments, but it does not issue audit reports, attestations or certifications; independent auditors and certification bodies do that. Ask your auditor which controls they will test and map those to your Superset configuration before the build starts.

Limits to confirm in your environment

Docker Compose can run a Superset stack, but several decisions decide whether it fits your production needs. The cards below cover the release, database, host, orchestration and image choices to confirm before you build. Each one is a point where a Compose setup can stop matching what your organization requires.

Release and pre-release status

Confirm which Superset release you will run and whether it is a stable release or a pre-release. The release list on GitHub shows 7.0.0rc2 as a pre-release dated October 16, 2026, so an rc tag should not reach production. Pin the exact version in your Compose file and record the upgrade path before the first deployment. Check the release notes and UPDATING.md before any version change.

Metadata database version support

The Compose file ships a PostgreSQL container, but the project does not recommend that container for production. Plan an external PostgreSQL or MySQL service and confirm that its version falls within the supported range in the configuration documentation. Ask your database team who backs it up, how restores are tested, and where the data lives. Compose does not provide those controls on its own.

Single host availability

A Compose stack normally runs on one host, so a host failure takes down the web app, workers and cache together. Compare the outage you can accept for dashboards, scheduled reports and async queries with what one VM provides. Confirm who patches the host, how it is restored, and whether a second host or a managed database changes that answer. Document the result before you sign off.

Kubernetes operator maturity

If you expect to move to Kubernetes later, confirm the status of the Apache Superset Kubernetes Operator before you plan around it. The project documents it as alpha, with a v1alpha1 API whose custom resource schemas may change between releases. Do not treat it as a stable target for a multi-year plan. Ask the team that will own it how they will handle breaking changes.

Helm chart deprecation

The 6.1.0 documentation describes Kubernetes installs with the official Helm chart, but current development docs mark that chart as deprecated and point new deployments to the operator. Decide which path your platform team will follow before you write Kubernetes manifests or Helm values. Any values you carry over from a Compose setup should be reviewed against the release you actually run.

Custom image for drivers and identity

The stock image does not include every database driver or identity library your environment needs. List the warehouses you will query and the identity provider you will use, then confirm which Python packages each requires. Build a custom image that adds them, pin the base version, and scan the result before deployment. Keep the build recipe in version control so the image can be rebuilt during an upgrade.

When Compose stops being enough and Kubernetes starts to make sense

Move off Docker Compose when the cost of running it by hand starts to exceed the cost of a platform. The clearest signals are several environments that must receive the same release through the same process, web and Celery worker capacity that needs to scale independently of each other, availability requirements that a single Compose host cannot meet, and an existing cluster platform team that already runs deployment, monitoring and backups for other services. Any one of these can justify a move. Two or more usually do. Before deciding, write down which signals apply to you and who would own the cluster, upgrades and on-call for Superset.

The Kubernetes path has a maturity problem you must plan around. The Superset 6.1.0 documentation describes installs with the official Helm chart, but the current development documentation marks that chart as deprecated and points new deployments to the Apache Superset Kubernetes Operator. The Operator is built with the Go Operator SDK and is in alpha, with a v1alpha1 API whose custom resource schemas may change between releases. Confirm the current guidance in the Superset Kubernetes installation documentation before you pick a method, and ask whether your upgrade process can absorb schema changes on a release you did not choose.

If you stay on Compose for now, design it so the move is cheap later. Keep the metadata database external and backed up, keep superset_config.py and the SECRET_KEY out of the image, and keep the custom image reproducible. Those three choices carry over to any orchestrator. A move to Kubernetes then changes the deployment layer, not the data or configuration you have already protected. Ask the platform team to test a staging install on the Operator and the Helm chart side by side, and record which one they would support for the next two years.

How DeployOpen scopes and delivers a production Superset stack

DeployOpen plans, implements, hardens, documents and supports self-hosted open-source platforms inside your own infrastructure, so a Superset stack meant for production is designed around your data, identity and network rules. Each engagement starts with a written scope that states what the Compose topology replaces, what it keeps, and what moves to another platform.

How we scope

  • Confirm whether Docker Compose fits your availability, backup and staffing needs before any build starts.
  • Name the external PostgreSQL or MySQL metadata database, its version and where its backups are held.
  • Record which optional Redis and Celery components, alerts, reports and async queries are required.

How we build

  • Build a custom image with your database drivers and pinned versions instead of running the default container.
  • Set SECRET_KEY, TLS termination and proxy settings from your secret store, not from files in the repository.
  • Test each upgrade in staging first, following the project's upgrade steps and UPDATING.md breaking change notes.

How we hand over

  • Deliver the Compose files, image build definition, configuration and a runbook for restore and upgrade.
  • Document the criteria that would trigger a move from Compose to Kubernetes, with the Helm chart and operator status noted.
  • Walk your platform and security teams through backup restore tests and the evidence they should keep.

How we support

  • Offer ongoing support, upgrades and continuous testing as a retainer after handover, scoped in writing.
  • Review each new Superset release notes and configuration changes against your deployment before rollout.
  • Confirm with your team which parts of ongoing support you want, since scope and cost follow the written agreement.

Sources and further reading

Talk to our team.

Tell us what you're working on, whether it's a deployment, an audit, a security test or a cyber range. You'll speak with an engineer who can help you scope it.

  • 30-minute call: free, with no obligation.
  • NDA on request: we can sign before you share details.
  • Clear next steps: a scope and plan after the call.