- Docker registry:
ghcr.io/digital-asset/wallet-gateway/docker/wallet-gateway:<VERSION> - Helm repository:
ghcr.io/digital-asset/wallet-gateway/helm/wallet-gateway:<VERSION>
<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. Thememorystore loses all data when a container or pod is recreated, andsqlitepersists 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.allowedOriginsto 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 (default3030). 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:http://localhost:3030.
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-levelconfig: 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:
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 dynamicclientSecretEnv variables in config, external signing providers read a few
static environment variables:
See Signing providers for more.
Database persistence
SQLite
The default config usessqlite, 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:
PostgreSQL
Point the store at a PostgreSQL instance: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’sstore / 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.ssl_on = on.
4. Configure the Wallet Gateway stores to use TLS:
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
- Confirm the three endpoints respond (User UI,
/api/v0/dapp,/api/v0/user). - Review the Security checklist.
- If something fails to start, see Troubleshooting.