Skip to main content

Operate EUDIPLO

These guides cover running EUDIPLO yourself: choosing a deployment, configuring storage, keys and access, and keeping the instance observable. Before you expose an instance to real wallets and users, work through the production checklist.

Choose a deployment​

DeploymentUse it whenWhat manages itGuide
CLI-managed Compose on one VMYou run one instance on one server and want generated config, upgrades and checks from one tooleudiplo init, up, upgrade, doctorCookbook: Production on one VM
Compose without the CLIYou keep your own Compose files, for example in an existing infrastructure repositorydocker compose with the files in deployment/docker-composeCompose without the CLI
KubernetesYou deploy to a cluster with Kustomize and bring your own database, object storage and secretskubectl apply -k, optionally the CLI for checksKubernetes

All three run the same images, ghcr.io/eudiplo/eudiplo (backend) and ghcr.io/eudiplo/eudiplo-client (web client). The bundled manifests and Compose files run one backend replica. Several replicas can share one PostgreSQL database and one S3 bucket, but configuration changes of a tenant are serialized by a database lock (see configuration as code), and the bundled PostgreSQL, RustFS and Vault services are single-instance development services.

For a first local try, use eudiplo demo from the Foundation cookbook instead.

Presets and profiles​

The CLI presets, the Compose profiles in deployment/docker-compose and the Kubernetes overlays in deployment/k8s/overlays share three names:

NameDatabaseObject storageVaultCLIComposeKubernetes
minimalSQLiteLocal filesystem---preset minimalno profileoverlays/minimal
standardPostgreSQLS3 (bundled RustFS)---preset standard--profile standardoverlays/standard
fullPostgreSQLS3 (bundled RustFS)Bundled Vault in dev mode--preset full--profile fulloverlays/full

Vault serves a different purpose depending on where full comes from:

  • CLI --preset full writes a vault provider to config/kms.json and makes it the default KMS provider for new signing keys.
  • Compose .env.full.example and the Kubernetes full overlay set ENCRYPTION_KEY_SOURCE=vault, so Vault holds the encryption key for data at rest. Signing keys stay in the database unless you add a kms.json.

The CLI also accepts --database, --storage and --kms to mix components, and Compose accepts the single profiles postgres, s3 and vault.

The bundled Vault runs in development mode with the root token root and keeps everything in memory, so full is for evaluation only. When its container or pod restarts, its data is gone: the encryption key has to be written again from your copy (Compose, Kubernetes), and signing keys that EUDIPLO created in Vault with --preset full are lost, because they are not exportable. In production, use a Vault with persistent storage.

Configure the instance​

Set these variables in every deployment. All others have defaults, listed in the environment variable reference.

VariableWhy
PUBLIC_URLThe URL wallets and browsers use. It appears in offers, metadata and redirects. Default http://localhost:3000.
MASTER_SECRETSigns management tokens of the built-in OAuth2 server and, with the default ENCRYPTION_KEY_SOURCE=env, derives the encryption key. At least 32 characters.
AUTH_CLIENT_ID, AUTH_CLIENT_SECRETThe first management client, created with the tenants:manage role on the first start. Required unless you use Keycloak SSO (OIDC).

Without further settings, the backend uses SQLite and local file storage in FOLDER (/app/config in the image). A minimal container start:

MASTER_SECRET="$(openssl rand -base64 32)"
AUTH_CLIENT_SECRET="$(openssl rand -base64 24)"
echo "Store these: MASTER_SECRET=$MASTER_SECRET AUTH_CLIENT_SECRET=$AUTH_CLIENT_SECRET"

docker run -d --name eudiplo -p 3000:3000 \
-e PUBLIC_URL=http://localhost:3000 \
-e MASTER_SECRET="$MASTER_SECRET" \
-e AUTH_CLIENT_ID=root \
-e AUTH_CLIENT_SECRET="$AUTH_CLIENT_SECRET" \
-v eudiplo-data:/app/config \
ghcr.io/eudiplo/eudiplo:latest

curl http://localhost:3000/health

Keep MASTER_SECRET for the lifetime of the data: with the default key source it derives the key that decrypts private keys and session data.

Guides​

TopicGuide
HTTPS, reverse proxy, web client on a subpathTLS and reverse proxy
WAF rules for wallet and management routesWeb application firewall
CLI install, instances and driversCLI
Export, validate and import configurationConfiguration as code
Tenants, API clients, users and SSOTenants and access, Keycloak
Database, migrations, session retentionDatabase
Encryption of data at restEncryption keys
Files, images and logosObject storage
Signing keys in Vault, AWS KMS, HSMKey management (KMS)
Logs, metrics, tracesLogging, Monitoring
Capacity testsLoad testing
Upgrades between major versionsUpgrade