Skip to main content

Organisation Wallet Suite - On-Premise Deployment Instructions

The Helm chart for Organisation Wallet Suite by iGrant.io enables the issuer, holder, and verifier of verifiable credentials within the eIDAS 2.0 framework. It incorporates the latest amendments, the EU Architectural Reference Framework (ARF), and Implementing Acts (IA).

About

This page provides Helm charts for deploying the Organisation Wallet Suite by iGrant.io on Kubernetes. The Organisation Wallet Suite enables organizations to issue, hold, and verify credentials in compliance with the European Digital Identity framework.

Requirements

RequirementVersion
Kubernetes>=1.20.0-0
Helm>=3.0.0

Quick Start

Add Helm Repository

helm repo add organisationwallet https://l3-iGrant.github.io/helmcharts/stable/
helm repo update

Install Chart

helm install [RELEASE_NAME] organisationwallet/organisationwallet --version 2026.1.3

To install with a custom values file:

helm install [RELEASE_NAME] organisationwallet/organisationwallet --version 2026.1.3 --values values.yaml

Uninstall Chart

helm uninstall [RELEASE_NAME]

This removes all Kubernetes components associated with the chart and deletes the release.

Configuration

To view all configurable options:

helm show values organisationwallet/organisationwallet

Global Configuration

ParameterDescriptionDefault
namespaceKubernetes namespaceig
prefixPrefix for Kubernetes object names""
resourcesResource constraints for pods{}
securityContext.runAsUserUser ID to run containers0
storageClassNameStorage class for persistent volumeslocal-path
namespace: ig
prefix:
resources: {}
securityContext:
runAsUser: 0
storageClassName: local-path

PostgreSQL

PostgreSQL is used as the database backend for Keycloak.

ParameterDescriptionDefault
postgres.enabledEnable PostgreSQL deploymenttrue
postgres.imageContainer imageeurope-docker.pkg.dev/jenkins-189019/igrant-customers/igrant-api/postgres:2025.1.1
postgres.usernameDatabase usernamedbadmin
postgres.passwordDatabase password<your-password>
postgres.databaseDatabase namekcdb
postgres:
enabled: true
image: europe-docker.pkg.dev/jenkins-189019/igrant-customers/igrant-api/postgres:2025.1.1
username: dbadmin
password: <your-password>
database: kcdb

Keycloak

Keycloak provides identity and access management.

ParameterDescriptionDefault
keycloak.enabledEnable Keycloak deploymenttrue
keycloak.imageContainer imageeurope-docker.pkg.dev/jenkins-189019/igrant-customers/igrant-api/keycloak:12.0.4-debian-10-r1
keycloak.adminUsernameAdmin usernamekcadmin
keycloak.adminPasswordAdmin password<your-password>
keycloak.dbUsernameDatabase usernamedbadmin
keycloak.dbPasswordDatabase password<your-password>
keycloak.dbNameDatabase namekcdb
keycloak.frontendUrlFrontend URLhttps://keycloak.example.com
keycloak.ingress.enabledEnable ingresstrue
keycloak:
enabled: true
image: europe-docker.pkg.dev/jenkins-189019/igrant-customers/igrant-api/keycloak:12.0.4-debian-10-r1
adminUsername: kcadmin
adminPassword: <your-password>
dbUsername: dbadmin
dbPassword: <your-password>
dbName: kcdb
frontendUrl: https://keycloak.example.com
ingress:
enabled: true
annotations:
kubernetes.io/ingress.allow-http: "false"
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/proxy-buffer-size: 128k
cert-manager.io/cluster-issuer: "letsencrypt-prod"
kubernetes.io/tls-acme: "true"
nginx.ingress.kubernetes.io/proxy-set-headers: |
X-Forwarded-Proto https
X-Forwarded-Port 443
hosts:
- host: keycloak.example.com
paths:
- path: /
pathType: Prefix
tls:
- hosts:
- keycloak.example.com
secretName: keycloak-tls

