Requirements

What LutraID needs from you, and the choices worth making before you start rather than after.

Tools

ToolForNotes
Docker Engine 25+ with the Compose v2 pluginThe Compose packagedocker compose version
kubectl and Helm 3.8+The Helm packageHelm pulls the chart straight from the registry
oras 1.xDownloading the release bundleUses the same login as Docker
cosign v2.5+ and craneVerifying a release, mirroring itRecommended, not required to run LutraID
openssl, curlGenerating secrets, talking to the APIPresent on almost every Linux host

Infrastructure

KubernetesDocker Compose
PostgreSQL 18External. A CloudNativePG example ships with the chartRuns on the host
Valkey / Redis 7+External. A StatefulSet example ships with the chartRuns on the host
Ingress + TLSYour controller and cert-managerBundled Caddy, or your own proxy
SMTP relayRequiredRequired
Object storageOptional — local disk otherwiseOptional — local disk otherwise

The chart bundles nothing stateful. That is deliberate: your DBA team already knows how to run PostgreSQL, and a database hidden inside a vendor chart is a database nobody backs up.

Sizing

DeploymentvCPURAMDisk
Evaluation24 GB20 GB
Small production — under 50k credentials48 GB100 GB SSD
Busier single host816 GB250 GB SSD

The database and uploaded images dominate disk growth. PostgreSQL wants fast storage.

Mail is not optional

LutraID sends account mail (verification, sign-in links, password reset, email change, invitations), credential offers and check requests. EMAIL_TRANSPORT=smtp is the default and the application refuses to start without a relay configured — an internal Postfix, Exchange, or a corporate smarthost.

Resend is supported as an alternative (EMAIL_TRANSPORT=resend), but it sends your users' addresses to a third party, which is usually the reason an installation is self-hosted in the first place.

Signing keys — decide before you go live

Issuer private keys sign the credentials your users receive.

BackendUse
dev_fileThe default. Keys are files on a volume — right for an evaluation, not suitable for production: anyone with access to that volume or to a backup of it has your issuer keys. Requires an explicit acknowledgement, which both packages set, and warns at every boot
aws_kmsAWS KMS. Configurable in both packages
vault_transitHashiCorp Vault or OpenBao Transit. Supported by the application, but neither package exposes its settings yet — contact us if you need it

vault_transit cannot perform ECDH, so OID4VCI encrypted credential requests are unavailable on it. Issuance and verification are unaffected, and LutraID refuses to start if you enable that feature on a backend that cannot support it — rather than failing later inside a citizen-facing flow.

The one value you cannot change later

PUBLIC_BASE_URL — host in the Helm chart — becomes the issuer identifier embedded in every credential you issue. Changing it invalidates credentials already in the field.

Decide the hostname before the first credential is issued. LutraID refuses a localhost address; for an evaluation on a machine with no public DNS name, see Evaluating on one machine.

Was this page helpful?