Production-ready Helm chart for TetrixAIDb Enterprise (daemon, gateway, optional backends).
2.6K
Production-ready Helm chart for deploying TetrixAIDb Enterprise on Kubernetes: the
tetrixaidb daemon plus the tetrixaidb-remote gateway (Web UI + MCP), with the four
storage backends (PostgreSQL/pgvector, Neo4j, MeiliSearch, MinIO) bundled but optional.
This is a Helm chart, not a container image. It is distributed as an OCI artifact, so install it with Helm —
docker pulldoes not apply:helm install ... oci://registry-1.docker.io/deskree/tetrixaidb-chart. The container images it deploys live in separate repos (deskree/tetrixaidb,deskree/tetrixaidb-remote).
*.persistence.storageClass) when using bundled backendsingress.host
(HTTPS is required — the UI uses crypto.randomUUID, which needs a secure context)The deskree/tetrixaidb and deskree/tetrixaidb-remote images are published for both
linux/amd64 and linux/arm64, so the chart runs on x86-64 and ARM (e.g. AWS Graviton,
Apple Silicon) clusters alike.
The chart is published as an OCI artifact on Docker Hub — no helm repo add needed:
oci://registry-1.docker.io/deskree/tetrixaidb-chart
Pin a specific --version <VERSION> in production (chart versions track Git release tags).
List available versions with helm show chart oci://registry-1.docker.io/deskree/tetrixaidb-chart --version <VERSION>.
For development, substitute the local path deploy/helm/tetrixaidb for the OCI reference.
helm install tetrix oci://registry-1.docker.io/deskree/tetrixaidb-chart --version <VERSION> \
--namespace tetrix --create-namespace \
--set ingress.host=tetrix.example.com \
--set ingress.tls.certManager.clusterIssuer=letsencrypt-prod \
--set secrets.tetrixPassword="$(openssl rand -hex 24)" \
--set secrets.postgresPassword="$(openssl rand -hex 24)" \
--set secrets.neo4jPassword="$(openssl rand -hex 24)" \
--set secrets.meiliMasterKey="$(openssl rand -hex 24)" \
--set secrets.minioRootPassword="$(openssl rand -hex 24)" \
--set secrets.aidbPassword="$(openssl rand -hex 24)" \
--set secrets.openaiApiKey="sk-..."
helm install tetrix oci://registry-1.docker.io/deskree/tetrixaidb-chart --version <VERSION> \
--namespace tetrix --create-namespace \
--set ingress.host=tetrix.example.com \
--set ingress.tls.certManager.clusterIssuer=letsencrypt-prod \
--set postgres.enabled=false --set neo4j.enabled=false \
--set meilisearch.enabled=false --set minio.enabled=false \
--set externalPostgres.host=pg.internal \
--set externalNeo4j.uri=bolt://neo4j.internal:7687 \
--set externalMeilisearch.host=http://meili.internal:7700 \
--set externalMinio.endpoint=minio.internal:9000 \
--set secrets.tetrixPassword=... # plus the rest
A ready-made external-DB values file ships in the chart as values-minimal.yaml
(pull/extract the chart to use it). When a backend is disabled, its external*
connection block becomes required.
For external Postgres you must also create the tetrix role and the pgcrypto +
vector (pgvector) extensions yourself before installing:
CREATE EXTENSION IF NOT EXISTS pgcrypto;
CREATE EXTENSION IF NOT EXISTS vector;
CREATE USER tetrix WITH PASSWORD '<POSTGRES_PASSWORD>' LOGIN;
GRANT ALL PRIVILEGES ON DATABASE tetrixaidb TO tetrix;
GRANT ALL ON SCHEMA public TO tetrix;
Create a Secret containing TETRIX_PASSWORD, AIDB_PASSWORD, POSTGRES_PASSWORD,
NEO4J_PASSWORD, MEILI_MASTER_KEY, MINIO_ROOT_USER, MINIO_ROOT_PASSWORD,
OPENAI_API_KEY, then:
helm install tetrix oci://registry-1.docker.io/deskree/tetrixaidb-chart --version <VERSION> \
--set secrets.existingSecret=my-tetrix-secret \
--set ingress.host=tetrix.example.com \
--set ingress.tls.certManager.clusterIssuer=letsencrypt-prod
| Key | Default | Description |
|---|---|---|
ingress.host | tetrix.example.com | Public hostname; drives MCP_BASE_URL and TLS |
ingress.tls.certManager.clusterIssuer | "" | cert-manager issuer for automatic TLS |
ingress.tls.existingSecret | "" | Bring-your-own TLS secret (alternative) |
embedding.provider | openai | openai, ollama, or none (needs byov: true) |
embedding.model | text-embedding-3-large | Embedding model |
embedding.apiBase | "" | Must stay empty for OpenAI |
daemon.replicas | 1 | HA unsupported in v1 |
daemon.service.exposeExternally | false | LoadBalancer for tcp://host:7779 (CLI/SDK) |
daemon.config.ingest.workers | 16 | Ingest workers (production tuning) |
daemon.config.gc.* | enabled | GC tuning |
postgres.enabled / neo4j.enabled / meilisearch.enabled / minio.enabled | true | Bundle the backend; disable to use external* |
<backend>.persistence.size | varies | PVC size per backend |
global.storageClass | "" | Default StorageClass for all PVCs |
global.imageRegistry | "" | Registry prefix for air-gapped mirrors |
secrets.existingSecret | "" | Reference a pre-created Secret |
networkPolicy.enabled | false | Restrict traffic (daemon↔backends, ingress↔remote) |
For the full list of configurable values, run:
helm show values oci://registry-1.docker.io/deskree/tetrixaidb-chart --version <VERSION>
With the default Ingress enabled (replace <host> with your ingress.host):
https://<host>/ — log in with username developer
(the remote.aidb.username value) and the password from secrets.aidbPassword.
HTTPS is required: the UI uses crypto.randomUUID, which needs a secure context.https://<host>/mcp/v2/sse.MCP clients (e.g. Cursor) authenticate with a bearer token that is the base64 of
{"username":"developer","password":"<AIDB_PASSWORD>"}:
TOKEN=$(printf '{"username":"developer","password":"%s"}' "$AIDB_PASSWORD" | base64)
Cursor mcp.json:
{
"mcpServers": {
"tetrix": {
"url": "https://<host>/mcp/v2/sse",
"headers": { "Authorization": "Bearer <base64-token>" }
}
}
}
When ingress.enabled=false, reach the UI/MCP by port-forwarding the remote Service
(<release> is your Helm release name, e.g. tetrix):
kubectl -n tetrix port-forward svc/<release>-tetrixaidb-remote 9091:9091
kubectl -n tetrix get pods -l app.kubernetes.io/instance=tetrix
helm test tetrix -n tetrix
helm upgrade tetrix oci://registry-1.docker.io/deskree/tetrixaidb-chart --version <NEW_VERSION> \
--namespace tetrix --reuse-values
helm uninstall tetrix -n tetrix
# PVCs (data) are retained by design. Delete explicitly to wipe data:
kubectl -n tetrix delete pvc -l app.kubernetes.io/instance=tetrix
password authentication failed)The daemon crash-loops with an error like
failed SASL auth: FATAL: password authentication failed for user "tetrix" (or the
equivalent for Neo4j/MeiliSearch/MinIO).
helm uninstall does not delete PVCs (see Uninstall above), and the bundled backends
only apply the password from the Secret on the first boot of an empty data directory.
If you reinstall into a namespace that still holds the old data-* PVCs, the database
keeps its previous password while the new release generates fresh credentials — and they
no longer match. To fully reset bundled state:
helm uninstall tetrix -n tetrix
kubectl -n tetrix delete pvc -l app.kubernetes.io/instance=tetrix
# then reinstall
This does not apply to external (*.enabled=false) backends, where you manage credentials.
Pending with unbound immediate PersistentVolumeClaimsThe cluster has no usable default StorageClass, or its provisioner is unhealthy. Check
kubectl get storageclass and kubectl -n <ns> describe pvc <name>, then either mark a
StorageClass default or set global.storageClass (or per-backend
<backend>.persistence.storageClass).
Chart versions follow SemVer and track Git release tags (no leading v). For a published
chart, version == appVersion == the application image tag it deploys. Bundled backends
pin specific upstream images:
| Component | Image | Version |
|---|---|---|
| Daemon | deskree/tetrixaidb | chart appVersion (override: daemon.image.tag) |
| Remote gateway | deskree/tetrixaidb-remote | chart appVersion (override: remote.image.tag) |
| PostgreSQL + pgvector | pgvector/pgvector | pg16 |
| Neo4j | neo4j | 5 |
| MeiliSearch | getmeili/meilisearch | v1.12 |
| MinIO | minio/minio | latest |
Pull once and relocate the chart and images into your own registry:
helm pull oci://registry-1.docker.io/deskree/tetrixaidb-chart --version <VERSION>
# Then push tetrixaidb-<VERSION>.tgz to your internal OCI registry and install with
# --set global.imageRegistry=registry.internal/ to relocate the container images too.
The MCP Ingress strips the /mcp prefix (/mcp/v2/sse → upstream /v2/sse) and sets
SSE-safe options: buffering off, 86400s read/send timeouts, HTTP/1.1.
Avoid upstream keepalive on the MCP path. ingress-nginx reloads endpoints dynamically, but if you customize the controller, do not enable keepalive for the MCP backend — it breaks long-lived SSE streams.
ingress-nginx (TLS)
/ \
"/" | | "/mcp"
v v
tetrixaidb-remote (UI :9091, MCP :8787)
|
v
tetrixaidb daemon (:7779 / :9090)
|
+-------+-------+--------+--------+
v v v v
postgres neo4j meilisearch minio (bundled StatefulSets or external)
Content type
Helm
Digest
sha256:1fb3ef7e4…
Size
515.8 kB
Last updated
about 20 hours ago
helm pull oci://registry-1.docker.io/deskree/tetrixaidb-chart --version 1.0.0