The helm chart for ClickStack can be found here and is the recommended method for production deployments.
By default, the Helm chart provisions all core components, including:
- ClickHouse
- HyperDX
- OpenTelemetry (OTel) collector
- MongoDB (for persistent application state)
However, it can be easily customized to integrate with an existing ClickHouse deployment - for example, one hosted in ClickHouse Cloud.
The chart supports standard Kubernetes best practices, including:
- Environment-specific configuration via
values.yaml - Resource limits and pod-level scaling
- TLS and ingress configuration
- Secrets management and authentication setup
Suitable for
- Proof of concepts
- Production
Deployment steps
Prerequisites
- Helm v3+
- Kubernetes cluster (v1.20+ recommended)
kubectlconfigured to interact with your cluster
Add the ClickStack Helm repository
Add the ClickStack Helm repository:
helm repo add clickstack https://clickhouse.github.io/ClickStack-helm-charts
helm repo updateInstalling ClickStack
To install the ClickStack chart with default values:
helm install my-clickstack clickstack/clickstackVerify the installation
Verify the installation:
kubectl get pods -l "app.kubernetes.io/name=clickstack"When all pods are ready, proceed.
Forward ports
Port forwarding allows us to access and set up HyperDX. Users deploying to production should instead expose the service via an ingress or load balancer to ensure proper network access, TLS termination, and scalability. Port forwarding is best suited for local development or one-off administrative tasks, not long-term or high-availability environments.
kubectl port-forward \
pod/$(kubectl get pod -l app.kubernetes.io/name=clickstack -o jsonpath='{.items[0].metadata.name}') \
8080:3000Customizing values (optional)
You can customize settings by using --set flags. For example:
helm install my-clickstack clickstack/clickstack --set key=valueAlternatively, edit the values.yaml. To retrieve the default values:
helm show values clickstack/clickstack > values.yamlExample config:
replicaCount: 2
resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 250m
memory: 256Mi
ingress:
enabled: true
annotations:
kubernetes.io/ingress.class: nginx
hosts:
- host: hyperdx.example.com
paths:
- path: /
pathType: ImplementationSpecifichelm install my-clickstack clickstack/clickstack -f values.yamlUsing secrets (optional)
For handling sensitive data such as API keys or database credentials, use Kubernetes secrets. The HyperDX Helm charts provide default secret files that you can modify and apply to your cluster.
Using pre-configured secrets
The Helm chart includes a default secret template located at charts/clickstack/templates/secrets.yaml. This file provides a base structure for managing secrets.
If you need to manually apply a secret, modify and apply the provided secrets.yaml template:
apiVersion: v1
kind: Secret
metadata:
name: hyperdx-secret
annotations:
"helm.sh/resource-policy": keep
type: Opaque
data:
API_KEY: <base64-encoded-api-key>Apply the secret to your cluster:
kubectl apply -f secrets.yamlCreating a custom secret
If you prefer, you can create a custom Kubernetes secret manually:
kubectl create secret generic hyperdx-secret \
--from-literal=API_KEY=my-secret-api-keyReferencing a secret
To reference a secret in values.yaml:
hyperdx:
apiKey:
valueFrom:
secretKeyRef:
name: hyperdx-secret
key: API_KEYUsing ClickHouse Cloud
If using ClickHouse Cloud users disable the ClickHouse instance deployed by the Helm chart and specify the Cloud credentials:
# specify ClickHouse Cloud credentials
export CLICKHOUSE_URL=<CLICKHOUSE_CLOUD_URL> # full https url
export CLICKHOUSE_USER=<CLICKHOUSE_USER>
export CLICKHOUSE_PASSWORD=<CLICKHOUSE_PASSWORD>
# how to overwrite default connection
helm install my-clickstack clickstack/clickstack \
--set clickhouse.enabled=false \
--set clickhouse.persistence.enabled=false \
--set otel.clickhouseEndpoint=${CLICKHOUSE_URL} \
--set clickhouse.config.users.otelUser=${CLICKHOUSE_USER} \
--set clickhouse.config.users.otelUserPassword=${CLICKHOUSE_PASSWORD}Alternatively, use a values.yaml file:
clickhouse:
enabled: false
persistence:
enabled: false
config:
users:
otelUser: ${CLICKHOUSE_USER}
otelUserPassword: ${CLICKHOUSE_PASSWORD}
otel:
clickhouseEndpoint: ${CLICKHOUSE_URL}
hyperdx:
defaultConnections: |
[
{
"name": "External ClickHouse",
"host": "http://your-clickhouse-server:8123",
"port": 8123,
"username": "your-username",
"password": "your-password"
}
]helm install my-clickstack clickstack/clickstack -f values.yaml
# or if installed...
# helm upgrade my-clickstack clickstack/clickstack -f values.yamlProduction notes
By default, this chart also installs ClickHouse and the OTel collector. However, for production, it is recommended that you manage ClickHouse and the OTel collector separately.
To disable ClickHouse and the OTel collector, set the following values:
helm install my-clickstack clickstack/clickstack \
--set clickhouse.enabled=false \
--set clickhouse.persistence.enabled=false \
--set otel.enabled=falseTask configuration
By default, there is one task in the chart setup as a cronjob, responsible for checking whether alerts should fire. Here are its configuration options:
| Parameter | Description | Default |
|---|---|---|
tasks.enabled |
Enable/Disable cron tasks in the cluster. By default, the HyperDX image will run cron tasks in the process. Change to true if you’d rather use a separate cron task in the cluster. | false |
tasks.checkAlerts.schedule |
Cron schedule for the check-alerts task | */1 * * * * |
tasks.checkAlerts.resources |
Resource requests and limits for the check-alerts task | See values.yaml |
Upgrading the chart
To upgrade to a newer version:
helm upgrade my-clickstack clickstack/clickstack -f values.yamlTo check available chart versions:
helm search repo clickstackUninstalling ClickStack
To remove the deployment:
helm uninstall my-clickstackThis will remove all resources associated with the release, but persistent data (if any) may remain.
Troubleshooting
Checking logs
kubectl logs -l app.kubernetes.io/name=clickstackDebugging a failed install
helm install my-clickstack clickstack/clickstack --debug --dry-runVerifying deployment
kubectl get pods -l app.kubernetes.io/name=clickstackSchema choice: Map vs JSON
ClickStack stores attributes as Map(LowCardinality(String), String) columns by default. This is the recommended schema for observability workloads. Combined with bucketed map serialization and text indexes on map keys and values, it provides selective lookups without the per-key ingest overhead of dynamic JSON subcolumns.
A JSON-typed schema is available in beta for evaluation on workloads with a small, stable attribute key-set. It is not recommended as the default. See Map vs JSON type for the full comparison and the env vars required to enable JSON support.
Related Documentation
v1.x deployment guides
- Deployment options (v1.x) - External ClickHouse, OTEL collector, and minimal deployments
- Configuration guide (v1.x) - API keys, secrets, and ingress setup
- Cloud deployments (v1.x) - GKE, EKS, AKS configurations and production best practices
v2.x documentation
- Helm (v2.x) - v2.x deployment guide
- Upgrade guide - Migrating from v1.x to v2.x
Additional resources
- ClickStack getting started guide - Introduction to ClickStack
- ClickStack Helm charts repository - Chart source code and values reference
- Kubernetes documentation - Kubernetes reference
- Helm documentation - Helm reference
