Available in the Red Hat OpenShift Helm Catalog as a Partner chart, provided by Alquimia AI US Corp. — install it directly from the OpenShift web console or via the CLI. See Red Hat OpenShift Helm Catalog.
Table of Contents
- TL;DR
- Red Hat OpenShift Helm Catalog
- Prerequisites
- Installation
- Upgrading
- Uninstalling
- Configuration
- Parameters
- Example
values.yaml - Security
- Network Policy
- OpenShift Notes
- Troubleshooting
- Maintainers
TL;DR
Red Hat OpenShift Helm Catalog
This chart is published as a Red Hat certified Partner chart in the official OpenShift Helm Charts catalog (https://charts.openshift.io/), maintained by Alquimia AI US Corp.
It is available out-of-the-box on every OpenShift cluster (4.15+) under Software Catalog → Helm Charts, ready to be installed with a single click from the web console.
Install from the OpenShift web console
- Log in to the OpenShift web console.
- Navigate to Developer → Add → Helm Chart (or Administrator → Software Catalog → Helm Charts).
- Filter by Chart Repositories: OpenShift Helm Charts and search for Alquimia Studio.
- Click Create, choose the namespace, and provide your
values.yaml(or use the form view). - Click Install — the console will render the chart and create the resources.
Install from the CLI (using the OpenShift catalog repo)
The OpenShift catalog is exposed as a standard Helm repository, so you can install the chart from any client:The published chart includes the Red Hat certification annotations (charts.openshift.io/name,charts.openshift.io/providerType: partner,charts.openshift.io/supportedOpenShiftVersions: ">=4.15") and has passed the Red Hat Helm Chart Verifier checks.
Prerequisites
| Component | Version |
|---|---|
| Kubernetes | >= 1.26 |
| OpenShift | >= 4.15 (if deploying on OCP) |
| Helm | >= 3.9 |
| Container image | A published image of Alquimia Studio |
| MongoDB | Required when DB_STRATEGY=mongo (default) |
| Keycloak | Required when AUTH_STRATEGY=keycloak (recommended) |
| Alquimia Runtime | Required for inference orchestration |
| Alquimia TWYD | Required if RAG / document indexing is enabled |
Installation
1) Basic install (Service only)
2) With Kubernetes Ingress
3) On OpenShift with Route (recommended on OCP)
If bothingress.enabledandopenshift.route.enabledaretrue, the chart prefers Ingress and skips the Route.
Upgrading
Uninstalling
Configuration
Alquimia Studio is configured almost entirely through environment variables, sourced from aConfigMap (non-sensitive) and a Secret (sensitive). The chart supports two patterns:
- Bring your own existing
ConfigMap/Secret(recommended for production). - Let the chart create them from
values.yaml(handy for dev/staging).
Required Environment Variables (Studio)
These variables are consumed by Alquimia Studio at runtime. Place non-sensitive values in theConfigMap and secrets in the Secret.
Database
| Variable | Required | Type | Description | Example |
|---|---|---|---|---|
DB_STRATEGY | Yes | Config | Persistence strategy. mongo (default, requires MongoDB) or lite (embedded NeDB, no DB). | mongo |
DATABASE_URL | If DB_STRATEGY=mongo | Secret | MongoDB connection string. Treated as a Secret because it usually contains user/password. | mongodb+srv://user:pass@cluster.mongodb.net/alquimia-studio |
Authentication (Keycloak / NextAuth)
Studio supports two strategies viaAUTH_STRATEGY: keycloak (enterprise SSO) or lite (self-contained, file/JSON-based users).
| Variable | Required | Type | Description |
|---|---|---|---|
AUTH_STRATEGY | Yes | Config | keycloak (recommended) or lite. |
NEXT_PUBLIC_AUTH_STRATEGY | Yes | Config | Same value as AUTH_STRATEGY, exposed to the browser. |
AUTH_KEYCLOAK_ISSUER | If AUTH_STRATEGY=keycloak | Config | Keycloak issuer URL (…/auth/realms/<realm>). |
AUTH_KEYCLOAK_ID | If AUTH_STRATEGY=keycloak | Config | OIDC client ID registered in Keycloak. |
AUTH_KEYCLOAK_SECRET | If AUTH_STRATEGY=keycloak | Secret | OIDC client secret. |
NEXTAUTH_URL | Yes | Config | Public URL of Studio (must match Keycloak redirect URIs in keycloak mode). |
NEXTAUTH_SECRET | Yes | Secret | Random string used to sign NextAuth.js sessions/JWTs. |
AUTH_LITE_USERS | If AUTH_STRATEGY=lite (one of these two) | Secret | Inline JSON array of users with email, name, password_hash (bcrypt). |
AUTH_LITE_USERS_FILE | If AUTH_STRATEGY=lite (one of these two) | Config | Path to a JSON file with the users list (mounted via volume). |
Alquimia Runtime
| Variable | Required | Type | Description |
|---|---|---|---|
ASSISTANT_BASEURL | Yes | Config | Base URL of the Alquimia Runtime service. |
ALQUIMIA_ASSISTANT_API_KEY | Yes | Secret | API key used by Studio to authenticate against Runtime. |
Alquimia TWYD (Knowledge Base)
| Variable | Required | Type | Description |
|---|---|---|---|
TWYD_BASEURL | If RAG is enabled | Config | Base URL of the Alquimia TWYD (Knowledge Base) service. |
TWYD_API_KEY | If RAG is enabled | Secret | API key for TWYD. |
Metrics (Prometheus / Grafana)
| Variable | Required | Type | Description |
|---|---|---|---|
METRICS_API_URL | No | Config | Prometheus / Grafana metrics API URL (e.g. https://metrics.example.com/api/). |
METRICS_API_TOKEN | No | Secret | Bearer token (or username:password for Basic auth) for the metrics API. |
OpenTelemetry & logging (optional)
| Variable | Required | Type | Description |
|---|---|---|---|
OTEL_ALQUIMIA_SERVICE_NAME | No | Config | Logical service name reported to OTel. |
OTEL_COLLECTOR_ENDPOINT_TRACES | No | Config | OTLP traces endpoint (e.g. …/v1/traces). |
OTEL_COLLECTOR_ENDPOINT | No | Config | OTLP metrics endpoint (e.g. …/v1/metrics). |
OTEL_COLLECTOR_ENDPOINT_LOGS | No | Config | OTLP logs endpoint (e.g. …/v1/logs). |
OTEL_EXPORTER_INTERNAL_MILIS | No | Config | Export interval in milliseconds. |
OTEL_EXPORTER_TIMEOUT_MILIS | No | Config | Export timeout in milliseconds. |
LOG_LEVEL | No | Config | Log level: debug, info, warn, error. |
Misc / UI
| Variable | Required | Type | Description |
|---|---|---|---|
EXTERNAL_REGISTRY_URL | No | Config | External OCI registry URL used by the Discover feed. Leave empty to disable. |
NEXT_PUBLIC_ONBOARDING | No | Config | true/false. Enables the onboarding tour for new users. |
Using existing ConfigMap and Secret
If you already managealquimia-studio-config and alquimia-studio-secrets (e.g. via GitOps, Sealed Secrets, External Secrets Operator):
ConfigMap you might apply separately:
Secret:
Creating ConfigMap and Secret with the chart
For dev/staging environments you can let the chart render them fromvalues.yaml:
Tip: for production, preferexistingSecretpopulated by an external secret manager (Vault, AWS Secrets Manager, Sealed Secrets, ESO, etc.) instead of inlining secrets invalues.yaml.
Parameters
Image
| Key | Type | Default | Description |
|---|---|---|---|
replicaCount | int | 1 | Number of replicas |
image.repository | string | alquimiaai/studio | Image repository |
image.tag | string | latest | Image tag (pin via CI/CD) |
image.pullPolicy | string | IfNotPresent | Image pull policy |
image.pullSecrets | list | [] | List of imagePullSecrets names |
Service & Networking
| Key | Type | Default | Description |
|---|---|---|---|
service.type | string | ClusterIP | Service type |
service.port | int | 80 | Service port |
service.targetPort | int | 3000 | Container port |
ingress.enabled | bool | false | Enable Kubernetes Ingress |
ingress.className | string | "" | IngressClass name |
ingress.hosts[0].host | string | studio.example.com | Hostname |
ingress.tls | list | [] | TLS entries for hosts |
openshift.route.enabled | bool | true | Enable OpenShift Route |
openshift.route.host | string | "" | Route host (optional) |
openshift.route.tls.enabled | bool | true | TLS on Route |
networkPolicy.enabled | bool | true | Enable NetworkPolicy |
networkPolicy.ingressNamespaces | list | [] | Namespaces allowed to ingress (empty = same namespace) |
Resources & Scheduling
| Key | Type | Default | Description |
|---|---|---|---|
resources.requests.cpu | string | 100m | CPU request |
resources.requests.memory | string | 256Mi | Memory request |
resources.limits.cpu | string | 500m | CPU limit |
resources.limits.memory | string | 512Mi | Memory limit |
nodeSelector | map | {} | Node selector |
tolerations | list | [] | Tolerations |
affinity | map | {} | Affinity rules |
Configuration & Secrets
| Key | Type | Default | Description |
|---|---|---|---|
env.vars | list | [] | Inline environment variables |
envFrom.existingConfigMap | string | alquimia-studio-config | Use existing ConfigMap |
envFrom.existingSecret | string | alquimia-studio-secrets | Use existing Secret |
createConfig.enabled | bool | false | Create ConfigMap from values |
createConfig.config | map | {} | Key/values for ConfigMap |
createSecret.enabled | bool | false | Create Secret from values |
createSecret.stringData | map | {} | Secret key/values |
Security
| Key | Type | Default | Description |
|---|---|---|---|
serviceAccount.create | bool | true | Create ServiceAccount |
serviceAccount.name | string | "" | ServiceAccount name |
podSecurityContext | map | see values | Pod security context |
containerSecurityContext | map | see values | Container security context |
Probes
| Key | Type | Default | Description |
|---|---|---|---|
probes.liveness.path | string | /health/liveness | Liveness probe path |
probes.readiness.path | string | /health/readiness | Readiness probe path |
probes.liveness.periodSeconds | int | 10 | Liveness probe period |
probes.readiness.periodSeconds | int | 10 | Readiness probe period |
Example values.yaml
Security
This chart follows container hardening best practices:runAsNonRoot: truereadOnlyRootFilesystem: trueallowPrivilegeEscalation: false- All Linux capabilities dropped (
drop: ["ALL"]) seccompProfile: RuntimeDefault
emptyDir at the required path or extend the chart to add a writable volume.
Network Policy (opt-in)
Restrict inbound traffic to the service namespace (or specific namespaces):OpenShift Notes
- Prefer Route over Ingress (
openshift.route.enabled: true). - Ensure the default SCC allows
runAsNonRoot. If your cluster injects a random UID, this chart already sets non-root compatible options. - For TLS, you can attach a custom certificate to the Route or rely on router defaults.
- The chart declares
charts.openshift.io/supportedOpenShiftVersions: ">=4.15"for Red Hat certification.
Troubleshooting
Pods stuck inCrashLoopBackOff complaining about missing env vars
Verify that the referenced ConfigMap and Secret exist and contain all required keys listed in Required Environment Variables.
NextAuth callback errors / login redirect loops
Ensure that:
NEXTAUTH_URLmatches the public URL exposed by the Ingress/Route.- The Keycloak client has the correct Valid Redirect URIs (e.g.
https://studio.example.com/api/auth/callback/keycloak). NEXTAUTH_SECRETis set and consistent across replicas.
DATABASE_URL value (it usually contains user/password and should live in the Secret) and that the MongoDB service is reachable from the pod’s namespace. As a quick alternative for testing, set DB_STRATEGY=lite to use the embedded NeDB store.
AUTH_STRATEGY=lite users cannot log in
When using lite auth, provide either:
AUTH_LITE_USERS— inline JSON array (kept in the Secret), orAUTH_LITE_USERS_FILE— absolute path to a JSON file (mount it via a volume).
[{ "email": "...", "name": "...", "password_hash": "$2b$..." }] (bcrypt hash).
Read-only filesystem errors
The chart enables readOnlyRootFilesystem. Mount an emptyDir if Studio (or a sidecar) needs to write to disk.
Run the chart’s smoke tests