Skip to main content
Version: Next

Configuration

Set CONFIG_PATH to an absolute configuration file path. Without it, the file loader searches for config.yaml or another supported config file format in the process's current directory and its parents. The application validates the loaded configuration at startup.

Environment variables override file settings. Use the uppercase TSG__ prefix, double underscores between path segments and snake case for camel-case keys. For example, TSG__SERVER__PUBLIC_ADDRESS overrides server.publicAddress.

Databases​

By default, the development database is sqlite. We use postgres databases for production type instances of the control planes.

Authentication​

Authentication for frontend services can be done via the SSO Bridge. This helps users who need to login to several components to authenticate themselves faster.

Managed organizations​

A Control Plane process serves managed participants. Each has its own DID, Wallet binding, catalog and data-plane registrations. Tenant Management creates or explicitly imports the organization, provisions its runtime identity and keeps authorization snapshots fresh. The process starts with no tenants and has no local tenant creation, membership or invitation writer.

Operator-controlled tenancy.profiles hold the IAM, data-plane and initial catalog options used during provisioning. Published Wallet URLs, participant DIDs and workload credentials come from the manager. Use the managed HTTP sample or deployment and import guide for the full service registration and browser-client setup.

Addressing​

DSP endpoints use https://cp.example/tenants/<local-slug>/.... Management requests select the local tenant through X-Tenant-Slug or X-Tenant-Id; OAuth tenant_id identifies the canonical organization. A selector grants no access. The UI lists accessible organizations and obtains a separate service authorization when the user switches organization.

Existing participant data​

Old seeded configuration no longer starts. Remove the unsupported seed fields, register the manager and explicitly import the existing local IDs, URL slugs, DIDs, keys, resource ownership and service grants. Keep the published URLs and backed-up databases. A matching slug is not proof of identity or ownership. The import procedure preserves existing participant data without creating replacement identities.

DCP presentation query mode​

Incoming DSP requests are verified with the tenant's wallet. By default (dcpPresentationQueryMode: presentation-definition) the control plane sends a Presentation Definition built from typeFilter, issuerFilter and customFields. Counterparties such as EDC IdentityHub only support scope queries; for them, set dcpPresentationQueryMode: scope. Incoming requests are then verified with dcpRequiredScopes. If omitted, it falls back to dcpDefaultScopes, which also supplies the scopes in outgoing tokens. Set the two lists separately when you need different incoming and outgoing scopes. Explicit agreement scopes are unchanged. Returned credentials must still satisfy typeFilter, issuerFilter and customFields and be issued to the requester.

In scope mode, every tenant must have a non-empty effective incoming scope list. An explicitly empty dcpRequiredScopes does not fall back to the defaults. The control plane rejects invalid configurations at startup. When upgrading a deployment with dcpPresentationQueryMode: scope, configure either dcpRequiredScopes or a non-empty dcpDefaultScopes before restarting.

iam:
type: tsg
dcpPresentationQueryMode: scope
dcpDefaultScopes:
- org.eclipse.dspace.dcp.vc.type:ParticipantCredential:read
dcpRequiredScopes:
- org.eclipse.dspace.dcp.vc.type:MembershipCredential:read

Transfer context for data planes​

When a provider accepts a transfer request, it stores a snapshot of the transfer context and sends it to the data plane in every signaling message for that transfer:

  • participantId and counterPartyId: the agreement assigner and the verified requester.
  • dataspaceContext: iam.dataspaceContext (default dataspace-protocol-http:2025-1).
  • claims: a flat projection of the requester's verified credentials, limited to iam.transferClaims. When omitted, the default allow-list is subjectId, credentialTypes and issuers. A configured list replaces all defaults; transferClaims: [] sends no claims. This does not remove the separate counterPartyId field. List claims collect all values; a single claim with different values across credentials is left out.

To add membership.status while retaining all default claims, include the complete list. Both issuer mappings are needed to support string and object issuer forms:

iam:
transferClaims:
- name: subjectId
path: credentialSubject.id
- name: credentialTypes
path: type
list: true
- name: issuers
path: issuer
list: true
- name: issuers
path: issuer.id
list: true
- name: membership.status
path: credentialSubject.membership.status