MongoDB

MongoDB is used as the primary database for the Organisation Wallet Suite.

ParameterDescriptionDefault
mongo.enabledEnable MongoDB deploymenttrue
mongo.imageContainer imageeurope-docker.pkg.dev/jenkins-189019/igrant-customers/igrant-api/mongodb:7.0-debian-12
mongo.usernameDatabase usernamedbadmin
mongo.passwordDatabase password<your-password>
mongo.databaseDatabase nameowsdb
mongo:
enabled: true
image: europe-docker.pkg.dev/jenkins-189019/igrant-customers/igrant-api/mongodb:7.0-debian-12
username: dbadmin
password: <your-password>
database: owsdb

NATS

NATS provides messaging and event streaming capabilities.

ParameterDescriptionDefault
nats.enabledEnable NATS deploymenttrue
nats.imageContainer imagenats:2.10.14-alpine
nats:
enabled: true
image: nats:2.10.14-alpine

API

The API service provides the backend for the Organisation Wallet Suite.

ParameterDescriptionDefault
api.enabledEnable API deploymenttrue
api.imagePullSecretImage pull secret name""
api.imageContainer imageeurope-docker.pkg.dev/jenkins-189019/igrant-customers/igrant-api/api:2026.1.1
api.ingress.enabledEnable ingresstrue
api.configuration.ApiSecretKeyAPI secret key for JWT<your-secret>
api.configuration.Iam.urlKeycloak URL""
api.configuration.Iam.realmKeycloak realmigrant-users
api.configuration.Iam.ClientIdKeycloak client IDigrant-ios-app
api.configuration.Nats.urlNATS server URL""
api.configuration.Nats.timeoutNATS connection timeout5
api:
enabled: true
imagePullSecret:
image: europe-docker.pkg.dev/jenkins-189019/igrant-customers/igrant-api/api:2026.1.1
ingress:
enabled: true
annotations:
kubernetes.io/ingress.allow-http: "false"
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/proxy-buffer-size: 128k
cert-manager.io/cluster-issuer: "letsencrypt-prod"
kubernetes.io/tls-acme: "true"
hosts:
- host: api.example.com
paths:
- path: /
pathType: Prefix
tls:
- hosts:
- api.example.com
secretName: api-tls
configuration:
database:
host:
ApiSecretKey: <your-secret>
Iam:
url: https://keycloak.example.com/auth
realm: igrant-users
ClientId: igrant-ios-app
Nats:
url:
timeout: 5

Vault Facade

The Vault Facade provides a unified interface for secrets management. It supports two modes:

  • mongo (Recommended for development): Uses MongoDB for storing secrets
  • vault: Uses HashiCorp Vault for production-grade secrets management
ParameterDescriptionDefault
vaultFacade.enabledEnable Vault Facade deploymenttrue
vaultFacade.imagePullSecretImage pull secret name""
vaultFacade.imageContainer imageeurope-docker.pkg.dev/jenkins-189019/igrant-customers/igrant-api/vault-facade:2026.1.1
vaultFacade.appModeApplication mode (mongo or vault)mongo
vaultFacade.vault.addrVault server address (when appMode=vault)""
vaultFacade.vault.userVault username (when appMode=vault)""
vaultFacade.vault.passwordVault password (when appMode=vault)""
vaultFacade:
enabled: true
imagePullSecret:
image: europe-docker.pkg.dev/jenkins-189019/igrant-customers/igrant-api/vault-facade:2026.1.1
appMode: mongo
vault:
addr:
user:
password:

Organisation Wallet Service

The core Organisation Wallet service.

