Skip to main content
Temporal Server configuration is defined in YAML files that control all aspects of server behavior, from persistence to networking to security.

Configuration File

The server configuration can be loaded in multiple ways:
  1. Config directory (legacy): Multiple YAML files in a directory structure
  2. Single config file: Using --config-file flag or TEMPORAL_SERVER_CONFIG_FILE_PATH environment variable
  3. Embedded config: Default configuration embedded in the binary
# Using config file
temporal-server start --config-file config/development.yaml

# Using environment variable
export TEMPORAL_SERVER_CONFIG_FILE_PATH=/etc/temporal/config.yaml
temporal-server start

Configuration Structure

Top-Level Configuration

FieldTypeDescription
globalGlobalProcess-wide service configuration
persistencePersistenceDatastore configuration
logLogLogging configuration
clusterMetadataClusterMetadataCluster metadata and multi-cluster setup
dcRedirectionPolicyDCRedirectionPolicyDatacenter redirection policy
servicesmap[string]ServicePer-service configuration (frontend, history, matching, worker)
archivalArchivalArchival configuration
publicClientPublicClientInternal service to frontend client configuration
dynamicConfigClientFileBasedClientConfigDynamic configuration client setup
namespaceDefaultsNamespaceDefaultsDefault settings for new namespaces
otelExportConfigOpenTelemetry exporter configuration
visibilityVisibilityVisibility store configuration

Global Configuration

Membership

Cluster membership and gossip protocol configuration.
global:
  membership:
    maxJoinDuration: 10s
    broadcastAddress: ""
FieldTypeDefaultDescription
maxJoinDurationduration10sMaximum time to wait to join the gossip ring
broadcastAddressstring""Address communicated to other nodes (for NAT traversal)

PProf

Go profiling endpoint configuration.
global:
  pprof:
    port: 7936
    host: localhost
FieldTypeDefaultDescription
portint0Port for pprof HTTP endpoint (0 = disabled)
hoststringlocalhostHost to bind pprof endpoint

TLS Configuration

TLS settings for inter-service and client communication.
global:
  tls:
    internode:
      server:
        certFile: /path/to/cert.pem
        keyFile: /path/to/key.pem
        requireClientAuth: true
        clientCaFiles:
          - /path/to/ca.pem
      client:
        serverName: temporal-server
        rootCaFiles:
          - /path/to/ca.pem
    frontend:
      server:
        certFile: /path/to/frontend-cert.pem
        keyFile: /path/to/frontend-key.pem
    systemWorker:
      certFile: /path/to/worker-cert.pem
      keyFile: /path/to/worker-key.pem
      client:
        serverName: temporal-frontend
        rootCaFiles:
          - /path/to/ca.pem

Server TLS

FieldTypeDescription
certFilestringPath to PEM-encoded certificate
keyFilestringPath to PEM-encoded private key
certDatastringBase64-encoded certificate (alternative to certFile)
keyDatastringBase64-encoded private key (alternative to keyFile)
clientCaFiles[]stringCA certificates for client authentication
clientCaData[]stringBase64-encoded CA certificates
requireClientAuthboolWhether to require mutual TLS

Client TLS

FieldTypeDescription
serverNamestringExpected server name for verification
rootCaFiles[]stringTrusted CA certificates
rootCaData[]stringBase64-encoded CA certificates
disableHostVerificationboolSkip hostname verification (insecure)
forceTLSboolUse TLS even without certificates

Metrics

Metrics configuration for Prometheus, StatsD, or M3.
global:
  metrics:
    prometheus:
      listenAddress: "0.0.0.0:8000"
      handlerPath: "/metrics"
FieldTypeDescription
prometheusPrometheusConfigPrometheus metrics configuration
statsdStatsdConfigStatsD metrics configuration
m3M3ConfigM3 metrics configuration
tagsmap[string]stringGlobal tags for all metrics

Authorization

Authentication and authorization configuration.
global:
  authorization:
    jwtKeyProvider:
      keySourceURIs:
        - "https://auth.example.com/.well-known/jwks.json"
      refreshInterval: 1h
    permissionsClaimName: "permissions"
    authorizer: "default"
    claimMapper: "default"
    audience: "temporal"
FieldTypeDescription
jwtKeyProviderJWTKeyProviderJWT signing key configuration
permissionsClaimNamestringJWT claim containing permissions
permissionsRegexstringRegex to parse permissions claim
authorizerstringAuthorizer implementation ("" or “default”)
claimMapperstringClaim mapper implementation
authHeaderNamestringHTTP header for auth token (default: “authorization”)
authExtraHeaderNamestringAdditional auth header
audiencestringExpected JWT audience

Persistence Configuration

Database and datastore configuration.
persistence:
  defaultStore: default
  visibilityStore: visibility
  numHistoryShards: 4
  datastores:
    default:
      sql:
        pluginName: postgres
        databaseName: temporal
        connectAddr: localhost:5432
        connectProtocol: tcp
        user: temporal
        password: temporal
        maxConns: 20
        maxIdleConns: 20
        maxConnLifetime: 1h
    visibility:
      sql:
        pluginName: postgres
        databaseName: temporal_visibility
        connectAddr: localhost:5432
        connectProtocol: tcp
        user: temporal
        password: temporal
        maxConns: 10
        maxIdleConns: 10