Configuration parameters​

KeyRequiredTypeDescriptionDefault
ControlPlaneTenancyConfig
tenancyControlPlaneTenancyConfigundefined
tenancy.mode"managed"Tenant state is provisioned by Tenant Management"managed"
tenancy.walletUrlsStringOperator-allowed Wallet management API bases for runtime IAM[]
tenancy.tokenEndpointsStringOperator-allowed SSO token endpoints for runtime IAM[]
tenancy.profilesObjectOperator-owned Control Plane IAM/data-plane/catalog profiles{}
tenancy.serviceInstanceIdStringOperator-registered receiving service instance""
tenancy.managementUrlStringTenant Management UI URL
tenancy.provisioningIdentitiesObjectExact manager issuer/subject, audience and allowed provisioning operations[]
tenancy.platformPrincipalsObjectExact human principals permitted to change shared process settings; organization roles grant no platform authority[]
DatabaseConfig
dbYesDatabaseConfigDatabase configuration
db.retryAttemptsNumberConnection attempts during application startup, three seconds apart10
db.typeYes"sqlite" | "postgres"Type of database
db.databaseYesStringName of the database
db.synchronizeBooleanSynchronize database schemafalse
db{type=sqlite}YesSQLiteConfigDatabase configuration
db{type=sqlite}.retryAttemptsNumberConnection attempts during application startup, three seconds apart10
db{type=sqlite}.type"sqlite" | "postgres"Type of database"sqlite"
db{type=sqlite}.databaseYesStringName of the database
db{type=sqlite}.synchronizeBooleanSynchronize database schemafalse
db{type=postgres}YesPostgresConfigDatabase configuration
db{type=postgres}.hostYesStringHost of the database
db{type=postgres}.portYesNumberPort of the database
db{type=postgres}.usernameYesStringUsername of the database
db{type=postgres}.passwordYesStringPassword of the database
db{type=postgres}.sslObjectSSL configuration of the databasefalse
db{type=postgres}.retryAttemptsNumberConnection attempts during application startup, three seconds apart10
db{type=postgres}.type"sqlite" | "postgres"Type of database"postgres"
db{type=postgres}.databaseYesStringName of the database
db{type=postgres}.synchronizeBooleanSynchronize database schemafalse
ServerConfig
serverServerConfigServer configuration
server.listenStringIP address the server listens on"0.0.0.0"
server.portNumberPort the server listens on3000
server.publicDomainStringPublic domain of the server"localhost"
server.publicAddressStringPublic address of the server"http://localhost:3000"
server.subPathStringSub path of the server
AuthConfig
authYesAuthConfigManagement authentication configuration
auth.signalingIdStringReceiving plane identity for signaling tokens. Defaults to clientId.
auth.expectedIssuerStringExpected API token issuer; defaults to the discovered OpenID issuer
auth.expectedAudienceStringExpected API token audience; defaults to clientId.
auth.enabledBooleanEnable authenticationtrue
auth.openIdConfigurationURLStringOpenID configuration URL
auth.callbackURLURLCallback URL the auth service will redirect users
auth.redirectURLURLRedirect URL to UI after login/logout
auth.clientIdStringClient ID
auth.clientSecretStringClient secret (required for client_secret_post authentication)
auth.tokenEndpointAuthMethod"client_secret_post" | "private_key_jwt"Token endpoint authentication method: client_secret_post (default) or private_key_jwt"client_secret_post"
auth.privateKeyJwkObjectPrivate key in JWK format for private_key_jwt authentication. Alternative to privateKeyJwkFile.
auth.privateKeyJwkFileStringPath to file containing private key JWK for private_key_jwt authentication. Alternative to privateKeyJwk.
auth.permissionPathStringJSON path to extract permissions from the token"$.permissions[*]"
RegistryConfig
registryRegistryConfigRegistry configuration
registry.useRegistryBooleanUse registry to crawl catalogsfalse
registry.participantDidsStringParticipant DIDs to resolve directly for registry discovery[]
registry.registryUrlStringURL of the registry
registry.registryDidStringDID of the registry
registry.registryIntervalInMillisecondsNumberInterval in milliseconds to fetch registry30000
PolicyConfig
defaultPolicyPolicyConfigDefault policy configuration
defaultPolicy.type"rules" | "manual"Definition type of the policy"rules"
PolicyRuleConfig
defaultPolicy.permissionsPolicyRuleConfig[]Permissions of the policy
defaultPolicy.permissions[].actionYesStringAction of the rule
RuleConstraintConfig
defaultPolicy.permissions[].constraintsRuleConstraintConfig[]Constraints of the rule
defaultPolicy.permissions[].constraints[].typeYesStringType of the constraint
defaultPolicy.permissions[].constraints[].valueYesStringValue of the constraint
PolicyRuleConfig
defaultPolicy.prohibitionsPolicyRuleConfig[]Prohibitions of the policy
defaultPolicy.prohibitions[].actionYesStringAction of the rule
RuleConstraintConfig
defaultPolicy.prohibitions[].constraintsRuleConstraintConfig[]Constraints of the rule
defaultPolicy.prohibitions[].constraints[].typeYesStringType of the constraint
defaultPolicy.prohibitions[].constraints[].valueYesStringValue of the constraint
defaultPolicy.rawObjectRaw ODRL policy
PolicyEvaluationConfig
policyPolicyEvaluationConfigPolicy evaluation interoperability configuration
policy.consumerSkippedLeftOperandsStringODRL left-operand IRIs a consumer may skip when they are direct permission constraints. The provider remains responsible for enforcing them.[]
RuntimeConfig
runtimeYesRuntimeConfigRuntime configuration
runtime.controlPlaneInteractions"automatic" | "semi-manual" | "manual"Mode of control plane interactions"automatic"
runtime.colorStringPrimary UI color"#3B8BF6"
runtime.lightThemeUrlStringLight theme logo URL
runtime.darkThemeUrlStringDark theme logo URL
InteropConfig
interopInteropConfigInteroperability configuration
EdcInteropConfig
interop.edcEdcInteropConfigEDC interoperability workarounds
interop.edc.dataAddressEndpointPropertyBooleanAlso advertise the provider endpoint in the EDC endpoint property on outgoing DSP transfer messages, for peers that ignore the standard DataAddress endpoint. Stored and data-plane addresses are unchanged.false
AuditModuleConfig
auditAuditModuleConfigAudit logging configuration
audit.enabledBooleanEnable audit loggingtrue
audit.minSeverity"debug" | "info" | "warning" | "error" | "critical"Minimum severity level to log"info"
audit.logDeniedBooleanAlways log denied access attempts regardless of action typetrue
audit.logDelegatedBooleanLog delegated access attempts when enabled, while still respecting action-specific success filterstrue
audit.logMutationsBooleanLog successful mutation actions (create, update, delete, manage)true
audit.logExecuteBooleanLog successful execute actionsfalse
audit.logReadsBooleanLog successful read actions — disabled by default as reads are frequent and rarely relevant for auditingfalse
audit.sensitiveResourcesArrayResources logged regardless of minimum severity, while still respecting action-specific success filters["w.key","w.credential","sso.user"]
AuditHandlersConfig
audit.handlersAuditHandlersConfigHandler configuration
audit.handlers.consoleBooleanEnable console audit log handlerfalse
audit.handlers.databaseBooleanEnable database audit log handlertrue
audit.handlers.otlpBooleanEnable OTLP audit log handlerfalse
OtlpAuditHandlerConfig
audit.otlpOtlpAuditHandlerConfigOTLP audit log handler configuration
audit.otlp.urlStringOTLP HTTP logs endpoint URL"http://localhost:4318/v1/logs"
audit.otlp.headersObjectAdditional HTTP headers to include in OTLP requests
audit.otlp.timeoutMillisNumberOTLP export timeout in milliseconds5000
audit.otlp.concurrencyLimitNumberMaximum number of concurrent OTLP export requests1
audit.otlp.serviceNameStringService name included on OTLP log attributes"tsg-dsp-api"
audit.otlp.serviceVersionStringOptional service version included on OTLP log attributes