ParameterDescriptionDefault
organisationWallet.enabledEnable Organisation Wallet deploymenttrue
organisationWallet.imagePullSecretImage pull secret name""
organisationWallet.imageContainer imageeurope-docker.pkg.dev/jenkins-189019/igrant-customers/igrant-api/ows:2026.1.5
organisationWallet.dbNameDatabase namewalletdb
organisationWallet.service.ingress.enabledEnable ingresstrue
organisationWallet:
enabled: true
imagePullSecret:
image: europe-docker.pkg.dev/jenkins-189019/igrant-customers/igrant-api/ows:2026.1.5
dbName: walletdb
service:
ingress:
enabled: true
annotations:
kubernetes.io/ingress.allow-http: "false"
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/proxy-buffer-size: 128k
cert-manager.io/cluster-issuer: "letsencrypt-prod"
kubernetes.io/tls-acme: "true"
hosts:
- host: wallet.example.com
paths:
- path: /
pathType: Prefix
tls:
- hosts:
- wallet.example.com
secretName: wallet-tls

Enterprise Dashboard

The web-based administration dashboard.

ParameterDescriptionDefault
enterpriseDashboard.enabledEnable Enterprise Dashboard deploymenttrue
enterpriseDashboard.imagePullSecretImage pull secret name""
enterpriseDashboard.imageContainer imageeurope-docker.pkg.dev/jenkins-189019/igrant-customers/igrant-api/dashboard:2026.1.1
enterpriseDashboard.ingress.enabledEnable ingresstrue
enterpriseDashboard:
enabled: true
imagePullSecret:
image: europe-docker.pkg.dev/jenkins-189019/igrant-customers/igrant-api/dashboard:2026.1.1
ingress:
enabled: true
annotations:
kubernetes.io/ingress.allow-http: "false"
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/proxy-buffer-size: 128k
cert-manager.io/cluster-issuer: "letsencrypt-prod"
kubernetes.io/tls-acme: "true"
hosts:
- host: dashboard.example.com
paths:
- path: /
pathType: Prefix
tls:
- hosts:
- dashboard.example.com
secretName: dashboard-tls

Secrets Management

The Organisation Wallet Suite supports two modes for secrets management via the Vault Facade service.

For development and testing environments, the MongoDB-based vault is recommended. This mode stores secrets directly in MongoDB, simplifying the deployment without requiring external dependencies.

To enable MongoDB-based vault:

vaultFacade:
enabled: true
image: europe-docker.pkg.dev/jenkins-189019/igrant-customers/igrant-api/vault-facade:2026.1.1
appMode: mongo

This configuration uses the existing MongoDB deployment for secrets storage, making it ideal for:

  • Local development environments
  • Testing and staging deployments
  • Quick proof-of-concept setups

HashiCorp Vault (Optional - Production)

For production environments requiring enterprise-grade secrets management, HashiCorp Vault can be used as an optional backend.

Prerequisites

Install HashiCorp Vault using the official Helm chart:

# Add HashiCorp Helm repository
helm repo add hashicorp https://helm.releases.hashicorp.com
helm repo update

# Install Vault with HA and Raft storage
helm upgrade --install vault hashicorp/vault \
--namespace vault \
--create-namespace \
-f vault-values.yaml

Create a vault-values.yaml file:

server:
affinity: ""
ha:
enabled: true
raft:
enabled: true
setNodeId: true
config: |
ui = true
cluster_name = "vault-integrated-storage"
storage "raft" {
path = "/vault/data/"
}
listener "tcp" {
address = "[::]:8200"
cluster_address = "[::]:8201"
tls_disable = "true"
}
service_registration "kubernetes" {}

Initialize and Unseal Vault

# Initialize Vault (only needed once)
kubectl exec -n vault vault-0 -- vault operator init

# Store the unseal keys and root token securely
# Unseal Vault using the unseal keys
kubectl exec -n vault vault-0 -- vault operator unseal <unseal-key-1>
kubectl exec -n vault vault-0 -- vault operator unseal <unseal-key-2>
kubectl exec -n vault vault-0 -- vault operator unseal <unseal-key-3>

Configure Vault Facade for HashiCorp Vault

