This guide walks you through installing Formance on your Kubernetes cluster using the unified Formance Helm chart.
Enterprise Edition requires a valid license. Contact sales@formance.com to obtain one.
Prerequisites#
Before you begin, ensure you have:
- Kubernetes 1.30+ cluster
- Helm 3.x installed
kubectlconfigured to access your cluster- An Ingress Controller (nginx, traefik, etc.)
- SSL certificates for your domain
- Enterprise Edition license (Cluster ID and License Token)
For detailed requirements, see the Requirements page.
Quick Start#
Set Environment Variables#
export CLUSTER_ID=$(kubectl get ns kube-system -o jsonpath='\{.metadata.uid\}')
export LICENCE_TOKEN="your-licence-token"
export BASE_DOMAIN="formance.example.com"Install#
helm upgrade --install formance oci://ghcr.io/formancehq/helm/formance \
--version 1.10.0 \
--namespace formance-system \
--create-namespace \
--set tags.EntrepriseEdition=true \
--set global.licence.clusterID=$CLUSTER_ID \
--set global.licence.token=$LICENCE_TOKEN \
--set global.serviceHost=$BASE_DOMAINConfigure Service Hosts#
Enterprise Edition requires service hosts for the control plane components:
| Component | Value Key |
|---|---|
| Global | global.serviceHost |
| Membership | membership.serviceHost |
| Dex (OIDC) | dex.serviceHost |
| Portal | portal.serviceHost |
| Console V3 | console.serviceHost |
Using Minimal Profile#
For a minimal Enterprise installation:
helm upgrade --install formance oci://ghcr.io/formancehq/helm/formance \
--version 1.10.0 \
--namespace formance-system \
--create-namespace \
--set tags.EntrepriseEdition=true \
--set global.licence.clusterID=$CLUSTER_ID \
--set global.licence.token=$LICENCE_TOKEN \
-f https://raw.githubusercontent.com/formancehq/helm/main/charts/formance/profiles/ee-minimal.yamlCustom Configuration#
Using a Values File#
For a production deployment with a custom domain and TLS:
export CLUSTER_ID=$(kubectl get ns kube-system -o jsonpath='\{.metadata.uid\}')
export LICENCE_TOKEN="your-licence-token"
export BASE_DOMAIN="formance.example.com"
helm upgrade --install formance oci://ghcr.io/formancehq/helm/formance \
--version 1.10.0 \
--namespace formance-system \
--create-namespace \
--set tags.EntrepriseEdition=true \
--set global.licence.clusterID=$CLUSTER_ID \
--set global.licence.token=$LICENCE_TOKEN \
--set global.serviceHost=$BASE_DOMAINView All Configuration Options#
helm show values oci://ghcr.io/formancehq/helm/formance --version 1.10.0Verify Installation#
Check that all components are running:
kubectl get pods -n formance-systemYou should see:
NAME READY STATUS RESTARTS AGE
formance-operator-xxxxx-xxxxx 1/1 Running 0 2m
membership-xxxxx-xxxxx 1/1 Running 0 2m
console-v3-xxxxx-xxxxx 1/1 Running 0 2m
membership-dex-xxxxx-xxxxx 1/1 Running 0 2m
postgresql-0 1/1 Running 0 2mLicense Validation#
The chart enforces license validation when tags.EntrepriseEdition is true:
- Installation will fail if
global.licence.clusterIDis missing - Installation will fail if
global.licence.tokenis missing
Get your Cluster ID with: kubectl get ns kube-system -o jsonpath='\{.metadata.uid\}'
Troubleshooting#
no matches for kind "Versions" in version "formance.com/v1beta1"#
If the install fails with no matches for kind "Versions" in version "formance.com/v1beta1" (often alongside ensure CRDs are installed first), the Formance operator's Custom Resource Definitions (CRDs) aren't registered in your cluster yet. The chart is trying to create a Versions custom resource (kind: Versions, formance.com/v1beta1) before the CRD that defines it exists.
Cause. The CRD that backs kind: Versions — versions.formance.com — is provided by the operator's bundled operator-crds subchart, and that subchart is not installed by default: regions.operator.operator-crds.create defaults to false (and the bundled subchart is deprecated in favor of a standalone operator-crds chart). With nothing to register versions.formance.com, the Versions resource the chart applies has no matching CRD. The CRDs must be installed before the operator and stack.
Fix — install the operator CRDs first, then install the operator and stack. Use one of the options below.
Option 1 — install the operator-crds chart as its own release (recommended)#
Install the standalone operator-crds chart from the Formance OCI registry before installing Formance. It follows the operator's 3.x version line (independent of the unified chart version), so pin it to the operator version bundled by your Formance chart release — the version below matches Formance chart 1.10.0:
helm upgrade --install operator-crds oci://ghcr.io/formancehq/helm/operator-crds \
--version 3.9.2 \
--namespace formance-system \
--create-namespaceOption 2 — enable the bundled CRDs via values#
Alternatively, let the unified chart create the CRDs by enabling the bundled subchart on the install. Helm orders the CRDs ahead of the Versions resource within the same release:
helm upgrade --install formance oci://ghcr.io/formancehq/helm/formance \
--version 1.10.0 \
--namespace formance-system \
--create-namespace \
--set regions.operator.operator-crds.create=trueThe values-file equivalent is:
regions:
operator:
operator-crds:
create: trueConfirm the CRDs, then install the operator and stack#
After installing the CRDs, confirm the Versions CRD is established before continuing:
kubectl wait --for condition=established --timeout=60s crd/versions.formance.comThen install (or re-run) the operator and stack using the install command for your edition (Community or Enterprise) documented above under Quick Start. If you used Option 2, the single install command already created the CRDs alongside the rest of the release.
You can also hit this error by bypassing Helm's normal install flow — for example rendering the chart offline and piping it to kubectl (helm template ... | kubectl apply -f -), or passing --skip-crds. The fix is the same: install the CRDs (via either option above) and wait for versions.formance.com to be established before applying anything that references kind: Versions.
Next Steps#
After installing the operator:
- Configure your Infrastructure Services (PostgreSQL, Message Broker)
- Deploy your first Stack
- Enable the modules you need
- Configure the Control Plane — Set up Dex, create organizations, and configure SSO