Self-Hosted Deployment Guide
This guide walks you through deploying Qualytics in your own Kubernetes environment.
Deployment model
This guide covers a self-hosted deployment, where Qualytics runs in infrastructure operated by your organization. Qualytics operates managed deployments, so managed deployment customers do not need this guide.
Deployment Overview
A self-hosted Qualytics deployment consists of the following steps:
flowchart LR
A[1. Provision\nInfrastructure] --> B[2. Configure\nKubernetes]
B --> C[3. Deploy via\nHelm Chart]
C --> D[4. Configure\nAuthentication]
D --> E[5. Configure\nDNS and TLS]
E --> F[6. Verify\nDeployment]
F --> G[7. Activate\nLicense]
Prerequisites
Before you begin, ensure you have the following:
| Requirement | Details |
|---|---|
| Kubernetes cluster | Version 1.30+ on any CNCF-compliant control plane |
| Cluster capacity | Application, driver, and worker capacity sized for the approved deployment tier; review the current Cluster Sizing Guide |
| CLI tools | kubectl configured for your cluster, Helm 3.12+, and curl |
| Qualytics configuration | An image registry token, a unique deployment identifier, and an approved Helm chart version from your Qualytics account manager |
| Domain name | A fully qualified domain name resolvable by your users |
| Authentication configuration | Either OIDC credentials from your identity provider or Auth0 credentials from Qualytics |
Qualytics-Provided Configuration
Qualytics sends the following items through an agreed secure channel before installation or upgrade:
| Item | Purpose |
|---|---|
| Image registry token | Authorizes downloads of private Qualytics container images. |
| Deployment identifier | Identifies one deployment. Paste it exactly as received and never reuse it for another deployment. |
| Approved Helm chart version | Pins the chart, configuration template, and image set to the release approved for your deployment. |
The platform license is a separate artifact requested after installation.
Protect installation artifacts
Store the registry token, deployment identifier, populated values.yaml, license request, and signed license according to your organization's secret-handling policy.
Step 1: Provision Infrastructure
Qualytics supports Kubernetes clusters hosted on AWS (EKS), GCP (GKE), Azure (AKS), and CNCF-compliant on-premises distributions.
Terraform templates
Ready-to-use Terraform templates create the required node pools, storage classes, and networking configuration:
Node Requirements
The standard topology uses nodes with the following labels:
| Label | Purpose | Scaling | EKS | GKE | AKS |
|---|---|---|---|---|---|
appNodes=true |
Application services | Autoscaling (1 on-demand node) | m8g.2xlarge (8 vCPUs, 32 GB) | n4-standard-8 (8 vCPUs, 32 GB) | Standard_D8s_v6 (8 vCPUs, 32 GB) |
driverNodes=true |
Processing driver | Autoscaling (1 on-demand node) | r8g.2xlarge (8 vCPUs, 64 GB) | n4-highmem-8 (8 vCPUs, 64 GB) | Standard_E8s_v6 (8 vCPUs, 64 GB) |
executorNodes=true |
Processing workers | Autoscaling (1-12 spot nodes) | r8gd.2xlarge (8 vCPUs, 64 GB, 474 GB SSD) | n2-highmem-8 + Local SSD (8 vCPUs, 64 GB) | Standard_E8ds_v5 (8 vCPUs, 64 GB, 300 GB SSD) |
Flexible node configuration
- You can schedule driver and worker workloads on one node group by configuring
driverNodeSelectorandexecutorNodeSelectorwith the same label. - You can also leave node selectors empty and use any available cluster nodes. Dedicated node groups with autoscaling are recommended for production workloads.
Local SSD storage
Local SSD storage on processing worker nodes improves performance but is not required. Without local SSD, temporary processing data uses the node's available ephemeral storage. Size and monitor that storage for your expected workload.
Step 2: Configure Kubernetes
Create Namespace and Registry Secret
Create the image pull Secret with the registry token provided by Qualytics. The prompt keeps the token out of your shell history.
kubectl create namespace qualytics
printf "Qualytics registry token: "
IFS= read -rs QUALYTICS_REGISTRY_TOKEN
echo
kubectl create secret docker-registry regcred \
--namespace qualytics \
--docker-username qualyticsai \
--docker-password "$QUALYTICS_REGISTRY_TOKEN"
unset QUALYTICS_REGISTRY_TOKEN
Private registry option
If your cluster cannot connect to Docker Hub, mirror every image required by your approved chart version into your own registry. Follow Qualytics Docker Images, then update the image URLs in values.yaml.
Authenticate without placing the token on the command line:
Step 3: Deploy via Helm Chart
Add the Qualytics Helm Repository
Create Your Configuration File
Download the template from the release tag that matches the chart version approved by Qualytics. This keeps the available settings and image references aligned with the release you install.
CHART_VERSION="<version provided by Qualytics>"
curl --fail --location \
"https://raw.githubusercontent.com/Qualytics/qualytics-self-hosted/qualytics-${CHART_VERSION}/template.values.yaml" \
--output values.yaml
chmod 600 values.yaml
Do not commit or share a populated values.yaml. GitOps users should store sensitive values with their organization's encrypted secret-management workflow.
Configure Required Values
Deployment identifier
Paste the identifier provided by Qualytics exactly as received. Do not base64-encode it or reuse it for another deployment.
Important
Every installation requires a deployment identifier. Keep the same identifier for the life of the deployment, including upgrades. Helm stops during rendering if the value is missing, before changing Kubernetes resources.
DNS record
Authentication
Choose one authentication mode:
Configure direct integration with your identity provider. See the OIDC Configuration Guide for advanced options.
See the Auth0 Setup Guide for how to request these values from Qualytics.
Service credentials
Generate a different secure random value for each credential.
secrets:
auth:
jwt_signing_secret: "your-secure-jwt-secret" # Minimum 32 characters
postgres:
secrets_passphrase: "your-secure-passphrase"
rabbitmq:
rabbitmq_password: "your-secure-password"
Use openssl rand -base64 32 to generate each value.
Optional configuration
- Set
nginx.enabled: trueif you need the chart to install an ingress controller. - Set
ingress.enabled: trueto create the Qualytics ingress resources. - Provide an existing Kubernetes TLS Secret for ingress encryption. The chart does not issue TLS certificates.
- Configure SMTP for email notifications, invitations, and password resets. See the SMTP Configuration Guide.
To inspect every setting for the selected release, run:
Database Configuration (Optional)
Qualytics can use the PostgreSQL instance included with the chart or an external PostgreSQL-compatible database. Set connection credentials in secrets.postgres and set postgres.enabled: false when using an external database.
The default PostgreSQL schema is public. To use another schema, set:
For an external database, ask your database administrator to create the schema and grant the Qualytics database user the required permissions before installation. Changing postgres.schema after installation does not move existing tables. Plan and complete a database migration before changing it for an existing deployment.
Deploy
Use the exact chart version approved by Qualytics.
CHART_VERSION="<version provided by Qualytics>"
helm upgrade --install qualytics qualytics/qualytics \
--namespace qualytics \
--create-namespace \
--version "$CHART_VERSION" \
-f values.yaml \
--wait \
--timeout=20m
Monitor Deployment
Wait until the expected application pods show a Running status before proceeding.
Step 4: Configure Authentication
Qualytics supports two authentication modes for self-hosted deployments:
| Mode | Recommended For | Details |
|---|---|---|
| OIDC (Recommended) | Air-gapped and standard self-hosted deployments | Integrates directly with your enterprise identity provider |
| Auth0 | Deployments with internet access | Managed by Qualytics and requires access to auth.qualytics.io |
Step 5: Configure DNS and TLS
Get the ingress IP address from your deployment:
# If using the included ingress controller
kubectl get svc -n qualytics qualytics-nginx-controller
# Or check ingress resources
kubectl get ingress -n qualytics
Configure DNS
Use one of these options.
Option A: Qualytics-Managed DNS (Recommended)
For a hostname under qualytics.io, send the ingress IP address to your Qualytics account manager so Qualytics can configure the DNS record.
Option B: Custom Domain
For your own domain, create a DNS record that points to the ingress IP address.
Set global.dnsRecord in values.yaml to the resulting hostname.
Configure TLS
The chart uses an existing Kubernetes TLS Secret and does not install a certificate issuer. Obtain a certificate for the configured hostname through your organization's approved process, then create the Secret in the release namespace:
kubectl create secret tls qualytics-tls-cert \
--namespace qualytics \
--cert=./fullchain.pem \
--key=./privkey.pem
Reference the Secret in values.yaml:
See Ingress TLS Configuration for additional options.
Step 6: Verify Deployment
-
Check pod health. Verify that all pods are running:
-
Check API health. Verify that the API responds:
-
Test authentication. Open the configured domain and sign in with OIDC or Auth0.
Step 7: Activate Your License
Self-hosted deployments require a valid license. A 31-day grace period starts when you create the first datastore connection. During the grace period, the platform is fully functional without a signed license. The Settings > Status page shows the remaining time.
Activate before the grace period ends
If the grace period or license expires, new manual and scheduled data operations cannot start. Operations already running can complete, and the application remains accessible so an Admin can apply a license.
Requesting a License
- Sign in with the Admin role and open Settings > Status.
- Select Generate License Request.
- Send the request to your Qualytics account manager through the agreed secure channel. Do not send it in ordinary email.
- Qualytics returns a signed license.
Applying a License
- In Settings > Status, select Update License.
- Paste the signed license and submit it.
- Confirm that the Status page shows the expected expiration date.
Renewal
Generate a new request, send it to Qualytics through the agreed secure channel, and apply the returned signed license.
- A warning appears when the license expires within 30 days.
- Renew before expiration to avoid interruption to new data operations.
Deployment identifier and license
The signed license is applied through the application and is not stored in Helm values. The deployment identifier remains required in values.yaml; it is not the license request or signed license.
Air-Gapped Deployments
Qualytics can run without internet egress after the approved release artifacts are available inside your environment.
- Obtain the approved chart archive, matching configuration template, and image list through your agreed delivery process.
- Mirror every image required by that chart version into a registry reachable from the cluster. Use
docs/docker-images.mdfrom the same release tag as the checklist. - Update all image URLs and registry credentials in your secure configuration.
- Install from the local chart archive instead of the online Helm repository.
- Use OIDC and ensure the cluster can reach your identity provider.
The deployment identifier is still required. Auth0 requires access to auth.qualytics.io, so it is not suitable for an environment with no internet egress.
Upgrading
Update the Helm Repository
Add the Helm repository if needed, refresh it, and list available versions:
helm repo add qualytics https://qualytics.github.io/qualytics-self-hosted
helm repo update
helm search repo qualytics/qualytics --versions
Use the exact target version approved by Qualytics. Download its template for comparison, but do not overwrite your populated values file:
CHART_VERSION="<version provided by Qualytics>"
curl --fail --location \
"https://raw.githubusercontent.com/Qualytics/qualytics-self-hosted/qualytics-${CHART_VERSION}/template.values.yaml" \
--output "template.values.${CHART_VERSION}.yaml"
Review new and changed settings, then apply them to your existing values.yaml. Keep the deployment identifier unchanged.
Identifier required for current releases
Existing installations must obtain an identifier from Qualytics and add it before upgrading to chart version 2026.7.21 or later. If it is missing, Helm stops during rendering before changing Kubernetes resources.
Run the Upgrade
helm upgrade --install qualytics qualytics/qualytics \
--namespace qualytics \
--version "$CHART_VERSION" \
-f values.yaml \
--wait \
--timeout=20m
Monitor Upgrade Progress
Watch until the upgraded application pods are running.
Verify the Upgrade
Confirm that the application is accessible, authentication succeeds, and the API health endpoint responds.
Troubleshooting
Common Issues
Missing Deployment Identifier
If Helm reports secrets.deployment.identifier is required, confirm that the value is present at the exact path shown below:
Paste the value exactly as Qualytics provided it. Do not base64-encode it. Contact your Qualytics account manager if you have not received an identifier for this deployment.
Pods Stuck in Pending State
- Check node resources:
kubectl describe nodes - Verify that node selectors match your cluster labels.
- Ensure the configured storage classes are available.
Image Pull Errors
- Confirm that the registry Secret exists:
kubectl get secret regcred -n qualytics - Inspect the affected pod's events:
kubectl describe pod <pod-name> -n qualytics - Confirm that the cluster can reach the configured registry and that the token has not expired.
Ingress Not Working
- Ensure an ingress controller is installed and running.
- Check the ingress resources:
kubectl describe ingress -n qualytics - Confirm that the TLS Secret exists:
kubectl get secret qualytics-tls-cert -n qualytics
Authentication Errors
- For OIDC issues, see OIDC troubleshooting.
- For Auth0 issues, verify the supplied values with your Qualytics account manager.
Useful Commands
# Check all resources
kubectl get all -n qualytics
# View logs for a specific pod
kubectl logs -f <pod-name> -n qualytics
# View processing driver logs
kubectl logs -f deployment/qualytics-spark -n qualytics
# View detailed pod information
kubectl describe pod <pod-name> -n qualytics
Need help?
Contact your Qualytics account manager for assistance with deployment issues.