Skip to main content
For anything beyond local development, run the Wallet Gateway as a container. It ships in both Docker and Helm variants, and the images and charts are public on the GitHub Container Registry, so no access request is required.
  • Docker registry: ghcr.io/digital-asset/wallet-gateway/docker/wallet-gateway:<VERSION>
  • Helm repository: ghcr.io/digital-asset/wallet-gateway/helm/wallet-gateway:<VERSION>
Replace <VERSION> with the version you want to deploy; there is currently no latest tag. To find a version, check the GHCR tags or the matching npm package.

Before you deploy

Make production choices in your configuration file before packaging it. See Configure the Wallet Gateway and the Configuration reference.
  • Use a persistent store. Prefer postgres. The memory store loses all data when a container or pod is recreated, and sqlite persists only if its file is on a persistent volume.
  • Set kernel.publicUrl. Behind a reverse proxy or load balancer, set it to the external URL so OAuth redirects and discovery work.
  • Restrict CORS. Set server.allowedOrigins to your known dApp origins instead of "*".
  • Keep secrets out of the image. Supply clientSecret, adminAuth, and provider API keys through environment variables or a secret manager, not the baked-in config file. See Secrets and environments.

Expose the service

The Wallet Gateway must be reachable over HTTPS from browsers that open the User UI and from hosted dApps that call the dApp API. In Kubernetes, expose it with an Ingress or LoadBalancer that terminates TLS and forwards to the pod port (default 3030). Set kernel.publicUrl to that external URL so OAuth redirects and discovery work correctly. Subpath routing (for example https://wallet.example.com/subpath) is supported.

Docker

The container needs a configuration file. If you don’t have one, generate a sample to start from:
Mount the config and start the service:
The login page is then available at http://localhost:3030.
If you use the internal signing provider, its signingStore holds private keys. Put it on durable, access-controlled storage, or use a participant node or external custody provider instead. See Signing providers.

Helm

An official Helm chart is available for Kubernetes. The full values schema is published, but the key point is that the Wallet Gateway is configured through the top-level config: key in values.yaml, specified as YAML but using the same schema as config.json.

Signing chart values (signing: {})

The chart’s signing block configures optional external signing drivers (Blockdaemon, DFNS, Fireblocks). Leaving it empty is the common case for participant-based signing:
You do not need participant-specific fields under signing when the participant node handles keys. Add entries only to enable an external custody provider:

OAuth secrets from Kubernetes secrets (oauthSecrets)

The chart can inject OAuth client secrets from Kubernetes secrets by mapping an environment variable name to a secret reference, then referencing that variable from a network’s auth config:

Production configuration highlights

Read the Configuration reference first for the complete breakdown. The following (incomplete) YAML highlights fields worth setting for a production deployment:

Signing provider environment variables

Besides the dynamic clientSecretEnv variables in config, external signing providers read a few static environment variables: See Signing providers for more.

Database persistence

SQLite

The default config uses sqlite, which is fine for evaluation and short-lived environments, but PostgreSQL is recommended for production. SQLite stores data in local files; without a persistent volume, all sessions and wallet state are lost when the pod is recreated. Point the stores at a path inside the container:
Then mount a volume for that path:

PostgreSQL

Point the store at a PostgreSQL instance:
For TLS to PostgreSQL, add an ssl block (passed through to the Node.js pg driver). See PostgreSQL over TLS/SSL.

Local PostgreSQL over TLS (Docker)

For local development you can run PostgreSQL in Docker with TLS enabled and point the Wallet Gateway’s store / signingStore at it.
This configures TLS between the Wallet Gateway and PostgreSQL. It does not configure HTTPS for browsers. For browser/client HTTPS, terminate TLS in your reverse proxy or ingress and set kernel.publicUrl to the external https://... URL.
1. Create TLS files for Postgres (self-signed):
2. Run Postgres with TLS enabled:
3. Verify TLS works:
Expected: ssl_on = on. 4. Configure the Wallet Gateway stores to use TLS:
For production, prefer certificate verification with rejectUnauthorized: true and provide your CA bundle via ssl.ca. See PostgreSQL over TLS/SSL.

Logging

Enable JSON logging with the --log-format flag (pretty is the default):

After deploying