Skip to main content
Version: Next

Configuration

In this section, the configuration of the analytics data plane is explained. Configuration is used based on a config.yaml file which should be placed in the apps/backend folder. This config.yaml file is loaded when booting the application. The values get type checked, and it gives a clear error message if there is a configuration field missing or provided incorrectly. Next to the config.yaml file, you can also set environment variables. These override the values that are listed in the config.yaml file.

Databases

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

Authentication

Authentication for frontend services can be done via OAuth. This helps users who need to login to several components to authenticate themselves faster. The data plane is tested against the SSO Bridge, with an Helm chart provided alongside the Helm chart of the data plane, but other OAuth services should be usable (e.g. Keycloak, or hosted OAuth services).

Execution sources

A transferred dataset carries only { sourceId, path } in its private asset configuration. The media type stays in catalog metadata. The source ID resolves through this deployment's role-local source configuration. The orchestration app has its own inspection configuration for the same logical sourceId; its physical path and credentials may differ. The control plane receives neither.

datasources:
sources:
- sourceId: party-a-lake
type: s3
endpoint: http://minio:9000
bucket: party-a
region: eu-west-1
forcePathStyle: true
presignTtlSeconds: 3600
- sourceId: local-dataset
type: local
root: /data
pvcName: analytics-data-plane-uploads

Relative local roots resolve from config.yaml. With Helm, sources live under config.datasources.sources, so the existing ConfigMap and rollout checksum are sufficient. Put credentials in configFromSecrets.datasources.sources at the same list index; the chart projects them as TSG__... environment overrides. In split mode configure sources only on the LAN client runner, not the DMZ server.

Jobs receive the resolved location through the unchanged DATA_TYPE, DATA_FILE and DATA_URL variables. S3 produces a presigned URL. HTTP uses an ADP proxy and a per-job DATA_ACCESS_TOKEN, keeping upstream authorization in the runner. Local sources require Docker file mounting or a Kubernetes PVC. The ADP does not inspect CSV, author metadata, upload datasets, or maintain a catalog.

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
AuthConfig
authYesAuthConfigManagement 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[*]"
ControlPlaneConfig
controlPlaneYesControlPlaneConfigControl plane configuration
controlPlane.dataPlaneEndpointYesURLData plane management endpoint
controlPlane.managementEndpointYesURLControl plane management endpoint
controlPlane.walletEndpointURLWallet endpoint
controlPlane.controlEndpointYesURLPublic control plane endpoint
controlPlane.tenantSlugStringTenant slug to address on a (possibly shared, multi-tenant) control plane. Omit to use the control plane's default tenant.
controlPlane.initializationDelayNumberInitialization delay in milliseconds5000
controlPlane.dataPlaneTitleStringData Plane title"Data Plane - v0.0.0"
LoggingConfig
loggingLoggingConfigLogging configuration
logging.debugBooleanEnable debug request logging
DataStorageConfig
storageDataStorageConfigJob data storage configuration
storage.pvcNameStringPersistent volume claim name for job data storage
DataSourcesConfig
datasourcesDataSourcesConfigParticipant-local sources used for job execution
SourceConfig
datasources.sourcesYesSourceConfig[]Role-local sources available to jobs; 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
EventsConfig
eventsEventsConfigAlgorithm event configuration
EventPayloadStoreConfig
events.payloadsEventPayloadStoreConfigWhere algorithm event payloads are stored. When unset, payloads are stored in the database, which does not scale past a few hundred megabytes
events.payloads.type"local" | "s3"Store type: 'local' or 's3'"local"
events.payloads.rootStringlocal: directory that payloads are written under"./data/event-payloads"
events.payloads.bucketStrings3: bucket holding the payloads
events.payloads.endpointStrings3: endpoint URL, for S3-compatible stores such as MinIO
events.payloads.regionStrings3: region
events.payloads.forcePathStyleBooleans3: use path-style addressing instead of virtual-hosted style
events.payloads.presignTtlSecondsUnknowns3: lifetime in seconds of the presigned URL relayed across a DMZ/LAN split3600
events.payloads.accessKeyIdStrings3: access key id
events.payloads.secretAccessKeyStrings3: secret access key
events.payloads.prefixStringKey prefix that payloads are written under"events"
RuntimeConfig
runtimeYesRuntimeConfigRuntime configuration
runtime.colorStringPrimary UI color"#3B8BF6"
runtime.lightThemeUrlStringLight theme logo URL
runtime.darkThemeUrlStringDark theme logo URL
runtime.jobRefreshIntervalMsUnknownInterval in milliseconds for auto-refreshing the jobs table in the UI (0 to disable)10000
OrchestrationConfigBase
orchestrationYesOrchestrationConfigBaseOrchestration configuration
orchestration.typeYes"kubernetes" | "docker"Orchestration type: 'kubernetes' or 'docker'
orchestration{type=kubernetes}YesKubernetesConfigOrchestration configuration
orchestration{type=kubernetes}.namespaceStringKubernetes namespace"default"
orchestration{type=kubernetes}.pullPolicy"IfNotPresent" | "Always" | "Never"Kubernetes image pull policy (IfNotPresent, Always, Never). Leave unset to let Kubernetes default per image: Always for ':latest' or untagged, IfNotPresent for a pinned tag/digest.
orchestration{type=kubernetes}.pullSecretsStringKubernetes image pull secrets for private registries (array of secret names)
orchestration{type=kubernetes}.nodeSelectorObjectKubernetes Node selector for scheduling jobs. See https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector for format details and usage examples.
orchestration{type=kubernetes}.affinityObjectKubernetes Node affinity for scheduling jobs. See https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/ for format details and usage examples.
orchestration{type=kubernetes}.tolerationsArrayKubernetes Tolerations for scheduling jobs on tainted nodes. See https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/ for format details and usage examples.
orchestration{type=kubernetes}.type"kubernetes" | "docker"Orchestration type: 'kubernetes' or 'docker'"kubernetes"
orchestration{type=docker}YesDockerConfigOrchestration configuration
orchestration{type=docker}.socketPathStringDocker socket path (e.g., /var/run/docker.sock)"/var/run/docker.sock"
orchestration{type=docker}.networkStringDocker network to use for containers
orchestration{type=docker}.mountFilesBooleanWhether to mount files into Docker containers or provide files via HTTP
orchestration{type=docker}.platformStringPlatform to use for Docker containers (e.g., 'linux/amd64')
orchestration{type=docker}.pullPolicy"IfNotPresent" | "Always" | "Never"Docker image pull policy (IfNotPresent, Always, Never). Applied by the data plane; Docker has none. Use IfNotPresent for local development, where images are built into the daemon."Always"
orchestration{type=docker}.type"kubernetes" | "docker"Orchestration type: 'kubernetes' or 'docker'"docker"
SplitConfig
splitSplitConfigClient/server split configuration
split.modeStringRuntime mode: standalone (current behavior), client (network-constrained runner), or server (open-network exchanger)"standalone"
split.bridgePeerWsUrlStringPeer WebSocket URL for bridge connection (Socket.IO server base URL)
split.bridgeChunkSizeUnknownChunk size in bytes for large event data transfers over WebSocket (default: 512KB)
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