deployment/helm/pipeshub-ai in the pipeshub-ai repository. Its README is the full reference; this page covers the common path.
Prerequisites
- Kubernetes 1.24 or later
- Helm 3.11 or later
- A clone of the pipeshub-ai repository. Run the commands below from its root.
- Optional: External Secrets Operator, if you keep secrets in an external store
Pick a preset
For EKS, the repository has a one-command script and a step-by-step guide: Deploy PipesHub on Amazon EKS.
Install
1
Build the chart dependencies
MongoDB and Redis are vendored in the repository. This packages them locally and needs no registry login.
2
Install (local preset)
Keep the release name Add
pipeshub-ai so the Service is also named pipeshub-ai.--set image.tag=slim for the smaller image, which downloads models on first use. On kind or minikube, load the image into the cluster first (kind load docker-image or minikube image load).3
Open the UI
http://localhost:3001. Port 3001 serves the UI and the API.deployment/helm/local-setup-kind-cluster.sh creates a kind cluster, loads the image and installs the chart in one go.
Cloud install
Forvalues-cloud.yaml, also set the storage classes, the ingress and the public URL:
docker) unless it has a Docker daemon. sandbox.dind.enabled=true adds one as a sidecar, which needs a privileged container. Instead, set config.dockerHost to a daemon you run, or set config.sandboxMode=e2b. See Other settings.
Also add the database password flags from the local install (mongodb.auth.*, redis.auth.password, neo4j.auth.password) with your own values.
Set global.storageClass for the databases and persistence.storageClass for the shared app volume, which must be ReadWriteMany:
- GKE:
global.storageClass=standard-rwo,persistence.storageClass=filestore-csi - AKS:
global.storageClass=managed-csi,persistence.storageClass=azurefile-csi - On-premises: any block storage for
global.storageClass, and any ReadWriteMany storage (NFS, CephFS) forpersistence.storageClass
config.connectorPublicBackend to its public URL. See the chart README for the values.
Required secrets
secretKeyencrypts stored configuration. Generate it once and keep it.qdrant.apiKeyhas no default. The chart refuses to render without it, and refuses the old shared defaults such asapi_key. Generate one withopenssl rand -hex 32.arango.auth.rootPasswordmay not beroot, if you use ArangoDB.
helm upgrade you can leave qdrant.apiKey unset; the chart reuses the key in the release Secret. helm template, --dry-run=client, Argo CD and Flux cannot read the cluster, so they need it every time.
The chart can also read secrets from existing Kubernetes Secrets (secretManagement.existingSecrets) or from External Secrets Operator (secretManagement.externalSecrets).
Upgrade
qdrant.apiKey ran with the public default key, and its first upgrade fails until you set a new one. The chart README has a procedure for that change. It stops the app while Qdrant restarts on the new key, so no request fails with the old one.
Other settings
- Telemetry:
telemetry.collection.enabled: falseturns collection off. - Behind an ingress: the client IP is read from one proxy hop when the ingress is enabled. Set
trustProxyto change that. - Coding sandbox:
config.sandboxModeisdockerby default and needs a Docker daemon (sandbox.dind.enabled=trueadds one as a sidecar), or set it toe2b. Thevalues-local.yamlpreset sets it tolocal, which runs generated code in the app pod with no container isolation. Use that preset for single-tenant development clusters only. - External Redis: set
redis.enabled=falseandredis.external.*. See the chart README for standalone and cluster modes. - Any other environment variable: pass it with
extraEnv. See Environment variables.
Check before production
- Set every password,
secretKeyandqdrant.apiKeyto strong values. - Configure ingress and TLS.
- Keep
podDisruptionBudgeton (the default;values-local.yamlturns it off) and enablenetworkPolicyonly after you have set its rules for your cluster. The defaults allow ingress from a namespace labelledname: ingress-nginxand from pods in the same namespace, and allow TCP egress only to pods in the same namespace, so enabling it as is blocks external model APIs and connectors. Add what you need withnetworkPolicy.extraEgress, and test traffic in and out before you rely on it. - Test the upgrade in a non-production namespace first.