Skip to main content
An on-premise installation is configured in three files, each holding a different kind of value. Knowing which file owns what is most of the work.
All three are per-deployment and all three stay out of the repository. A values file committed to the repo becomes the file the next installation is accidentally run against.

The Vault

Copy ansible/group_vars/all/vault.example.yml to vault.yml, fill it in, and encrypt it. Every top-level key becomes one Kubernetes Secret in the release namespace.

root-services

database

Five connection strings, one per database. In Scenario C the installer creates all five on the host it provisions; in Scenario B you point them at your own endpoint. Scenario C also needs vault_postgres_passwords, a separate top-level block naming one password per role:
The installer applies exactly these with ALTER ROLE; it never generates its own. Re-running an install therefore re-asserts what your vault says rather than rotating anything behind your back, which is also what makes rotating a password a matter of editing the vault and re-running.

aws-bucket

Object storage. In an on-premise installation this is MinIO running in your cluster, not AWS — the key names are historical.
BUCKET_NAME is one of the keys the value gate does not type-check. A CHANGE_ME left here passes the gate, and the installation then fails at the MinIO Ingress precondition — which is loud and early, but only because that check was added for exactly this.

control-plane

The rest

Social sign-in is optional and per-provider. A deployment that configures none simply does not offer social sign-in — the providers are registered only when configured, rather than half-registered with empty credentials.

Who owns the blockchain endpoint

The blockchain values can be yours or ROOTKey’s, and it is a deliberate choice rather than a default: Either way the wallet that signs stays inside your deployment: the RPC endpoint is where transactions are sent, not who signs them. Decide this during scoping, because it changes both the egress allowlist and who is responsible for the node’s availability.

The offline licence (air-gapped only)

Air-gapped deployments have no Control Plane link, so the licence arrives as a signed artefact you paste into a top-level vault key:
Leave it empty in egress-only mode, where the licence is fetched and renewed over the link instead.

The Helm Values File

Copy helm/values-onprem.example.yaml. Everything below is per-deployment.

Images

Every one of the 24 workloads needs a real repository and tag. The tag is the released commit SHA of that service, which ROOTKey publishes with each release.
The value gate rejects <commit-sha>, registry.example.com and CHANGE_ME in any image field.

The file base URL

This is where a browser fetches a stored file from. It reaches every workload that declares the variable.
Getting this wrong is the single most common way an installation “succeeds” and is unusable. Every pod is Ready, Helm reports success, users register, files upload and anchor — and then no avatar, logo, file link or compliance report opens, with nothing in any log, because the URL is only ever dereferenced by the user’s browser and never reaches the cluster.
Three rules:
  1. The host must be the same as the platform frontend Ingress host, and the same as rootkey_public_host.
  2. The path must be /files.
  3. Do not include the bucket name. The MinIO Ingress prepends it from the vault.

Ingress

The TLS Secret must already exist in the namespace. There is no ACME issuer.

Resources

The CPU and memory limits shipped in the chart are sized for the multi-tenant cloud, where a tight per-pod limit stops one customer starving another. An on-premise box is the opposite: it is dedicated to one client, and the same limit becomes a brake with no beneficiary.
This is measured, not estimated. On an eight-core box at 16% utilisation, a service limited to 200m accumulated 84 throttling events and 4.69 seconds of throttled time during a 3-second test, with 6.7 cores idle beside it. The visible symptom is file creation timing out after five seconds on a machine that looks unloaded.
Raise the limits in your values file. The example file ships with values already raised for a dedicated host and explains each one.

The Inventory

ansible/inventory/hosts.ini — the target, plus variables that belong to the deployment rather than to Helm.
Values set here win over ansible/group_vars/all/main.yml, which ships with rootkey_public_host empty. That file is shared and versioned; the inventory is yours.

Deployment-Wide Variables

Set in ansible/group_vars/all/main.yml, or overridden per deployment with -e KEY=VALUE.
→ Next: Verification