Configuration model
Configure BullSequana AI through TOML, environment overrides, generated secrets, and sizing presets.
The platform CLI reads one global platform.toml and one variables.toml per component. Jinja2 templates turn the resolved values into Helm values and Kubernetes manifests.
Global configuration
src/manifests/source/platform.toml contains shared settings:
| Section | Purpose |
|---|---|
[common] | Domain, registry, storage classes, realm, cluster DNS, and affinity defaults |
[object_storage] | Primary Rook-Ceph or external S3-compatible object store |
[object_storage.capabilities] | Provider behavior such as versioning, STS, and cross-account access |
[model_storage] | Optional dedicated S3-compatible model repository |
[git] | GitOps repository, branch, and path |
[custom_tls] | Optional operator-supplied TLS material |
[proxy] | HTTP, HTTPS, and no-proxy values |
[azure] and [gcp] | Provider-specific integrations |
[secrets] | Sealed Secrets or an external Vault-backed secret source |
[apps] | Parent Argo CD application waves |
[sizing] | Platform-wide resource multiplier |
[default] | Non-production fallback values |
The four deployment groups are common, coreai, inference, and proai. They are implementation names for Foundation, AI, inference, and Data delivery—not product access boundaries.
Environment precedence
The CLI loads values in this order, with the last source winning:
generated_secrets.envplatform.envlocal.env- shell or CI environment
Keep platform.env for shared site values and local.env for personal Git credentials and overrides. Both secret-bearing files must remain outside source control.
Any TOML leaf can be overridden with its uppercased, underscore-separated name. For example, common.registry_certificate becomes COMMON_REGISTRY_CERTIFICATE, while a component resource such as portal.resources.cpu_request becomes PORTAL_RESOURCES_CPU_REQUEST.
Object storage
Use provider = "rook-ceph" for the in-cluster RGW path or provider = "external-s3" for a customer-managed endpoint. Configure the scheme, host, port, region, path style, public hostname, CA, and provider capabilities in the same section.
With external-s3, buckets and credentials are provided outside Rook. The storage operator hands off the site configuration once, and the BullSequana AI deployment operator maps its credentials to the component secrets. Set capability flags to match the real provider; the CLI validates combinations that cannot work.
Browser-facing presigned downloads require the bucket CORS policy to allow the portal origin (https://portal.<base-domain>) for GET and HEAD. Rook-Ceph applies this policy to platform-owned buckets. For external S3, leave manage_bucket_cors = false when the storage operator manages CORS and configure the policy before deployment. Set [object_storage.capabilities] manage_bucket_cors = true only when BullSequana AI should call PutBucketCors; enabling it replaces the bucket's complete CORS document rather than merging individual rules.
[model_storage] is independent of application object storage. Enable it when multiple clusters or workloads need one shared, immutable S3 model repository.
Use the External S3 object storage playbook for the complete endpoint, bucket, credential, capability, CORS, and cutover procedure.
Component configuration
Each component lives under src/manifests/source/<parent>/<component>/ and has a required [component] table:
[component]
name = "portal"
namespace = "portal"
enabled = true
version = "1.4.0"
format = "helm"
chart_name = "portal"
chart_version = "1.4.0"
release_name = "portal"
parent_app = "coreai"
sync_wave = 10Additional tables are component-specific. Their values are flattened and prefixed for template use. Component names must be unique across all four parent applications.
Set [component] enabled = false or its environment override to omit a component. The CLI does not generate an empty parent application.
Secret values
Secret nodes declare a kind and output format:
admin_password = { kind = "password", format = "plain" }
api_token = { kind = "token", format = "b64", length = 32 }Supported kinds are password, token, and secret. Supported formats are plain, b64, and bcrypt.
Resolution is:
- matching environment variable;
- an existing value in
generated_secrets.env; - a newly generated value when
RANDOMIZE_SECRETSis notfalse, or whengenerate_once = true; DEFAULT_SECRET, then[default] secret, when generation is disabled.
Generated plain-text values are persisted in generated_secrets.env so later renders reuse them. Preserve this file until its values have been copied into the site-managed secret source. Deleting it can rotate unresolved secrets on the next render.
Plain YAML files are copied without sealing, so secret material belongs only in rendered secret templates.
Secrets backend
The [secrets] table selects how rendered Kubernetes Secret documents reach the cluster:
backend = "sealed-secrets"(default): the CLI seals eachSecretwith the local kubeseal certificate, and the manifests repository holdsSealedSecretresources.backend = "external-vault": the CLI replaces eachSecretwith anExternalSecretthat carries no values. External Secrets Operator reads the values from a customer-managed Vault. Thesealed-secretscomponent is not rendered.
With external-vault, set SECRETS_VAULT_URL to the Vault endpoint. The remote key of each secret is <path_prefix>/<namespace>/<secret-name>, with one property per secret data key. Populate those entries before Argo CD syncs the platform.
External Vault secrets
This backend is separate from the bundled OpenBao service. The CLI does not provision Vault, populate its values, or migrate existing secrets automatically.
Use the External Vault secrets playbook for the settings, the Vault entries, and the bootstrap procedure.
Sizing presets
Set SIZING_PRESET to S, M, L, XL, or CUSTOM. Presets multiply component CPU and memory requests and limits from their source baseline. Storage and ephemeral-storage values are never multiplied.
For custom sizing, set SIZING_PRESET=CUSTOM and SIZING_CUSTOM_MULTIPLIER. Explicit component resource environment overrides are applied after the multiplier and remain absolute.
MLflow CPU limit
The MLflow tracking server derives its start-up load from its final CPU limit, which is the value after the preset multiplier or an explicit MLFLOW_RESOURCES_CPU_LIMIT override. The official MLflow chart has fixed health checks, so this load must stay within its start-up window.
- The minimum supported limit is
500m. Below it, the server can fail its liveness probe and restart in a loop. MLFLOW_SERVER_WORKERSdefaults toauto: one worker per full CPU of the limit, between 1 and 4.MLFLOW_SERVER_JOB_EXECUTIONdefaults toauto: MLflow job execution (GenAI jobs such as scorers and prompt optimisation) is on at a limit of 1 CPU or more, and off below.
Set either variable to force a value. More workers, or job execution, at a low CPU limit can push start-up past the liveness window. See Upgrading 1.3.0 to 1.4.0: MLflow CPU limit for measured start-up times.
Cluster DNS and registry trust
Use COMMON_INTERNAL_RESOLVER, COMMON_INTERNAL_RESOLVER_NAMESPACE, and COMMON_CLUSTER_DOMAIN when the cluster does not use the Kubernetes defaults. For a private registry CA, set base64-encoded PEM in COMMON_REGISTRY_CERTIFICATE. COMMON_DOCKER_CONFIG_JSON can add credentials for other registries without replacing the primary registry entry.
SSO configuration
Components that support automatic Keycloak enrollment have an [sso] table. Set its enabled value or the corresponding environment override to control whether the CLI renders the client configuration and enrollment jobs. Keep SSO enabled for product services unless the deployment has an explicitly reviewed alternative authentication boundary.
The rendered PreSync job reconciles the component's OIDC client, groups, roles, protocol mappers, and service-account mappings. A PostDelete job removes component-owned identity resources when its Argo CD application is deleted.
Existing client secrets are preserved during reconciliation. Components using this enrollment do not need manually created Keycloak clients. Organization support and the organization UUID claim are also reconciled on existing realms.
Validate resolved configuration
bsqai validate
bsqai load
bsqai load portal kserve-runtime-configsReview resolved non-secret settings before rendering. Do not paste resolved secret output into tickets or logs.