Configuration Model
How deployment inputs are organized in the BullSequana AI Terraform layer
This page explains how deployment configuration is structured in the coreai-platform Terraform layer.
The current reference implementation is under deployments/terraform/bsq-ai and separates platform inputs into a few clear groups: common platform defaults, Git and delivery settings, component scope, secrets, and environment-specific extensions.
Configuration Layers
1. Common platform defaults
common_config defines the shared foundation used across Runtime, CoreAI, and ProAI.
Typical inputs include:
- base domain
- ingress class
- storage classes
- image pull secret
- registry locations
- realm name
- whether CoreAI and ProAI components are enabled
These are the first settings to validate in any deployment because they affect routing, storage, image pulls, and platform-wide naming.
2. Git and delivery source
git_config tells Argo CD where to read manifests from:
- Git repository URL
- branch
- path inside the repository
If these values are wrong, the platform can bootstrap Argo CD successfully but fail to synchronize the actual application layer.
3. Component scope and defaults
Component enablement and many default versions are controlled through:
components_config- modular CoreAI component overrides
- modular ProAI component overrides
This is where deployment scope is shaped. It controls which services are enabled, which namespaces are used, and how the default platform footprint is assembled.
4. Secrets and service credentials
Secrets are provided through the .auto.tfvars layer and cover areas such as:
- Argo CD access
- registry authentication
- Keycloak client secrets for SSO-enrolled components
- database credentials
- MinIO service accounts
- Grafana and MLflow credentials
- model source credentials such as Hugging Face
Some values are mandatory for bootstrap, while others can be generated automatically when left empty.
Keycloak client secrets deserve specific attention. Each SSO-enabled component has a keycloak_client_secret variable. When left empty (the default), a random secret is generated automatically. When provided, the explicit value is used. Either way, the secret becomes part of the OIDC client registration that the platform pushes to Keycloak during deployment.
5. Provider-specific or circumstantial settings
Some inputs only matter in specific environments.
Current examples include:
- Azure DNS configuration for
external-dns - Azure DNS-01 inputs for
cert-manager - proxy settings
- environment-specific registry replication paths
- optional TLS material through
custom_tls
These are circumstantial inputs. They should only be filled when the target environment actually requires them.
What Is Usually Mandatory
In practice, every successful deployment needs clear values for:
common_config.base_domaincommon_config.rwo_storageclasscommon_config.rwx_storageclass- registry location and image pull credentials
git_config.git_repo_urlgit_config.git_branchgit_config.git_path- certificate strategy
- DNS ownership model
Even when defaults exist in Terraform, several of those defaults are placeholders or environment-specific and still need to be reviewed before deployment.
What Is Often Optional
These settings are commonly optional or can be left at defaults initially:
- database names and owners for several services
- some service passwords that can be generated automatically
- component version overrides
- advanced sizing values
- advanced affinity or scheduling settings
They still matter for production hardening, but they are not always required to begin a controlled rollout.
What Is Environment-Specific
These settings should be treated as conditional:
- Azure DNS and certificate variables
- proxy configuration
- registry replication details
- external identity federation details
- cloud-specific storage class names
SSO Scope
Most platform components are automatically enrolled into Keycloak for single sign-on. This is controlled per component through the sso_enable flag, which defaults to true.
How it works
When sso_enable is true and the component is enabled, the Terraform layer generates:
- an SSO configuration secret containing the OIDC client definition, groups, and roles
- a PreSync setup job that registers the component with Keycloak before deployment
- a PostDelete cleanup job that removes the Keycloak client when the component is deleted
When sso_enable is set to false, none of these resources are created. The component deploys without Keycloak integration.
Disabling SSO for a component
To disable SSO for any component, set its sso_enable flag to false in the relevant variable block. For example:
components_config = {
langfuse = {
# ... other settings ...
sso_enable = false
}
}Or for a modular CoreAI/ProAI component:
coreai_portal_config = {
sso_enable = false
}Components with SSO support
The following components have an sso_enable flag:
| Layer | Components |
|---|---|
| Runtime | Grafana (kube-prometheus-stack), PgAdmin, MinIO, Argo CD |
| CoreAI | Portal, LLM Backend (CoreAI API), Langfuse, MLflow, Temporal, Model Installer, LiteLLM |
| ProAI | Superset, Strimzi (Kafka), Airbyte (via oauth2-proxy), Attu (via oauth2-proxy) |
Keycloak enroll credentials
The setup and cleanup jobs authenticate against Keycloak using a dedicated enroll user. The password for this user is controlled by keycloak_enroll_password. When left empty, a random password is generated.
The enroll credentials are distributed as a Kubernetes secret (keycloak-enroll-credentials) to every namespace that has at least one SSO-enabled component.
For a deeper explanation of how the enrollment mechanism works, see the Keycloak component page.
Safe Review Checklist
Before applying a deployment, validate these questions:
- Does the target environment have the required storage classes?
- Does the base domain match a DNS zone that the platform can manage?
- Is the registry reachable from the cluster?
- Is the Git path correct for the manifests Argo CD should reconcile?
- Is the certificate model clear: provided TLS material or DNS-driven issuance?
- Are only the needed platform tiers enabled?
Minimal Input Shape
common_config = {
base_domain = "<platform-domain>"
ingressclassname = "<ingress-class>"
rwo_storageclass = "<rwo-storage-class>"
rwx_storageclass = "<rwx-storage-class>"
imagepullsecret = "<pull-secret-name>"
registry = "<registry-host>"
registry_platform_repository = "coreai/platform"
registry_backend_repository = "coreai/backend"
registry_portal_repository = "coreai/portal"
registry_helm_repository = "coreai/helm"
realm_name = "dataplatform"
coreai_components = true
proai_components = true
}
git_config = {
git_repo_url = "<git-repository-url>"
git_branch = "<git-branch>"
git_path = "<manifest-path>"
}
custom_tls = {
enabled = false
ca_crt = ""
tls_crt = ""
tls_key = ""
}Use that structure as the baseline, then add only the environment-specific and service-specific inputs required by the chosen deployment model.