Skip to main content

Platform Azure Deployment

Deploy the BigHammer umbrella chart (bighammer) on AKS. This page covers values preparation and Helm install — the final step after infrastructure, database bootstrap, secrets, and cluster add-ons are ready.

For architecture diagrams and component relationships, see Cloud Architecture.

Before you start

Complete these steps before running helm upgrade:

StepActionDoc
0AKS, PostgreSQL, platform Key Vault passwords, DNSInfrastructure
1Application DB schemas and grantsScripts Reference — Database creation
2Verify Key Vault + create one-time secretsKey Vault Secrets · Scripts Reference
3ESO, edge, RabbitMQ, TLSCluster preparation

Also confirm Prerequisites and mirror entitled artifacts per Release Manifest & Distribution.

End-to-end journey

StepActionDoc
0AKS, PostgreSQL, provision platform Key Vault passwords, DNSInfrastructure
1Application DB schemas and grantsScripts Reference
2Verify Key Vault + create one-time secretsKey Vault Secrets · Scripts Reference
3ESO, edge, RabbitMQ, TLSCluster preparation
4Mirror chart, prepare values, Helm install (this page)

If pods fail with permission denied for schema, see Database bootstrap troubleshooting.

Mirror chart and prepare values

Pull the chart from your mirrored ACR after Release Manifest & Distribution:

az acr login --name <registry>

helm pull oci://<registry>.azurecr.io/bh-helm-release/bighammer \
--version <CHART_VERSION>

tar -xzf bighammer-<CHART_VERSION>.tgz
cp bighammer/values.yaml values.yaml
cp bighammer/values-release.yaml values-<env>.yaml # edit all placeholders
Do not deploy values-release.yaml as-is

values-release.yaml uses fictional placeholders (sample hostnames, resource IDs). Copy it to values-<env>.yaml in your deploy repo and replace every sample value.


What the chart deploys

The platform umbrella chart installs:

CategoryComponents
Webbhui, bhadminui
APIsbhcatalogapi, bhauditapi, bhaiagent, bhkeycloakapi, bhtransformationutils
Identitybhkeycloak, bhnginx
Workersbhcatalogworker, bhauditworker, bhaiagentworker, bhcelerybeat
Platform resourcesSecretStore, ESO service account, storage ExternalSecret, optional shared blob PV/PVC, Ingress

Deploy separately (not bundled in the umbrella chart):

ReleasePurpose
external-secretsSync Key Vault → Kubernetes
ingress-nginxIngress class nginx
reloaderRestart pods on secret/config changes
rabbitmqCelery message broker
redis (optional)AI agent cache
airflow (optional)Workflow orchestration

Prerequisites

Complete Azure Prerequisites before deploying:

  • AKS with Workload Identity and OIDC issuer
  • Azure Key Vault with required secrets (Key Vault Secrets)
  • PostgreSQL Flexible Server with databases and roles created
  • ACR with platform images
  • Cluster add-ons installed (ESO, ingress-nginx, reloader, RabbitMQ)

Values files

FileUse
values.yamlChart defaults, global.remoteSecrets, service toggles
values-release.yamlSample customer overlay in the chart (placeholder hostnames — reference and CI only)
values-<env>.yamlYour per-environment overlay (copy from values-release.yaml)

Copy a values file and replace all environment-specific settings. Never commit secrets to Git.

Database and Key Vault mapping

global:
remoteSecrets:
postgres:
password: azure-postgres-master-password # POSTGRES_PASSWORD → bh_dev_user
app:
userPassword: bh-app-user-password # BH_APP_USER_PASSWORD → bh_app_user

bhcatalogapi:
env:
POSTGRES_USER: bh_dev_user
BH_APP_USER: bh_app_user
POSTGRES_DB: bighammer_db_<env>

Key global settings

PathDescription
global.namespaceKubernetes namespace (default pattern: bh-control-plane)
global.image.repositoryACR prefix, e.g. <your-acr>.azurecr.io/
global.secretStore.vaultUrlhttps://<your-keyvault>.vault.azure.net/
global.secretStore.tenantIdMicrosoft Entra tenant ID
global.secretStore.managedIdentityClientIdUser-assigned MI for ESO Key Vault access
global.secretStore.nameSecretStore resource name
global.ingress.*HostNamePer-service DNS hostnames
global.ingress.tlsSecretNameKubernetes TLS secret name for ingress
global.azureBlobSchemasBlob account, container, mount path for schemas
global.azureStorageAccountStorage account for CSI / ESO storage secret
global.<subchart>.enabledToggle each sub-chart
global.dev.enabledWhen true, enables additional dev-only ExternalSecret keys

Per-service configuration