Persistence Fields

FieldTypeDescription
defaultStorestringName of default datastore for temporal data
visibilityStorestringName of datastore for visibility records
secondaryVisibilityStorestringSecondary visibility store for dual writes
numHistoryShardsint32Number of history shards (must be power of 2)
datastoresmap[string]DataStoreNamed datastore configurations

SQL Datastore

FieldTypeDescription
pluginNamestringSQL plugin: “postgres”, “mysql”, “sqlite”
databaseNamestringDatabase name
connectAddrstringDatabase host:port
connectProtocolstringConnection protocol: “tcp”, “unix”
userstringDatabase user
passwordstringDatabase password
connectAttributesmap[string]stringAdditional connection parameters
maxConnsintMaximum connections
maxIdleConnsintMaximum idle connections
maxConnLifetimedurationMaximum connection lifetime
taskScanPartitionsintPartitions for task scanning (Vitess)

Cassandra Datastore

datastores:
  default:
    cassandra:
      hosts: "127.0.0.1"
      port: 9042
      keyspace: temporal
      user: cassandra
      password: cassandra
      datacenter: datacenter1
      maxConns: 20
      connectTimeout: 600ms
      timeout: 10s
FieldTypeDescription
hostsstringComma-separated Cassandra hosts
portintCassandra port
keyspacestringKeyspace name
userstringUsername
passwordstringPassword
datacenterstringLocal datacenter
maxConnsintMaximum connections per host
connectTimeoutdurationConnection timeout
timeoutdurationQuery timeout
writeTimeoutdurationWrite timeout
consistencyCassandraConsistencyConsistency settings

Elasticsearch Datastore

datastores:
  visibility:
    elasticsearch:
      url: "https://localhost:9200"
      indices:
        visibility: temporal-visibility-dev
      username: elastic
      password: changeme

Service Configuration

Per-service settings for frontend, history, matching, and worker services.
services:
  frontend:
    rpc:
      grpcPort: 7233
      httpPort: 7243
      membershipPort: 6933
      bindOnIP: "0.0.0.0"
  history:
    rpc:
      grpcPort: 7234
      membershipPort: 6934
      bindOnIP: "0.0.0.0"
  matching:
    rpc:
      grpcPort: 7235
      membershipPort: 6935
      bindOnIP: "0.0.0.0"
  worker:
    rpc:
      grpcPort: 7239
      membershipPort: 6939
      bindOnIP: "0.0.0.0"

RPC Configuration

FieldTypeDescription
grpcPortintPort for gRPC service
httpPortintPort for HTTP/gRPC-Web (frontend only)
membershipPortintPort for cluster membership
bindOnLocalHostboolBind to localhost only
bindOnIPstringSpecific IP to bind (overrides bindOnLocalHost)
httpAdditionalForwardedHeaders[]stringAdditional headers to forward from HTTP to gRPC
keepAliveServerConfigKeepAliveConfiggRPC keepalive configuration
clientConnectionConfigClientConnectionConfigClient connection settings

Dynamic Configuration

Dynamic configuration allows runtime configuration changes without server restart.
dynamicConfigClient:
  filepath: config/dynamicconfig/development.yaml
  pollInterval: 10s
FieldTypeDescription
filepathstringPath to dynamic config YAML file
pollIntervaldurationHow often to check for config changes

Archival Configuration

History and visibility archival to long-term storage.
archival:
  history:
    state: "enabled"
    enableRead: true
    provider:
      filestore:
        fileMode: "0666"
        dirMode: "0766"
      s3store:
        region: "us-east-1"
  visibility:
    state: "enabled"
    enableRead: true
    provider:
      filestore:
        fileMode: "0666"
        dirMode: "0766"

Archival States

  • enabled: Archival is enabled
  • disabled: Archival is disabled
  • paused: Archival is paused temporarily

Archival Providers

  • filestore: Local or network filesystem
  • s3store: Amazon S3 or S3-compatible storage
  • gstorage: Google Cloud Storage

Cluster Metadata

Multi-cluster configuration.
clusterMetadata:
  enableGlobalNamespace: true
  failoverVersionIncrement: 10
  masterClusterName: "primary"
  currentClusterName: "primary"
  clusterInformation:
    primary:
      enabled: true
      initialFailoverVersion: 1
      rpcAddress: "localhost:7233"
    secondary:
      enabled: true
      initialFailoverVersion: 2
      rpcAddress: "remote-host:7233"
FieldTypeDescription
enableGlobalNamespaceboolEnable global namespaces
failoverVersionIncrementintVersion increment for failover
masterClusterNamestringName of the master cluster
currentClusterNamestringName of this cluster
clusterInformationmap[string]ClusterInfoCluster details

Namespace Defaults

Default settings applied to new namespaces.
namespaceDefaults:
  archival:
    history:
      state: "disabled"
      URI: "file:///tmp/temporal-archival/history"
    visibility:
      state: "disabled"
      URI: "file:///tmp/temporal-archival/visibility"

See Also

Build docs developers (and LLMs) love