Skip to main content
Version: Next

Configuration

The Analytics Orchestration application is configured through a config.yaml placed next to the application, or at the path named by CONFIG_PATH. Values are type checked at startup, and every field can be overridden by an environment variable of the form TSG__<PATH> (for example TSG__DATASPACE__WALLET_BASE_URL).

Wallet

The application needs a reachable wallet. It is not optional: the wallet holds the identity every governance message is signed with, verifies the messages peers send, and publishes the DID service entry through which those peers find this application in the first place.

Governance channel

channel covers how the application talks to its counterparties. The defaults are safe for a dataspace whose participants all run this application; the two settings worth revisiting are tokenTtlSeconds (shorter is stricter, at the cost of tolerating less clock skew) and allowedParticipants, which turns the inbox from "any participant the wallet can verify" into a closed list.

Discovery

directory controls how counterparty addresses are resolved. In a normal deployment nothing needs to be configured here: endpoints come from the registry's DID documents. staticEndpoints exists for local development and for peers whose DID document does not yet carry an orchestration service.

Participants

participants predates agreement-driven discovery and remains as a fallback, so that a deployment without an agreement layer keeps working. When a run is scoped to a project agreement, the agreement decides who takes part.

Inspection sources

The orchestration app declares its read-only inspection sources directly in its normal configuration. The analytics data plane declares execution access in its own configuration. A shared sourceId connects them; their physical paths and least-privilege credentials may differ. The control plane receives neither configuration.

# orchestration config.yaml
datasources:
sources:
- sourceId: research-lake
type: s3
endpoint: https://s3.internal.example
bucket: research
region: eu-west-1

local sources require root; http sources require baseUrl; s3 sources require bucket. Local roots resolve relative to config.yaml. With Helm, put the list under config.datasources.sources and credentials under the matching list index in configFromSecrets.datasources.sources. This uses the chart's existing ConfigMap and Secret environment projection without another mounted file.

The private execution asset contains only { sourceId, path }. The media type belongs to the catalog distribution and the orchestration database. In a DMZ/LAN deployment, put the orchestration app and execution runner in the LAN; the DMZ data-plane server needs neither source configuration nor credentials.

Component ownership

ComponentSource information
Control planeDataset/distribution metadata and opaque { sourceId, path } private asset config; no source locations or credentials
Orchestration appRole-local source locations and inspection credentials, catalog media type and inferred metadata
Analytics data plane (LAN runner)Role-local execution locations and credentials for the same logical source IDs

Configuration parameters

