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 http data planes.

Signaling identities​

See Signaling authentication for the deployment-controlled signalingClients mapping and token claims.

Tenant authorization​

See SSO multi-tenancy for manager identities, explicit client kinds and principal mappings. SSO always uses managed authorization. Browser services require stable SESSION_SECRET and TENANCY_SECRET values and durable shared session storage.

Configuration parameters​

KeyRequiredTypeDescriptionDefault
ManagedSignalingTargetConfig
managedSignalingTargetsManagedSignalingTargetConfig[]Shared worker audiences and logical control-plane identities; workload authority still requires a current tenant grant[]
managedSignalingTargets[].audienceYesStringShared worker audience (its dataplaneId); tokens for it are only issued to managed tenant workloads
managedSignalingTargets[].identityYesStringLogical control-plane identity carried in client_id; must match the worker's controlPlane.controlplaneId
oid4vpLoginMappingsObjectExplicit OID4VP credential issuer/subject to existing login user ID mappings; email and credential roles do not establish platform authority[]
SsoTenancyConfig
tenancySsoTenancyConfigSSO tenant authorization configuration
tenancy.serviceInstanceIdStringOperator-registered receiving SSO service instance"sso"
tenancy.platformUserIdsStringExplicit local login user IDs with platform authority; never inferred from tenant roles or credentials[]
tenancy.trustedBrowserClientsStringOperator-approved first-party shared browser client IDs allowed to complete authorization from an existing SSO session[]
tenancy.provisioningIdentitiesObjectOperator-registered provisioning principals, audiences, receiving service and allowed operations[]
NodemailerConfiguration
emailNodemailerConfigurationSMTP settings used for first-login account setup links
email.enabledBooleanEnable email sendingfalse
email.smtpFromStringEmail address to send emails from
email.smtpPortNumberSMTP port465
email.smtpSecureBooleanSMTP secure connectiontrue
email.smtpServerStringSMTP server
email.smtpUserStringSMTP user
email.smtpPasswordStringSMTP password
email.titleStringTitle
SignalingClientConfig
signalingClientsSignalingClientConfig[]Deployment-controlled signaling identities; one OAuth client per tenant and role[]
signalingClients[].clientIdYesStringAuthenticated OAuth client ID authorized for signaling
signalingClients[].tenantYesStringFixed receiving tenant slug carried in the tenant claim
signalingClients[].identityStringPlane identity carried in client_id; defaults to the OAuth client ID
signalingClients[].subjectStringFixed subject; defaults to plane identity. For Siglet use its participant context ID
signalingClients[].roleYes"controlplane" | "dataplane"Caller role determines the required transfer execute permission
signalingClients[].audiencesYesStringAllowed receiving plane identities for this client and tenant
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
InitClient
initClientsInitClient[]Initial client configurations[]
initClients[].kindYes"shared" | "workload" | "platform"Explicit operator-controlled client authority
initClients[].tenantIdStringCanonical tenant UUID for a workload client
initClients[].audiencesStringRegistered resource audiences[]
initClients[].scopesStringAllowed OAuth scopes["openid","profile","email","offline_access"]
initClients[].clientIdYesStringClient ID
initClients[].clientSecretStringClient secret (required for client_secret_post authentication)
initClients[].tokenEndpointAuthMethod"client_secret_post" | "private_key_jwt" | "none"Token endpoint authentication method: client_secret_post, private_key_jwt, or none"client_secret_post"
initClients[].jwkObjectPublic key in JWK format (required for private_key_jwt authentication)
initClients[].secretNameStringKubernetes secret name
initClients[].permissionsYesStringClient permissions (can be permission strings or permission set names)
initClients[].grantsStringAllowed grant types; defaults depend on client kind and authentication method. Explicit lists override defaults.
initClients[].nameYesStringClient name
initClients[].descriptionYesStringClient description
initClients[].redirectUrisYesStringExact allowed client redirect URIs
InitUser
initUsersInitUser[]Initial user configurations[]
initUsers[].idStringOptional stable login principal UUID for operator bootstrap/migration mappings
initUsers[].usernameYesStringUsername
initUsers[].passwordYesStringPassword
initUsers[].emailYesStringEmail
initUsers[].permissionsYesStringUser permissions (can be permission strings or permission set names)
initUsers[].grantsStringGrant types supported["authorization_code","refresh_token"]
initUsers[].require2FABooleanRequire two-factor authentication for this user. User will be prompted to set up 2FA on first login.false
kubernetesNamespaceStringKubernetes namespace"default"
twoFactorIssuerNameStringIssuer name for Two-Factor Authentication (shown in authenticator apps)"SSO Bridge"
dcqlQueryMapObjectDCQL Query map for OID4VP{"Administrator":{"credentials":[{"id":"identity_credential","format":"jwt_vc_json","meta":{"type_values":[["VerifiableCredential","HandsonCredential"]]},"claims":[{"id":"email","path":["credentialSubject","email"]},{"id":"role","path":["credentialSubject","role"],"values":["Administrator"]}]}]},"User":{"credentials":[{"id":"identity_credential","format":"jwt_vc_json","meta":{"type_values":[["VerifiableCredential","HandsonCredential"]]},"claims":[{"id":"email","path":["credentialSubject","email"]}]}]}}
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
IngressAuthConfig
ingressAuthIngressAuthConfigIngress authentication configuration
ingressAuth.clientsObjectOperator-controlled ingress targets; each route binds a client, canonical tenant and resource audience[]
ingressAuth.allowedRedirectDomainsStringAdditional hostnames that protected applications may be redirected back to after login. The public domain of the SSO Bridge and its subdomains are always allowed.[]