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.

Execution owners and authentication​

Every worker requires auth.enabled: true, stable controlPlane.dataplaneId and controlPlane.controlplaneId, and a nonempty controlPlane.executionScopes list. Each entry contains the verified issuer, logical controlPlaneId and canonical tenantId returned by Tenant Management. A worker serving one owner uses one entry; a worker serving several owners lists all of them. There is no dedicated/shared mode switch or self-registration. Slugs and participant DIDs cannot replace tenant UUIDs.

Use strict OAuth token verification with a trusted OpenID issuer. The signaling JWT audience is the worker's dataplaneId. The operator browser client and its auth.expectedAudience are separate. Global management requires an authenticated human explicitly listed in management.operatorPrincipals. Tenant or workload grants do not confer global operator access; an empty operator allowlist denies access.

Provision a registration for each tenant through the managed control-plane profile, with the worker's actual API endpoint and executionLease: true. Managed provisioning supplies the tenant-bound signaling credential. Execution leases are bounded by the verified signaling JWT expiry and the control plane's authorization deadline. See execution leases.

The Helm example and managed local sample show the full relationship between Tenant Management, SSO Bridge, Control Plane and worker. The local sample generates its worker configuration only after the operator selects actual provisioned canonical tenant IDs.

Configuration parameters​

KeyRequiredTypeDescriptionDefault
BackendEgressRule
backendEgressBackendEgressRule[]Operator-controlled backend egress rules; no rules means no backend access[]
backendEgress[].urlYesStringAllowed backend URL prefix for this execution owner (origin and path)
backendEgress[].addressesYesStringAllowed resolved backend IP addresses or CIDR ranges
backendEgress[].issuerYesStringVerified signaling issuer
backendEgress[].controlPlaneIdYesStringLogical control-plane client identity
backendEgress[].tenantIdYesStringCanonical tenant UUID
ManagementConfig
managementManagementConfigWorker global management policy
OperatorPrincipal
management.operatorPrincipalsOperatorPrincipal[]Global human operators allowed to inspect this worker; tenant grants never confer operator access[]
management.operatorPrincipals[].issuerYesStringVerified operator issuer
management.operatorPrincipals[].subjectYesStringVerified operator subject
DataAccessConfig
dataAccessDataAccessConfigHTTP JWT access and refresh grant configuration
dataAccess.signingKeyStringPrivate asymmetric signing JWK as JSON; persist across restarts
dataAccess.signingKeyPathStringMounted private signing JWK file
dataAccess.previousPublicKeysStringPrevious public JWKs as JSON strings; retain for the maximum outstanding refresh grant lifetime[]
dataAccess.accessTokenLifetimeNumberAccess token lifetime in seconds300
dataAccess.refreshTokenLifetimeNumberRefresh grant maximum lifetime in seconds, preserved across rotation86400
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[*]"
ControlPlaneConfig
controlPlaneYesControlPlaneConfigControl plane configuration
controlPlane.controlplaneIdYesStringLogical control-plane client identity verified on signaling
controlPlane.dataplaneIdYesStringStable worker identity and audience for authenticated signaling
ExecutionScopeConfig
controlPlane.executionScopesExecutionScopeConfig[]Exact execution owners accepted by this worker. Required on signaling servers; split runners use their bridge assignments[]
controlPlane.executionScopes[].issuerYesStringVerified signaling issuer
controlPlane.executionScopes[].controlPlaneIdYesStringLogical control-plane client identity
controlPlane.executionScopes[].tenantIdYesStringCanonical tenant UUID
LoggingConfig
loggingLoggingConfigLogging configuration
logging.debugBooleanEnable debug request loggingfalse
logging.serverLogging"always" | "onClientError" | "onServerError" | "never"Server logging configuration"onServerError"
logging.clientLogging"always" | "onClientError" | "onServerError" | "never"Client logging configuration"onClientError"
RuntimeConfig
runtimeYesRuntimeConfigRuntime configuration
runtime.colorStringPrimary UI color"#3B8BF6"
runtime.lightThemeUrlStringLight theme logo URL
runtime.darkThemeUrlStringDark theme logo URL
authorizationHeaderStringAuthorization header used in provider proxy"Authorization"
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