vaultFacade:
enabled: true
image: europe-docker.pkg.dev/jenkins-189019/igrant-customers/igrant-api/vault-facade:2026.1.1
appMode: vault
vault:
addr: http://vault.vault.svc.cluster.local:8200
user: <vault-username>
password: <vault-password>

For more information, see the Vault Helm documentation.

Onboarding Organisations

After deploying the Organisation Wallet Suite, you need to initialize a wallet provider organisation and tenant organisations. This is done using the setup script included in the Organisation Wallet Config service.

Running the Setup Script

  1. Access the Organisation Wallet Config service container:
# For Kubernetes
kubectl exec -it <ows-config-pod-name> -n <namespace> -- /bin/bash

# For Docker Compose
docker compose exec organisation-wallet /bin/bash
  1. Navigate to the scripts folder and run the setup script:
cd scripts
uv run setup_organisations.py --config sample_config.yaml

Sample Configuration

Create a configuration file (e.g., sample_config.yaml) with the following structure:

# Organisation type to create/use
organisationType: "Technology"

# List of organisations to set up
organisations:
# Wallet Provider Organisation
- admin:
email: "[email protected]"
name: "Wallet Provider"
password: "<your-password>"
phone: "+1234567890"

organisation:
name: "Wallet Provider Organisation"
location: "Sweden"
description: "Wallet provider organisation description. Contact our DPO at [email protected] for data-related queries."
policyUrl: "https://example.com/privacy.html"

# Enable this organisation as a wallet provider
isWalletProvider: true

# Vault type for key management
vaultType: "igrantioVault"

# Custom wallet features (optional)
features:
gettingStarted: true
dataAgreements: false
managedData: false
digitalWalletAries: false
digitalWalletOid4vc: true
manageUsers: false
privacyDashboard: false
account: true
supportEvents: true

# Credential definitions to create
credentialDefinitions:
- label: "Wallet Unit Attestation"
expirationInDays: 30
supportRevocation: true
display:
name: "Wallet Unit Attestation"
description: "Attests the security context of a wallet unit"
backgroundColor: "#1E3A5F"
textColor: "#FFFFFF"
credentialFormat: "dc+sd-jwt"
vct: "WalletUnitAttestation"
version: "draft_13"
claims:
type: "object"
properties:
attested_security_context:
type: "string"
limitDisclosure: false
additionalProperties: true
required:
- "attested_security_context"
credentialBindingMethods:
- "did:key"

# Tenant Organisation
- admin:
email: "[email protected]"
name: "Tenant Admin"
password: "<your-password>"
phone: "+1234567891"

organisation:
name: "Tenant Organisation"
location: "Berlin"
description: "Tenant organisation description. Contact our DPO for data-related queries."
policyUrl: "https://tenant.com/policy.html"

isWalletProvider: false
createWalletUnit: true
vaultType: "igrantioVault"

Configuration Options

FieldDescriptionRequired
organisationTypeType of organisation (e.g., "Technology")Yes
admin.emailAdmin user emailYes
admin.nameAdmin user nameYes
admin.passwordAdmin user passwordYes
organisation.nameOrganisation nameYes
organisation.locationOrganisation locationYes
organisation.descriptionOrganisation descriptionYes
organisation.policyUrlPrivacy policy URLYes
isWalletProviderSet to true for wallet provider orgYes
createWalletUnitCreate wallet unit for tenant orgsNo
vaultTypeVault type (igrantioVault)Yes
featuresFeature flags for the organisationNo
credentialDefinitionsCredential definitions to createNo

References

[1] Organisation Wallet Suite Helm chart (Artifact Hub): https://artifacthub.io/packages/helm/organisationwallet/organisationwallet

[2] Helm charts repository: https://github.com/L3-iGrant/helmcharts

[3] Organisation Wallet Suite overview: https://docs.igrant.io/docs/organisation-wallet-overview/

[4] Organisation Wallet Suite features: https://docs.igrant.io/docs/organisation-wallet-features/