This repository contains the quickstart CLI and docker-compose files to get you up and running with the walt.id Enterprise Stack for local development. It also contains useful resources to help you with the Enterprise Stack such as configuration files, migration scripts, deployment files and more.
Bring up the whole stack using docker-compose and explore the enterprise features via our CLI tool.
The Enterprise API refuses to start without a valid license, so configure this before bringing the
stack up. A license is an SD-JWT verifiable credential signed by walt.id and cryptographically bound
to your installation. It is configured in config/license.conf, which reads the LICENSE_*
environment variables passed through by docker-compose.
LICENSE_STATE_ENCRYPTION_KEY encrypts the persisted license credential and the installation
private key in MongoDB. It ships in .env with a development default, which is fine locally. For
any real deployment:
- Use at least 32 characters and supply it from a secret manager.
- Every replica must use the same value.
- Back it up together with MongoDB. Losing it makes the persisted license state unreadable.
- A wrong or missing key fails startup closed, and live dual-key rotation is not supported.
Pick one of the two modes. After a successful first activation, the bound credential and installation key are stored in MongoDB and later restarts reuse them, so an online offer is never redeemed twice.
Online - the stack then renews itself automatically against https://license.walt.id.
LICENSE_SEED_CREDENTIAL="openid-credential-offer://..." docker compose upOffline / air-gapped - the stack never contacts walt.id. The fleet private key is created
inside MongoDB by license request. It is not written to disk, and walt.id never returns it.
-
Create the public installation request. Use the same compose project, Mongo volume, and
LICENSE_STATE_ENCRYPTION_KEYyou will use to run the API.-owrites the request, not a private key:You will receive a command like this from walt.id:
docker compose run --rm waltid-enterprise \
license request <licenseId> <organizationId> \
-o /license/installation-request.json-
Send
license/installation-request.jsonto walt.id. You get back a.waltlicensebundle only. -
Place that bundle in
license/and start. Do not setLICENSE_INSTALLATION_KEY_FILE:
LICENSE_SEED_CREDENTIAL_FILE=/license/offline-license.waltlicense docker compose upThe API loads the matching private key from Mongo. Paths are inside the container (/license/...),
because compose mounts ./license at /license.
Do not point LICENSE_INSTALLATION_KEY_FILE at installation-request.json. That file is a public
request (version / request / proof) and startup fails with KeyTypeMissingException.
LICENSE_INSTALLATION_KEY_FILE is only for rare pre-provision of a serialized walt.id key:
{ "type": "jwk", "jwk": { "kty": "EC", "crv": "P-256", "d": "...", "x": "...", "y": "..." } }Offline licenses have no grace period: the stack stops serving the moment the credential expires.
Request a renewal well before the expiry date shown in the LICENSE EXPIRY WARNING startup log line.
config/_features.conf enables dev-mode, which exposes debug endpoints and therefore requires a
DEV license. A PROD license refuses to start while dev-mode is enabled, and vice versa. Remove
dev-mode from enabledFeatures before using a PROD license.
- Container exits during startup - the license was rejected.
docker compose logs waltid-enterprisestates the reason (expired, not bound to this installation, DEV/PROD mismatch, missing seed,KeyTypeMissingExceptionfrom pointingLICENSE_INSTALLATION_KEY_FILEat the request file, orLicense fleet state integrity verification failedfrom a differentLICENSE_STATE_ENCRYPTION_KEYor leftoverlicense_statethan thelicense requestrun). - Every endpoint returns
503 Enterprise API is unavailable because the license is not active- the process started but the license is not active.GET /livezstill responds in this state. GET /license/status(superadmin auth) reports the restriction state, expiry countdown and any warning message.- Only set the relevant environment variables for the license activation mode you are using. All of them are provided as examples in the docker compose file.
The Helm chart reads license material from one pre-provisioned Secret, named by
license.secretName in helm/values.yaml. It always needs state-encryption-key, plus either
seed-credential (online) or offline-license.waltlicense with license.offline: true (offline).
The fleet private key is created in Mongo by the license.installationRequest Job. walt.id does
not issue installation-key.json.
Use docker-compose to bring up the Enterprise Stack API, UI and a MongoDB database (storage of the Enterprise Stack).
You can update the version of the enterprise stack via the .env file.
Clone the repo
git clone https://github.com/walt-id/waltid-enterprise-quickstart.gitChange Working Directory
cd waltid-enterprise-quickstartRun The Stack
docker compose pull
docker compose upIn case you want to only run the API, run:
docker compose -f docker-compose-api.yml upOnce the docker-compose is running, you can visit enterprise.localhost/swagger to access the Enterprise Stack APIs.
The UI is running at http://enterprise.localhost/login
The caddy setup is configured only for the "waltid" organisation. If you want to use a custom organisation name, you can update the Caddyfile to add your own organisation domains.
caddy:
image: caddy:2-alpine
container_name: caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
networks:
mongodb_network:
aliases:
- enterprise.localhost
- waltid.enterprise.localhost
# add your own organisation domains here
depends_on:
- waltid-enterprise
- waltid-enterprise-uiA TypeScript CLI tool for setting up and testing the walt.id Enterprise Stack.
# Clone the repo
git clone https://github.com/walt-id/waltid-enterprise-quickstart.git
cd waltid-enterprise-quickstart
# Install dependencies
cd cli
npm install
# Run full setup + primary use case (mDL issuance & verification)
npx tsx walt.ts --recreate
# Subsequence calls don't need to recreate the DB:
npx tsx walt.ts| Command | Description |
|---|---|
npx tsx walt.ts |
Full setup + primary use case (default) |
npx tsx walt.ts --recreate |
Recreate database and run full setup |
npx tsx walt.ts --setup-all |
Run all setup commands |
npx tsx walt.ts --run-all |
Run primary use case only |
npx tsx walt.ts --help |
Show all available commands |
Superadmin credentials are read from config/superadmin-registration.conf.
For detailed documentation, see cli/README.md.
Visit our docs to learn more about features and configurations of the enterprise stack.
Interested to see what releases are available? Checkout our changelogs to see the latest releases and pre-releases of the Enterprise Stack.
Need Support? As an Enterprise customer you should also have a support contract with us. Please raise any issues via the , or reach out to the team over email if you need to be given access.
- Connect and get the latest updates: Discord | Newsletter | YouTube | LinkedIn
- Get help, request features and report bugs: Support Portal
- Find more indepth documentation on our docs site
Licensed under our Enterprise License.