KeyRequiredTypeDescriptionDefault
DatabaseConfig
dbYesDatabaseConfigDatabase configuration
db.typeYes"sqlite" | "postgres"Type of database
db.databaseYesStringName of the database
db.synchronizeBooleanSynchronize database schema
db{type=sqlite}YesSQLiteConfigDatabase configuration
db{type=sqlite}.type"sqlite" | "postgres"Type of database"sqlite"
db{type=sqlite}.databaseYesStringName of the database
db{type=sqlite}.synchronizeBooleanSynchronize database schema
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}.sslUnknownSSL configuration of the database
db{type=postgres}.type"sqlite" | "postgres"Type of database"postgres"
db{type=postgres}.databaseYesStringName of the database
db{type=postgres}.synchronizeBooleanSynchronize database schema
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
DataspaceConfig
dataspaceYesDataspaceConfigDataspace connectivity
dataspace.controlPlaneBaseUrlYesStringBase URL of the control plane this application drives
dataspace.tenantSlugStringTenant slug to address on the control plane and wallet (sent as X-Tenant-Slug on every request)
dataspace.ssoBridgeBaseUrlStringBase URL of the SSO bridge issuing management tokens
dataspace.walletBaseUrlYesStringBase URL of this participant's wallet. Required: the governance channel signs and verifies every message with it, and the application advertises its own inbox as a DID service through it.
DataspaceAuthConfig
dataspace.authDataspaceAuthConfigManagement API authentication
dataspace.auth.methodStringOAuth client authentication method"client_secret_post"
dataspace.auth.clientIdStringOAuth client identifier
dataspace.auth.clientSecretStringClient secret, for the client_secret_post method
dataspace.auth.privateKeyJwkObjectPrivate key in JWK format, for the private_key_jwt method
dataspace.auth.accessTokenStringPre-obtained access token, for the access_token method
dataspace.pollingIntervalMsUnknownDelay between DSP negotiation/transfer status checks, milliseconds1000
dataspace.pollingMaxRetriesUnknownMaximum DSP status checks before a negotiation or transfer times out20
ExecutionPlaneConfig
executionPlaneExecutionPlaneConfigThis participant's own analytics data plane, used to observe local execution
executionPlane.baseUrlYesStringBase URL of this participant's analytics data plane management API for local execution observation
DataspaceAuthConfig
executionPlane.authDataspaceAuthConfigManagement API authentication. Defaults to dataspace.auth when omitted
executionPlane.auth.methodStringOAuth client authentication method"client_secret_post"
executionPlane.auth.clientIdStringOAuth client identifier
executionPlane.auth.clientSecretStringClient secret, for the client_secret_post method
executionPlane.auth.privateKeyJwkObjectPrivate key in JWK format, for the private_key_jwt method
executionPlane.auth.accessTokenStringPre-obtained access token, for the access_token method
DataSourcesConfig
datasourcesYesDataSourcesConfigParticipant-local read-only sources used to browse and describe datasets
SourceConfig
datasources.sourcesYesSourceConfig[]Role-local sources available for dataset inspection; local paths resolve from this configuration file
datasources.sources[].sourceIdYesStringStable logical source identifier shared across components
datasources.sources[].typeYes"local" | "http" | "s3"Source type: local, http or s3
datasources.sources[].rootStringlocal: root directory visible to this component
datasources.sources[].baseUrlStringhttp: base URL under which dataset paths are resolved
datasources.sources[].bucketStrings3: bucket containing the datasets
datasources.sources[].endpointStrings3: endpoint URL for an S3-compatible service
datasources.sources[].regionStrings3: region
datasources.sources[].forcePathStyleBooleans3: use path-style addressing
datasources.sources[].authorizationStringhttp: upstream Authorization header value
datasources.sources[].accessKeyIdStrings3: access key ID
datasources.sources[].secretAccessKeyStrings3: secret access key
datasources.sources[].pvcNameStringlocal: PVC mounted into Kubernetes jobs
datasources.sources[].presignTtlSecondsNumbers3: lifetime in seconds of generated presigned URLs
AuthConfig
authYesAuthConfigManagement API authentication configuration
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[*]"
ChannelConfig
channelChannelConfigGovernance channel between orchestration applications
channel.serviceTypeStringDID service type under which orchestration inboxes are advertised and discovered. Every participant of a dataspace must agree on this value."AnalyticsOrchestration"
channel.serviceIdStringIdentifier of the DID service entry this application registers for itself"#analytics-orchestration"
channel.registerDidServiceBooleanRegister the inbox as a DID service on the wallet at startup. Disable when the DID document is managed out of band.true
channel.tokenTtlSecondsUnknownLifetime of an outgoing request envelope, seconds. Inbound envelopes living longer than this are rejected.300
channel.maxBodyBytesUnknownMaximum accepted size of an inbound governance message, bytes262144
channel.requestTimeoutMsUnknownTimeout of a single outgoing governance request, milliseconds10000
channel.maxRetriesUnknownNumber of times an outgoing governance request is retried before it fails3
channel.retryDelayMsUnknownDelay before the first retry of an outgoing request, milliseconds. Doubles with every further attempt.500
channel.allowedParticipantsStringParticipants whose messages are accepted. Leave empty to accept any participant the wallet can verify; set it to close the deployment.
DirectoryConfig
directoryDirectoryConfigCounterparty endpoint discovery
directory.cacheTtlMsUnknownHow long a resolved counterparty endpoint is reused before the registry is consulted again, milliseconds300000
DirectoryEntryConfig
directory.staticEndpointsDirectoryEntryConfig[]Static counterparty endpoints, taking precedence over discovery
directory.staticEndpoints[].idYesStringParticipant identifier (DID) this entry applies to
directory.staticEndpoints[].orchestrationEndpointStringBase URL of the counterparty's orchestration inbox
directory.staticEndpoints[].dspAddressStringBase address of the counterparty's DSP endpoints
ParticipantConfig
participantsParticipantConfig[]Counterparties this application can run algorithms with. Discovery through project agreements and the registry replaces this list; it remains as a fallback for deployments without an agreement layer.
participants[].idYesStringParticipant identifier (DID) of the counterparty
participants[].dspAddressYesStringBase address of the counterparty's DSP endpoints, without a trailing path
participants[].orchestrationDatasetIdYesStringDataset of type tsg:analytics that grants the right to submit algorithms
participants[].datasetIdsStringDatasets of type tsg:analytics-data the submitted algorithm may read[]
participants[].roleYesStringAlgorithm role assigned to this participant
OrchestrationDatasetConfig
orchestrationDatasetOrchestrationDatasetConfigThe orchestration dataset this application owns and publishes
orchestrationDataset.datasetIdStringCatalog identifier of this participant's orchestration dataset"analytics-orchestration"
orchestrationDataset.titleStringCatalog title of that dataset"Analytics orchestration"
orchestrationDataset.descriptionStringCatalog description of that dataset"Submit federated analytics algorithms to this participant"
PollingConfig
pollingPollingConfigEvent polling configuration
polling.intervalMsUnknownDelay between two poll cycles of a participant, milliseconds1000
polling.pageSizeUnknownMaximum number of events fetched per poll100
polling.waitMsUnknownLong-poll window offered to the data plane, milliseconds10000
polling.runTimeoutMsUnknownMaximum run duration from start through completion, milliseconds21600000
ProjectsPollerConfig
projectsPollerProjectsPollerConfigProject-agreement protocol recovery sweep
projectsPoller.intervalMsUnknownDelay between sweeps that retry non-terminal project agreements, milliseconds45000
SeedConfig
seedSeedConfigRunnable-sample dataset and project-agreement seeding
seed.enabledBooleanSeed the datasets and projects below at bootstrap
PublishDataDatasetDto
seed.datasetsPublishDataDatasetDto[]Data datasets to publish idempotently at bootstrap
seed.datasets[].sourceIdYesStringSource ID from this orchestration app's configured sources
seed.datasets[].pathYesStringPath within the source; no bytes are uploaded
seed.datasets[].mediaTypeYesStringMedia type of the object the dataset points at
seed.datasets[].metadataUnknownOperator-reviewed metadata, optionally suggested from the data
seed.datasets[].datasetIdYesStringCatalog identifier of the dataset
seed.datasets[].titleYesStringCatalog title of the dataset
seed.datasets[].descriptionStringCatalog description of the dataset
SeedProjectConfig
seed.projectsSeedProjectConfig[]Project agreements to create (or receive), sign and link the datasets above to
seed.projects[].idYesStringBusiness identifier of the seeded project agreement
seed.projects[].titleYesStringTitle of the seeded project agreement
ProjectAgreementParticipant
seed.projects[].participantsYesProjectAgreementParticipant[]Participants of the agreement, in order. The first entry's participant creates it; every deployment seeding this project id must configure the same participants in the same order.
seed.projects[].participants[].titleYesStringundefined
seed.projects[].participants[].didIdYesStringundefined
seed.projects[].autoSignBooleanSign the agreement automatically on receipt instead of waiting for an operator. Only applies to a participant seeded with this project id.
seed.projects[].linkDatasetsStringIds of this participant's own seeded datasets to link to the project once it reaches finalized[]
seed.intervalMsUnknownDelay between sweeps that resume seeding while a peer or a project is not yet ready, milliseconds5000
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.logExecuteYesBooleanLog successful execute actions
audit.logReadsYesBooleanLog successful read actions — disabled by default as reads are frequent and rarely relevant for auditing
audit.sensitiveResourcesUnknownResources that are always logged regardless of action-specific success filters["w.key","w.credential","sso.user"]
AuditHandlersConfig
audit.handlersAuditHandlersConfigHandler configuration
audit.handlers.consoleYesBooleanEnable console audit log handler
audit.handlers.databaseBooleanEnable database audit log handlertrue
audit.handlers.otlpYesBooleanEnable OTLP audit log handler
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.timeoutMillisUnknownOTLP export timeout in milliseconds5000
audit.otlp.concurrencyLimitUnknownMaximum 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