Skip to main content
Note: This guide assumes you have access to the Distr customer portal. If you haven’t received your invite yet, see the Getting started section in Overview.

Before you deploy

  1. Pick a size. See Sizing to choose between a single server and Kubernetes.
  2. Create the four required secrets in the Distr portal before the first deployment: LICENSE_KEY, POSTGRES_PASSWORD, CRYPTO_KEY, and PRISMA_FIELD_ENCRYPTION_KEY. See Configure for how to generate them. For a manual deployment, put them in your .env file or Helm values instead.
  3. Set BASE_URL to the full public URL, including the scheme: http://<host>:3000 or https://basedash.example.com.
  4. Open inbound access. Open port 3000, or put a reverse proxy on 443 in front of it. See TLS and reverse proxy.
  5. Allow outbound HTTPS to charts.basedash.com. The server validates its license there at startup and won’t start without it. See Network requirements.
AI and SMTP can wait. Email defaults to log (login codes are written to the app logs), and AI shows a banner until you add a provider key. Each Compose version also ships a “First-run checklist” in the Distr portal.

Deployment methods

Basedash uses Distr to distribute self-hosted releases. Releases use calendar versions (for example 2026.09.30), and each one is published as both a Docker Compose and a Kubernetes (Helm) version.

Docker Compose with the Distr agent

The Distr agent runs on your server, pulls the version you select in the Distr portal, deploys it with Docker Compose, and reports its status back. It only makes outbound connections, so you don’t need to open any ports for it. Prerequisites:
  • A Linux server with Docker and the Docker Compose plugin
  • Outbound HTTPS to Distr Hub and registry.distr.sh
  • Target credentials from the Distr portal (targetId and targetSecret)
Installation:
  1. In the Distr portal, open your deployment target and copy the installation command. It looks like curl "https://<hub>/api/v1/connect?targetId=<id>&targetSecret=<secret>" | docker compose -f - up -d.
  2. Run the command on your server.
  3. In the portal, select a Basedash version, fill in the environment template, and deploy.
The targetSecret is shown only once. Store it securely. Updates: select a new version in the Distr portal. Basedash never updates your deployment automatically. Don’t run docker compose up yourself on an agent-managed server. If something fails, fix it and retry the deploy from the Distr portal. Registry authentication: the agent logs in to registry.distr.sh by itself. If image pulls fail with no basic auth credentials:
  • Use the same user that installed the agent. sudo docker login writes /root/.docker/config.json; without sudo it writes ~/.docker/config.json. The agent mounts one of those paths, so if you mix them, login “succeeds” but pulls still fail.
  • On Docker Desktop, remove credStore / credsStore from ~/.docker/config.json, run docker login again so an "auth" entry is stored in the file, then restart the agent.
  • Run docker inspect on the agent container to confirm /root/.docker is mounted from the directory you logged in to.

Docker Compose without the agent

Use this when you deploy with your own tooling or CI/CD and want to control exactly when updates happen. Prerequisites:
  • A Linux server with Docker and the Docker Compose plugin
  • A Personal Access Token (PAT) from the Distr portal
Installation:
  1. Log in to the Distr registry with your PAT:
  2. Download the Compose file and environment template for the version you want from the Distr portal. The Compose file already pins the matching app image.
  3. Fill in the environment template. See Configure for the required values.
  4. Start Basedash:
    On the first deploy, run without -d to watch the logs. Configuration errors stop the app before it starts listening.
If you write your own Compose file, pin the image to a release, for example registry.distr.sh/basedash/charts-self-hosted-app:2026.09.30. Don’t use latest. Updates: download the new version’s Compose file from the Distr portal, replace the old one, then run:
Database migrations run automatically when the new container starts.

Kubernetes

Use Kubernetes when you need more than one app replica. That’s usually above 500 users, or whenever you need high availability. Prerequisites:
  • Kubernetes 1.28+
  • Helm 3.x and kubectl configured for your cluster
  • An ingress controller (or load balancer) to terminate TLS
  • A managed PostgreSQL 16+ instance for production (recommended; see Sizing)
  • A Personal Access Token (PAT) from the Distr portal
