_Docs/
Get StartedModulesPlatformDeployCookbookChangelogReference
_Deploy
  • Deployment Overview
    • Overview
    • Requirements
    • Demo
      • All-in-one Demo Chart
    • Installation
      • Operator Setup
      • Control Plane SetupEE
    • Infrastructure Services
      • PostgreSQL
      • Message Broker
      • Temporal
    • Module Configuration
      • Stack Configuration
      • Gateway Module
      • Ledger Module
      • Payments Module
      • Auth ModuleEE
      • Orchestration ModuleEE
      • Reconciliation ModuleEE
      • Wallets ModuleEE
      • Webhooks ModuleEE
    • Configuration Reference
      • Operator settings reference
      • API Reference
    • Backups management
    • Troubleshooting
    • Configure OpenTelemetry
    • Traces
    • Metrics
    • Upgrade from the operator
    • Database update
  1. Deploy
  2. Self-Hosted
  3. Installation
  4. Operator Setup
Deploy

Operator Setup

This page requires the Self-Hosted.
Deployment

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
  • kubectl configured 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#

bash
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#

bash
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_DOMAIN

Configure Service Hosts#

Enterprise Edition requires service hosts for the control plane components:

ComponentValue Key
Globalglobal.serviceHost
Membershipmembership.serviceHost
Dex (OIDC)dex.serviceHost
Portalportal.serviceHost
Console V3console.serviceHost

Using Minimal Profile#

For a minimal Enterprise installation:

bash
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.yaml

Custom Configuration#

Using a Values File#

For a production deployment with a custom domain and TLS:

bash
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_DOMAIN

View All Configuration Options#

bash
helm show values oci://ghcr.io/formancehq/helm/formance --version 1.10.0

Verify Installation#

Check that all components are running:

bash
kubectl get pods -n formance-system

You 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          2m

License Validation#

The chart enforces license validation when tags.EntrepriseEdition is true:

  • Installation will fail if global.licence.clusterID is missing
  • Installation will fail if global.licence.token is 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:

bash
helm upgrade --install operator-crds oci://ghcr.io/formancehq/helm/operator-crds \
  --version 3.9.2 \
  --namespace formance-system \
  --create-namespace

Option 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:

bash
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=true

The values-file equivalent is:

yaml
regions:
  operator:
    operator-crds:
      create: true

Confirm the CRDs, then install the operator and stack#

After installing the CRDs, confirm the Versions CRD is established before continuing:

bash
kubectl wait --for condition=established --timeout=60s crd/versions.formance.com

Then 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:

  1. Configure your Infrastructure Services (PostgreSQL, Message Broker)
  2. Deploy your first Stack
  3. Enable the modules you need
  1. Configure the Control Plane — Set up Dex, create organizations, and configure SSO
All-in-one Demo ChartControl Plane Setup
On This Page
  • Prerequisites
  • Quick Start
  • Set Environment Variables
  • Install
  • Configure Service Hosts
  • Using Minimal Profile
  • Custom Configuration
  • Using a Values File
  • View All Configuration Options
  • Verify Installation
  • License Validation
  • Troubleshooting
  • no matches for kind "Versions" in version "formance.com/v1beta1"
  • Next Steps