Skip to main content
This guide installs Bud-Stack from the published OCI Helm chart and points it at managed services you already operate (e.g. Azure Database for PostgreSQL, Cosmos DB for MongoDB, Azure Cache for Redis, Azure Blob via an S3-compatible gateway, an external Kafka and ClickHouse). It lists only the configuration that is mandatory for a new setup — defaults are fine for everything else.
If you want an all-in-one cluster with bundled Postgres/Mongo/Valkey/SeaweedFS, follow the Installation Guide instead.

Prerequisites

Step 0 — Log in to the chart registry

Quote the username so the shell does not expand the $.

Step 1 — Pull the default values

Step 2 — Start your secrets file

Pull the chart so you can inspect the secret files it ships:
bud/secrets.bud.yaml enumerates the full set of secret key paths the platform needs (externalServices.*, microservices.*, daprExtra.crypto, novu.*); secrets.demo.yaml is a minimal example that carries only the registry pull credentials. Both shipped files are SOPS-encrypted (values appear as ENC[...]), so they are not drop-in templates — use secrets.bud.yaml for the key structure and supply your own plaintext values in a separate secrets.yaml, following the references in Steps 3–4. Keep secrets.yaml out of version control (or SOPS-encrypt it).

Step 3 — Wire up external services

All managed services are configured under externalServices in values.yaml and the matching credential blocks live in secrets.yaml. Provision the resources below first, then fill in the values.

PostgreSQL

Create one database per backend service, each with its own user. Required databases: budapp, budcluster, budmetrics, budmodel, budsim, budeval, buddoc, budprompt, budask, mcpgateway, budpipeline, budcodeinterpreter.

MongoDB (Novu)

Redis / Valkey

A single Redis instance, multiplexed by logical DB index. The novu.externalRedis block references the same instance; only the host is restated — the password is shared from externalServices.valkey.password via the <release>-novu-externalredis Secret.

S3-compatible object storage

Works with SeaweedFS (the bundled default), AWS S3, Azure Blob via an S3 gateway, or any other S3-compatible store. Create the buckets ahead of time.

ClickHouse

Kafka

OIDC identity provider

Any OIDC-compliant IdP is supported — budapp validates ID tokens via OIDC discovery and stores all authorization state in its own Postgres PDP. If you don’t already operate one, the sibling keycloak chart (oci://registry.bud.studio/charts/keycloak) gives you a working Keycloak in one install. You must pre-create the OAuth clients that the redirect-flow uses (budadmin-web, budcustomer-web, budplayground-web, plus the mcpgateway client) in your IdP and copy the client secrets into secrets.yaml (see Application secrets).
The issuer is set directly on externalServices.oidc.url. As of chart 0.14.0 budapp uses externalServices.oidc.url as its OIDC issuer verbatim — for a default Keycloak that is https://<auth-host>/realms/bud-keycloak (the realm segment is part of the URL). It must match the keycloak chart’s ingress.host. The oidc.clients.mcpgateway.* keys configure the mcpgateway OAuth client specifically; they do not change budapp’s issuer.
Using a non-Keycloak IdP. Any OIDC-compliant IdP works, but the defaults are Keycloak-shaped. To point budapp at Auth0 / Authentik / Cognito / Azure AD, override these in microservices.budapp.env rather than just setting .url: OIDC_ISSUER (your provider’s full issuer URL) and OIDC_ROLES_CLAIM_PATH (where the IdP encodes roles — Keycloak realm_access.roles, Auth0 https://yourapp/roles, Cognito cognito:groups). The legacy keycloak.auth.adminUser / adminPassword fields are only consulted when you run the bundled Keycloak chart.

Step 4 — Application secrets & cluster config

These are not wired to external services but are required for a new install. All paths below live in secrets.yaml unless noted.

Registry pull credentials

Per-service secrets you must change

Cluster-level config in values.yaml

Step 5 — Install

Step 6 — Verify

All pods should reach Running within ~5–10 minutes. Backend pods run a Dapr sidecar so expect 2/2 READY for most of them.

Common pitfalls

  • budmetrics database name must be metrics;
  • Redirect-flow clients must exist in the realm before the budapp pod boots, otherwise the login flow returns invalid_client.
  • registries.registry.bud.studio credentials are required even for airgapped clusters that already mirrored the images — the chart still creates the imagePullSecret referenced by every Deployment.

Next steps

Helm Configuration Reference

Full list of values and overrides.

Installation Guide

Full in-cluster install with bundled dependency charts (ArgoCD).