QuestDB
QuestDB is an Apache-2.0 database built for real-time time-series analytics. The HelmForge chart deploys one hardened QuestDB OSS instance with retained storage and secure generated credentials.
What the chart provides
- official QuestDB 10.0.1 image for amd64 and arm64, pinned by OCI digest;
- a fixed one-replica StatefulSet matching the QuestDB OSS architecture;
- retained persistence for the complete
/var/lib/questdbroot; - generated or externally managed PostgreSQL and HTTP passwords;
- External Secrets Operator, Ingress and Gateway API support;
- per-protocol NetworkPolicy, health probes and optional ServiceMonitor;
- non-root UID/GID 10001 with a read-only root filesystem.
QuestDB OSS does not provide replication, automated failover, native TLS or advanced authorization. Those are not simulated by this chart.
Install
helm repo add helmforge https://repo.helmforge.dev
helm repo update
helm install questdb helmforge/questdb \
--namespace questdb \
--create-namespace
Check the singleton:
kubectl -n questdb rollout status statefulset/questdb-questdb
kubectl -n questdb get pod,service,pvc
Open the Web Console
Read the retained HTTP password:
kubectl get secret -n questdb questdb-questdb \
-o jsonpath='{.data.http-password}' | base64 -d
Forward the authenticated HTTP interface:
kubectl -n questdb port-forward service/questdb-questdb 9000:9000
Open http://localhost:9000 and authenticate as admin.
Existing Secret
Supply keys pg-password and http-password:
questdb:
existingSecret: questdb-auth
Passwords are mounted as files and consumed through QuestDB’s _FILE
configuration convention. The chart does not copy secret values into ordinary
environment values.
External Secrets Operator
questdb:
existingSecret: questdb-auth
externalSecrets:
enabled: true
items:
- name: questdb-auth
spec:
secretStoreRef:
name: production
kind: ClusterSecretStore
target:
name: questdb-auth
data:
- secretKey: pg-password
remoteRef:
key: questdb/pg-password
- secretKey: http-password
remoteRef:
key: questdb/http-password
Protocols
| Interface | Port | Default | Guidance |
|---|---|---|---|
| HTTP, REST, Web Console, ILP HTTP, QWP | 9000 | enabled | Preferred ingestion interface |
| PostgreSQL wire | 8812 | enabled | Keep internal without a service mesh |
| Legacy ILP TCP | 9009 | disabled | Enable with service.ilpTcpEnabled |
| Health and metrics | 9003 | internal | /status; /metrics when enabled |
QuestDB OSS protocols do not provide native TLS. Public HTTP exposure must use a TLS-terminating Ingress or Gateway. Use an encrypted trusted network or service mesh for PostgreSQL, ILP TCP and QWP.
Metrics
metrics:
enabled: true
serviceMonitor:
enabled: true
networkPolicy:
metricsFrom:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: monitoring
The ServiceMonitor scrapes /metrics on the separate port 9003 Service. The
Prometheus namespace selector is required when NetworkPolicy is enabled so the
scraper is not blocked.
Persistence and production sizing
persistence:
storageClass: fast-block
size: 100Gi
resources:
requests:
cpu: '4'
memory: 8Gi
limits:
cpu: '8'
memory: 16Gi
QuestDB relies heavily on memory-mapped files. Do not use NFS or distributed
filesystems for database storage. Follow upstream guidance for fast local block
storage, vm.max_map_count=1048576 and high open-file limits.
Backup and restore
For a consistent OSS backup:
- Execute
CHECKPOINT CREATEand wait for success. - Copy the retained volume or create the block-storage snapshot.
- Execute
CHECKPOINT RELEASE, including after copy failures. - Restore the complete
/var/lib/questdbroot into an isolated environment. - Create an empty
/var/lib/questdb/_restorefile to trigger recovery. - Start QuestDB and verify queries before using the restored instance.
An uncoordinated snapshot of a live QuestDB volume is not claimed to be a consistent backup. Restore into the same major version before upgrading.
Upgrades and availability
Read the upstream release notes and verify a backup before upgrading. Startup can migrate on-disk metadata, so rollback may require the pre-upgrade volume.
The chart is deliberately a singleton. Enabling its PodDisruptionBudget with
minAvailable: 1 blocks voluntary node drains. Leave it disabled when planned
downtime during a drain is preferable. Use QuestDB Enterprise and its supported
operator when replication and automated failover are required.
Uninstall
helm uninstall questdb --namespace questdb
The chart-created PVC and generated Secret remain by default because they hold database and recovery material. Delete them only after verifying the backup and confirming that data loss is intended.