You can deploy the Helm chart from the Distr portal, or install it yourself with Helm.

Option 1: Distr-managed

  1. In the Distr portal, create a Kubernetes deployment target and run the install command it shows in your cluster. This installs the Distr agent.
  2. Select a version of the Basedash Kubernetes application.
  3. Fill in the values template. The four required secrets come from your Distr secrets, so you only need to set app.baseUrl plus any email, AI, and sizing values (see the example below). To use an external database, also create the basedash-secrets secret from step 1 below and set secrets.existingSecret: basedash-secrets.
To update, select a new version in the portal.

Option 2: Install with Helm

  1. Create an image pull secret and an app secret:
    The chart reads postgres-password from this secret even when you use an external database, so always include it.
  2. Log in to the chart registry and check the latest chart version. Its appVersion is the Basedash release it was built for.
  3. Create values.yaml:
    See Configure for AI, email, S3, and Slack values.
  4. Install the chart:
  5. Verify the deployment:
Bundled PostgreSQL: if you leave postgres.enabled: true, the chart runs PostgreSQL 16 as a StatefulSet with a 10Gi volume and a 1Gi memory limit. That’s fine for a trial, but raise postgres.persistence.size and postgres.resources before real use, or use a managed database. Updates: set app.image.tag to the new release, then upgrade to the matching chart version:
Migrations run automatically when the new pods start.

Before you upgrade

  • Back up the database (see Database backups).
  • Read the release notes for each version you’re skipping. They’re attached to every version in the Distr portal. Some releases include migrations that can’t be rolled back, and the notes call these out.

Restricted networks

Basedash must reach charts.basedash.com over HTTPS to validate its license at startup and every 6 hours. Everything else can stay inside your network: AI providers, email, and object storage are optional or can point at internal endpoints. If you can’t allow outbound access to charts.basedash.com, contact support@basedash.com before deploying.

Sizing

Note: These numbers assume the machines run only Basedash. Add headroom for anything else running alongside it.
Basedash runs as an app container (web server, background jobs, and chart image rendering) plus PostgreSQL. What drives load is how many people use it at the same time, not how many seats you license. In enterprise rollouts, expect 10–20% of users to be active in the busiest hour. One app container comfortably serves about 500 users, and it never uses more than about 4 GB of memory. Past that point, a bigger server won’t help: add app replicas on Kubernetes and move PostgreSQL to a managed instance. App replicas: give each replica 2 vCPU and 4 GiB of memory (request 1 vCPU and 3 GiB), as in the Helm example above. Plan for about one replica per 500 users, with at least 2 for high availability. Add replicas if CPU stays above 70% at peak. PostgreSQL connections: each app replica opens up to 60 connections. Set max_connections to at least 60 × your maximum replica count, plus 20. The bundled PostgreSQL allows 200, which is enough for 3 replicas. Storage: the database holds AI chat history, cached query results, and metadata about your data sources’ schemas. It grows with AI usage and the size of your connected schemas rather than with the number of dashboards. The sizes above leave plenty of headroom; monitor disk usage and expand as needed. Avoid burstable instances (such as AWS t3 or t4g) for production. Scheduled refreshes, automations, and chart rendering keep a steady CPU load that drains burst credits. Equivalent instance types:

Network requirements

Inbound:
  • Port 3000 (plain HTTP) by default, or 443 if a reverse proxy or ingress terminates TLS in front of the app
Outbound HTTPS:
  • charts.basedash.com: license validation at startup and every 6 hours (required)
  • registry.distr.sh: container images and the Helm chart
  • Distr Hub: agent deployments only
  • Your AI provider, email provider (SMTP or SES), and S3-compatible storage, if configured
Data sources: the app needs a network path to every database and warehouse you connect.