1. Choose the chart source
CHART_REF=oci://registry-1.docker.io/hellocobi/cobi-dashboard
CHART_VERSION=0.1.0
The Helm chart is published as a public OCI artifact. If you are installing from a local checkout of the chart instead, skip these variables and use the local path in the helm install commands below.
2. Create the namespace
kubectl create namespace cobi
3. Create required Secrets
Docker Hub pull secret
Required if global.imagePullSecrets is set (needed for hellocobi/* private images).
kubectl create secret docker-registry dockerhub-secret \
--docker-server=https://index.docker.io/v1/ \
--docker-username=<username> \
--docker-password=<token> \
--docker-email=<email> \
--namespace cobi
Backend environment secret
The backend reads its configuration from a Kubernetes Secret. Create it with your environment-specific values:
kubectl create secret generic cobi-backend-secrets \
--namespace cobi \
--from-literal=DATABASE_URL="postgres://postgres:<password>@cobi-dashboard-postgresql:5432/dashboard_auth?schema=public" \
--from-literal=CORE_DATABASE_URL="postgres://postgres:<password>@cobi-dashboard-postgresql:5432/cobi_core?schema=public" \
--from-literal=BETTER_AUTH_SECRET="<random-string>" \
--from-literal=BETTER_AUTH_URL="https://api.example.com" \
--from-literal=FRONTEND_URL="https://app.example.com" \
--from-literal=CONNECT_SERVICE_URL="http://cobi-dashboard-connect:8000" \
--from-literal=QDRANT_URL="http://cobi-dashboard-qdrant:6333" \
--from-literal=S3_BUCKET="documents" \
--from-literal=S3_REGION="us-east-1" \
--from-literal=S3_ENDPOINT="http://cobi-dashboard-minio:9000" \
--from-literal=S3_ACCESS_KEY_ID="admin" \
--from-literal=S3_SECRET_ACCESS_KEY="<minio-root-password>" \
--from-literal=CONNECT_SERVICE_TOKEN="<shared-token>" \
--from-literal=CONNECT_BUCKET_PREFIX="ingestion"
See Backend Service for the full variable reference.
Frontend environment secret
kubectl create secret generic cobi-frontend-secrets \
--namespace cobi \
--from-literal=NODE_ENV="production" \
--from-literal=VITE_API_BASE_URL="https://api.example.com" \
--from-literal=VITE_API_SANDBOX_URL="https://api.example.com"
VITE_API_BASE_URL must match the backend Gateway route, Ingress, or Route hostname.
Connect service secret
kubectl create secret generic cobi-connect-secrets \
--namespace cobi \
--from-literal=HOST="0.0.0.0" \
--from-literal=PORT="8000" \
--from-literal=CONNECT_SERVICE_TOKEN="<shared-token>" \
--from-literal=S3_ENDPOINT="http://cobi-dashboard-minio:9000"
Use the same CONNECT_SERVICE_TOKEN value in both the backend and connect secrets.
4. Build chart dependencies
If installing from a local chart directory:
cd charts/cobi-dashboard
helm dependency build
This downloads the dependency charts (PostgreSQL, Qdrant, vllm-stack, MinIO) into charts/.
5. Install
Choose a values file that matches your environment, then install:
helm install cobi-dashboard "$CHART_REF" \
--namespace cobi \
--version "$CHART_VERSION" \
--values my-values.yaml \
--wait
Or from a local chart:
helm install cobi-dashboard ./charts/cobi-dashboard \
--namespace cobi \
--values my-values.yaml \
--wait
6. Verify the rollout
kubectl get pods -n cobi
kubectl get gateway,httproute -n cobi # Gateway API
kubectl get ingress -n cobi # Kubernetes
kubectl get routes -n cobi # OpenShift
All pods should reach Running / 1/1 Ready. The vLLM pod takes longer (~5 min) while it downloads model weights.
Upgrade
helm upgrade cobi-dashboard "$CHART_REF" \
--namespace cobi \
--version "$CHART_VERSION" \
--values my-values.yaml \
--wait
Uninstall
helm uninstall cobi-dashboard --namespace cobi
PersistentVolumeClaims are not deleted automatically. Remove them manually if you want to purge all data:
kubectl delete pvc -n cobi --all
Minimal values file
The following enables all application components with sensible defaults. Substitute your image tags and domain names:
global:
imagePullSecrets:
- dockerhub-secret
backend:
enabled: true
image:
repository: docker.io/hellocobi/dashboard-backend
tag: "0.2.6"
pullPolicy: IfNotPresent
envFrom:
- secretRef:
name: cobi-backend-secrets
s3:
existingSecret: cobi-backend-secrets
frontend:
enabled: true
image:
repository: docker.io/hellocobi/dashboard-frontend
tag: "0.1.9"
pullPolicy: IfNotPresent
envFrom:
- secretRef:
name: cobi-frontend-secrets
connect:
enabled: true
image:
repository: docker.io/hellocobi/dashboard-connect
tag: "823edd6d96f97aae01425d8c3ddfc9ef8839c65b"
pullPolicy: IfNotPresent
envFrom:
- secretRef:
name: cobi-connect-secrets
ingress:
enabled: true
className: nginx
tls:
- secretName: cobi-dashboard-tls
hosts:
- app.example.com
- api.example.com
- connect.example.com
app:
enabled: true
host: app.example.com
api:
enabled: true
host: api.example.com
connect:
enabled: true
host: connect.example.com
minio:
enabled: false
grafana:
enabled: false
gateway:
enabled: false
postgresql:
enabled: true
auth:
username: postgres
password: "<strong-password>"
database: dashboard_auth
primary:
initdb:
scripts:
create-core-db.sql: |
CREATE DATABASE cobi_core;
persistence:
enabled: true
size: 10Gi
qdrant:
enabled: true
persistence:
enabled: true
size: 10Gi
minio:
enabled: true
auth:
rootUser: admin
rootPassword: "<strong-password>"
defaultBuckets: "documents"
persistence:
enabled: true
size: 100Gi
otelLgtm:
enabled: true
# vLLM disabled by default — see vLLM Setup guide
vllmstack:
enabled: false
OpenShift values override
For OpenShift, disable Kubernetes Ingress and Gateway, then enable the chart’s frontend and backend API Routes:
ingress:
enabled: false
gateway:
enabled: false
# Enable OpenShift Routes
openshift:
route:
enabled: true
host: dashboard.apps.cluster.example.com
api:
enabled: true
host: api.apps.cluster.example.com
OpenShift Routes use edge TLS termination by default — TLS is terminated at the router, plain HTTP to the pods. Update the frontend and backend secrets to use the frontend Route and API Route:
# Frontend secret
--from-literal=VITE_API_BASE_URL="https://api.apps.cluster.example.com"
--from-literal=VITE_API_SANDBOX_URL="https://api.apps.cluster.example.com"
# Backend secret
--from-literal=BETTER_AUTH_URL="https://api.apps.cluster.example.com"
--from-literal=FRONTEND_URL="https://dashboard.apps.cluster.example.com"
See Ingress & Routes for the full platform-specific configuration.