Each sub-chart is configured under global.<name> with:

  • image.name / image.tag — container image in ACR
  • env — non-secret environment variables (DB host, schema names, internal URLs)
  • serviceAccount.annotations — Workload Identity client ID per service
  • resources, livenessProbe, readinessProbe

Internal service URLs use Kubernetes DNS, e.g. http://bhcatalogapi, bhrabbitmq.<namespace>.svc.cluster.local.


Deployment options

Install scripts in the deployment repository (scripts/) orchestrate:

  1. Validate dependencies (PostgreSQL, Key Vault, ACR, ESO, RabbitMQ)
  2. Create databases and roles (create-dbs-azure.sh)
  3. Push or verify Key Vault secrets
  4. Confirm External Secrets Operator is healthy
  5. helm upgrade --install for the platform chart
cd scripts
cp install-config-azure.example.env install-config-azure.env
# Edit install-config-azure.env — see Scripts Reference

./install-prerequisites-azure.sh # once per cluster
./install-platform-azure.sh # databases, secrets, helm deploy (script name may vary)

Or use the one-shot wrapper in your deployment repository.

See Scripts Reference for configuration variables and skip flags.

Option 2: Manual Helm deployment

cd <platform-chart-directory>
helm dependency update

helm upgrade --install <release-name> . \
--namespace <your-namespace> \
--create-namespace \
-f values-<env>.yaml \
--wait \
--timeout 15m

Use a release name such as bighammer and namespace such as bh-control-plane.


Install configuration (install-config-azure.env)

Copy install-config-azure.example.env to install-config-azure.env. Required variables:

VariableDescription
DB_USERPostgreSQL admin user
DB_HOST<server>.postgres.database.azure.com
DB_PORT5432 (default)
DB_PASSWORDPostgreSQL admin password
KEY_VAULT_NAMEAzure Key Vault name
KEY_VAULT_RESOURCE_GROUPResource group containing the vault
HELM_NAMESPACETarget namespace (e.g. bh-control-plane)
HELM_RELEASEHelm release name (e.g. bighammer)
VALUES_FILEOptional path to custom values overlay
ACR_REGISTRYACR login server for image validation

Skip flags (set to true to skip a step):

FlagSkips
SKIP_DATABASESDatabase creation
SKIP_KEYVAULTKey Vault secret sync
SKIP_ESO_CHECKExternal Secrets Operator verification
SKIP_HELMHelm deployment (print command only)
SKIP_PREREQUISITESESO / reloader / RabbitMQ install

Post-deploy verification

# Pods in platform namespace
kubectl get pods -n <your-namespace>

# ExternalSecrets synced from Key Vault
kubectl get externalsecret -n <your-namespace>

# SecretStore ready
kubectl describe secretstore <secret-store-name> -n <your-namespace>

# Ingress and hosts
kubectl get ingress -n <your-namespace>

Confirm:

  • All platform pods are Running
  • ExternalSecrets show SecretSynced / Ready
  • HTTPS endpoints resolve for each configured ingress host
  • Celery workers connect to RabbitMQ (check worker logs)

Ingress hosts

Configure hostnames under global.ingress in your values file:

ServiceValues keyExample pattern
Main UIuiHostNameui.<env>.<domain>
Admin UIadminuiHostNameadminui.<env>.<domain>
Catalog APIcatalogHostNamecatalog.<env>.<domain>
Audit APIauditHostNameaudit.<env>.<domain>
AI AgentaiAgentHostNameaiagent.<env>.<domain>
KeycloakkcHostNamekc.<env>.<domain>
Keycloak APIkcapiHostNamekcapi.<env>.<domain>
Transformation utilstransformationUtilsHostNametransformation-utils.<env>.<domain>
RabbitMQ managementrabbitmqHostNamerabbitmq.<env>.<domain>

Ensure DNS (public or private) points to your ingress load balancer IP.


Enabling or disabling components

Toggle sub-charts in values:

global:
bhaiagent:
enabled: true
bhaiagentworker:
enabled: true
bhcelerybeat:
enabled: true
# Disable a component entirely:
bhtransformationutils:
enabled: false

Disabled sub-charts do not create Deployments or ExternalSecrets.


Upgrades and rollbacks

helm history <release-name> -n <your-namespace>
helm upgrade <release-name> . -f values-<env>.yaml -n <your-namespace>
helm rollback <release-name> <revision> -n <your-namespace>

After image tag changes, verify ACR contains the new tags before upgrading.


TopicLink
Key Vault names and scriptsKey Vault Secrets · Scripts Reference
Pre-install checklistDeployment Checklist
Schema / grant errorsDatabase Bootstrap Troubleshooting
ArchitectureCloud Architecture