All Downloads are FREE. Search and download functionalities are using the official Maven repository.

shi_2.12.16.22.0.source-code.application.conf Maven / Gradle / Ivy

The newest version!
include "base.conf"

app {
  storage = "inmemory" # the storage used by otoroshi. possible values are lettuce (for redis), inmemory, file, http, s3, cassandra, postgresql
  storage = ${?APP_STORAGE} # the storage used by otoroshi. possible values are lettuce (for redis), inmemory, file, http, s3, cassandra, postgresql
  storage = ${?OTOROSHI_STORAGE} # the storage used by otoroshi. possible values are lettuce (for redis), inmemory, file, http, s3, cassandra, postgresql
  storageRoot = "otoroshi" # the prefix used for storage keys
  storageRoot = ${?APP_STORAGE_ROOT} # the prefix used for storage keys
  storageRoot = ${?OTOROSHI_STORAGE_ROOT} # the prefix used for storage keys
  eventsName = "otoroshi" # the name of the event producer
  eventsName = ${?APP_EVENTS_NAME} # the name of the event producer
  eventsName = ${?OTOROSHI_EVENTS_NAME} # the name of the event producer
  importFrom = ${?APP_IMPORT_FROM} # file path to import otoroshi initial configuration
  importFrom = ${?OTOROSHI_IMPORT_FROM} # file path to import otoroshi initial configuration
  env = "prod" # env name, should always be prod except in dev mode
  env = ${?APP_ENV} # env name, should always be prod except in dev mode
  env = ${?OTOROSHI_ENV} # env name, should always be prod except in dev mode
  liveJs = false # enabled live JS loading for dev mode
  redirectToDev = false #not-used
  domain = "oto.tools" # default domain for basic otoroshi services
  domain = ${?APP_DOMAIN} # default domain for basic otoroshi services
  domain = ${?OTOROSHI_DOMAIN} # default domain for basic otoroshi services
  routeBaseDomain = "newroute.oto.tools" # default domain for new otoroshi routes
  routeBaseDomain = ${?OTOROSHI_ROUTE_BASE_DOMAIN} # default domain for new otoroshi routes
  commitId = "HEAD"
  commitId = ${?COMMIT_ID}
  commitId = ${?OTOROSHI_COMMIT_ID}
  rootScheme = "http" # default root scheme when composing urls
  rootScheme = ${?APP_ROOT_SCHEME} # default root scheme when composing urls
  rootScheme = ${?OTOROSHI_ROOT_SCHEME} # default root scheme when composing urls
  middleFingers = false #not-used
  middleFingers = ${?APP_MIDDLE_FINGERS} #not-used
  middleFingers = ${?OTOROSHI_MIDDLE_FINGERS} #not-used
  workers = 30 #not-used
  workers = ${?APP_WORKERS} #not-used
  workers = ${?OTOROSHI_WORKERS} #not-used
  throttlingWindow = 10 # the number of second used to compute throttling number
  throttlingWindow = ${?THROTTLING_WINDOW} # the number of second used to compute throttling number
  throttlingWindow = ${?OTOROSHI_THROTTLING_WINDOW} # the number of second used to compute throttling number
  checkForUpdates = true # enable automatic version update checks
  checkForUpdates = ${?CHECK_FOR_UPDATES} # enable automatic version update checks
  checkForUpdates = ${?OTOROSHI_CHECK_FOR_UPDATES} # enable automatic version update checks
  overheadThreshold = 500.0 # the value threshold (in milliseconds) used to send HighOverheadAlert
  overheadThreshold = ${?OVERHEAD_THRESHOLD} # the value threshold (in milliseconds) used to send HighOverheadAlert
  overheadThreshold = ${?OTOROSHI_OVERHEAD_THRESHOLD} # the value threshold (in milliseconds) used to send HighOverheadAlert
  adminLogin = ${?OTOROSHI_INITIAL_ADMIN_LOGIN} # the initial admin login
  adminPassword = ${?OTOROSHI_INITIAL_ADMIN_PASSWORD} # the initial admin password
  initialCustomization = ${?OTOROSHI_INITIAL_CUSTOMIZATION} # otoroshi inital configuration that will be merged with a new confguration. Shaped like an otoroshi export
  boot {
  	failOnTimeout = false # otoroshi will exit if a subsystem failed its init
  	failOnTimeout = ${?OTOROSHI_BOOT_FAIL_ON_TIMEOUT} # otoroshi will exit if a subsystem failed its init

    globalWait = true # should we wait until everything is setup to accept http requests
    globalWait = ${?OTOROSHI_BOOT_GLOBAL_WAIT} # should we wait until everything is setup to accept http requests
    globalWaitTimeout = 60000 # max wait before accepting requests
    globalWaitTimeout = ${?OTOROSHI_BOOT_GLOBAL_WAIT_TIMEOUT} # max wait before accepting requests

    waitForPluginsSearch = true # should we wait for classpath plugins search before accepting http requests
    waitForPluginsSearch = ${?OTOROSHI_BOOT_WAIT_FOR_PLUGINS_SEARCH} # should we wait for classpath plugins search before accepting http requests
    waitForPluginsSearchTimeout = 20000 # max wait for classpath plugins search before accepting http requests
    waitForPluginsSearchTimeout = ${?OTOROSHI_BOOT_WAIT_FOR_PLUGINS_SEARCH_TIMEOUT} # max wait for classpath plugins search before accepting http requests

    waitForScriptsCompilation = true # should we wait for plugins compilation before accepting http requests
    waitForScriptsCompilation = ${?OTOROSHI_BOOT_WAIT_FOR_SCRIPTS_COMPILATION} # should we wait for plugins compilation before accepting http requests
    waitForScriptsCompilationTimeout = 30000 # max wait for plugins compilation before accepting http requests
    waitForScriptsCompilationTimeout = ${?OTOROSHI_BOOT_WAIT_FOR_SCRIPTS_COMPILATION_TIMEOUT} # max wait for plugins compilation before accepting http requests 

    waitForTlsInit = true # should we wait for first TLS context initialization before accepting http requests
    waitForTlsInit = ${?OTOROSHI_BOOT_WAIT_FOR_TLS_INIT} # should we wait for first TLS context initialization before accepting http requests
    waitForTlsInitTimeout = 10000 # max wait for first TLS context initialization before accepting http requests
    waitForTlsInitTimeout = ${?OTOROSHI_BOOT_WAIT_FOR_TLS_INIT_TIMEOUT} # max wait for first TLS context initialization before accepting http requests

    waitForFirstClusterFetch = true # should we wait for first cluster initialization before accepting http requests
    waitForFirstClusterFetch = ${?OTOROSHI_BOOT_WAIT_FOR_FIRST_CLUSTER_FETCH} # should we wait for first cluster initialization before accepting http requests
    waitForFirstClusterFetchTimeout = 10000 # max wait for first cluster initialization before accepting http requests
    waitForFirstClusterFetchTimeout = ${?OTOROSHI_BOOT_WAIT_FOR_FIRST_CLUSTER_TIMEOUT} # max wait for first cluster initialization before accepting http requests

    waitForFirstClusterStateCache = true # should we wait for first cluster initialization before accepting http requests
    waitForFirstClusterStateCache = ${?OTOROSHI_BOOT_WAIT_FOR_FIRST_CLUSTER_STATE_CACHE} # should we wait for first cluster initialization before accepting http requests
    waitForFirstClusterStateCacheTimeout = 10000 # max wait for first cluster initialization before accepting http requests
    waitForFirstClusterStateCacheTimeout =  ${?OTOROSHI_BOOT_WAIT_FOR_FIRST_CLUSTER_STATE_CACHE_TIMEOUT} # max wait for first cluster initialization before accepting http requests
  }
  instance {
    instanceId = ${?OTOROSHI_INSTANCE_ID} # the instance id
    number = 0 # the instance number. Can be found in otoroshi events
    number =  ${?OTOROSHI_INSTANCE_NUMBER} # the instance number. Can be found in otoroshi events
    number =  ${?INSTANCE_NUMBER} # the instance number. Can be found in otoroshi events
    name = "otoroshi" # instance name
    name = ${?OTOROSHI_INSTANCE_NAME} # instance name
		logo = ${?OTOROSHI_INSTANCE_LOGO} # instance logo
    zone = "local" # instance zone (optional)
    zone = ${?OTOROSHI_INSTANCE_ZONE} # instance zone (optional)
    region = "local" # instance region (optional)
    region = ${?OTOROSHI_INSTANCE_REGION} # instance region (optional)
    dc = "local" # instance dc (optional)
    dc = ${?OTOROSHI_INSTANCE_DATACENTER} # instance dc (optional)
    provider = "local" # instance provider (optional)
    provider = ${?OTOROSHI_INSTANCE_PROVIDER} # instance provider (optional)
    rack = "local" # instance rack (optional)
    rack = ${?OTOROSHI_INSTANCE_RACK} # instance rack (optional)
    title = ${?OTOROSHI_INSTANCE_TITLE} # the title displayed in UI top left
  }
  proxy { #not-used
    keepAlive = true #not-used
    keepAlive = ${?PROXY_KEEPALIVE} #not-used
    keepAlive = ${?OTOROSHI_PROXY_KEEPALIVE} #not-used
    compressionEnabled = false #not-used
    compressionEnabled = ${?PROXY_COMPRESSION_ENABLED} #not-used
    compressionEnabled = ${?OTOROSHI_PROXY_COMPRESSION_ENABLED} #not-used
    idleTimeout = 3600000 #not-used
    idleTimeout = ${?PROXY_IDLE_TIMEOUT} #not-used
    idleTimeout = ${?OTOROSHI_PROXY_IDLE_TIMEOUT} #not-used
    connectionTimeout = 120000 #not-used
    connectionTimeout = ${?PROXY_CONNECTION_TIMEOUT} #not-used
    connectionTimeout = ${?OTOROSHI_PROXY_CONNECTION_TIMEOUT} #not-used
    requestTimeout = 3600000 #not-used
    requestTimeout = ${?PROXY_REQUEST_TIMEOUT} #not-used
    requestTimeout = ${?OTOROSHI_PROXY_REQUEST_TIMEOUT} #not-used
    longRequestTimeout = 10800000
    longRequestTimeout = ${?OTOROSHI_PROXY_LONG_REQUEST_TIMEOUT}
    useAkkaClient = false #not-used
    useAkkaClient = ${?PROXY_USE_AKKA_CLIENT} #not-used
    useAkkaClient = ${?OTOROSHI_PROXY_USE_AKKA_CLIENT} #not-used
  }
  sidecar { #not-used
    serviceId = ${?SIDECAR_SERVICE_ID} #not-used
    serviceId = ${?OTOROSHI_SIDECAR_SERVICE_ID} #not-used
    target = ${?SIDECAR_TARGET} #not-used
    target = ${?OTOROSHI_SIDECAR_TARGET} #not-used
    from = "127.0.0.1" #not-used
    from = ${?SIDECAR_FROM} #not-used
    from = ${?OTOROSHI_SIDECAR_FROM} #not-used
    strict = true #not-used
    strict = ${?SIDECAR_STRICT} #not-used
    strict = ${?OTOROSHI_SIDECAR_STRICT} #not-used
    apikey { #not-used
      clientId = ${?SIDECAR_APIKEY_CLIENT_ID} #not-used
      clientId = ${?OTOROSHI_SIDECAR_APIKEY_CLIENT_ID} #not-used
    } #not-used
  } #not-used
  health {
    limit = 1000  # the value threshold (in milliseconds) used to indicate if an otoroshi instance is healthy or not
    limit = ${?HEALTH_LIMIT} # the value threshold (in milliseconds) used to indicate if an otoroshi instance is healthy or not
    limit = ${?OTOROSHI_HEALTH_LIMIT} # the value threshold (in milliseconds) used to indicate if an otoroshi instance is healthy or not
    accessKey = ${?HEALTH_ACCESS_KEY} # the key to access /health edpoint
    accessKey = ${?OTOROSHI_HEALTH_ACCESS_KEY} # the key to access /health edpoint
  }
  snowflake {
    seed = 0 # the seed number used to generate unique ids. Should be different for every instances
    seed = ${?INSTANCE_NUMBER} # the seed number used to generate unique ids. Should be different for every instances
    seed = ${?OTOROSHI_INSTANCE_NUMBER} # the seed number used to generate unique ids. Should be different for every instances
    seed = ${?SNOWFLAKE_SEED} # the seed number used to generate unique ids. Should be different for every instances
    seed = ${?OTOROSHI_SNOWFLAKE_SEED} # the seed number used to generate unique ids. Should be different for every instances
  }
  events {
    maxSize = 1000 # the amount of event kept in the datastore
    maxSize = ${?MAX_EVENTS_SIZE} # the amount of event kept in the datastore
    maxSize = ${?OTOROSHI_MAX_EVENTS_SIZE} # the amount of event kept in the datastore
  }
  exposed-ports {
    http = ${?APP_EXPOSED_PORTS_HTTP} # the exposed http port for otoroshi (when in a container or behind a proxy)
    http = ${?OTOROSHI_EXPOSED_PORTS_HTTP} # the exposed http port for otoroshi (when in a container or behind a proxy)
    https = ${?APP_EXPOSED_PORTS_HTTPS} # the exposed https port for otoroshi (when in a container or behind a proxy
    https = ${?OTOROSHI_EXPOSED_PORTS_HTTPS} # the exposed https port for otoroshi (when in a container or behind a proxy
  }
  backoffice {
    exposed = true # expose the backoffice ui
    exposed = ${?APP_BACKOFFICE_EXPOSED} # expose the backoffice ui
    exposed = ${?OTOROSHI_BACKOFFICE_EXPOSED} # expose the backoffice ui
    subdomain = "otoroshi" # the backoffice subdomain
    subdomain = ${?APP_BACKOFFICE_SUBDOMAIN} # the backoffice subdomain
    subdomain = ${?OTOROSHI_BACKOFFICE_SUBDOMAIN} # the backoffice subdomain
    domains = []  # the backoffice domains
    domainsStr = ${?APP_BACKOFFICE_DOMAINS} # the backoffice domains
    domainsStr = ${?OTOROSHI_BACKOFFICE_DOMAINS} # the backoffice domains
    # useNewEngine = false # avoid backoffice admin api proxy
    # useNewEngine = ${?OTOROSHI_BACKOFFICE_USE_NEW_ENGINE} # avoid backoffice admin api proxy
    usePlay = true # avoid backoffice http call for admin api
    usePlay = ${?OTOROSHI_BACKOFFICE_USE_PLAY} # avoid backoffice http call for admin api
    session {
      exp = 86400000 # the backoffice cookie expiration
      exp = ${?APP_BACKOFFICE_SESSION_EXP} # the backoffice cookie expiration
      exp = ${?OTOROSHI_BACKOFFICE_SESSION_EXP} # the backoffice cookie expiration
    }
  }
  privateapps {
    subdomain = "privateapps" # privateapps (proxy sso) domain
    subdomain = ${?APP_PRIVATEAPPS_SUBDOMAIN} # privateapps (proxy sso) domain
    subdomain = ${?OTOROSHI_PRIVATEAPPS_SUBDOMAIN} # privateapps (proxy sso) domain
    domains = []
    domainsStr = ${?APP_PRIVATEAPPS_DOMAINS}
    domainsStr = ${?OTOROSHI_PRIVATEAPPS_DOMAINS}
    session {
      exp = 86400000 # the privateapps cookie expiration
      exp = ${?APP_PRIVATEAPPS_SESSION_EXP} # the privateapps cookie expiration
      exp = ${?OTOROSHI_PRIVATEAPPS_SESSION_EXP} # the privateapps cookie expiration
    }
  }
  adminapi {
    exposed = true # expose the admin api
    exposed = ${?ADMIN_API_EXPOSED} # expose the admin api
    exposed = ${?OTOROSHI_ADMIN_API_EXPOSED} # expose the admin api
    targetSubdomain = "otoroshi-admin-internal-api" # admin api target subdomain as targeted by otoroshi service
    targetSubdomain = ${?ADMIN_API_TARGET_SUBDOMAIN} # admin api target subdomain as targeted by otoroshi service
    targetSubdomain = ${?OTOROSHI_ADMIN_API_TARGET_SUBDOMAIN} # admin api target subdomain as targeted by otoroshi service
    exposedSubdomain = "otoroshi-api" # admin api exposed subdomain as exposed by otoroshi service
    exposedSubdomain = ${?ADMIN_API_EXPOSED_SUBDOMAIN} # admin api exposed subdomain as exposed by otoroshi service
    exposedSubdomain = ${?OTOROSHI_ADMIN_API_EXPOSED_SUBDOMAIN} # admin api exposed subdomain as exposed by otoroshi service
    additionalExposedDomain = ${?ADMIN_API_ADDITIONAL_EXPOSED_DOMAIN} # admin api additional exposed subdomain as exposed by otoroshi service
    additionalExposedDomain = ${?OTOROSHI_ADMIN_API_ADDITIONAL_EXPOSED_DOMAIN} # admin api additional exposed subdomain as exposed by otoroshi service
    domains = []
    domainsStr = ${?ADMIN_API_DOMAINS}
    domainsStr = ${?OTOROSHI_ADMIN_API_DOMAINS}
    exposedDomains = []
    exposedDomainsStr = ${?ADMIN_API_EXPOSED_DOMAINS}
    exposedDomainsStr = ${?OTOROSHI_ADMIN_API_EXPOSED_DOMAINS}
    defaultValues {
      backOfficeGroupId = "admin-api-group" # default value for admin api service group
      backOfficeGroupId = ${?ADMIN_API_GROUP} # default value for admin api service group
      backOfficeGroupId = ${?OTOROSHI_ADMIN_API_GROUP} # default value for admin api service group
      backOfficeApiKeyClientId = "admin-api-apikey-id" # default value for admin api apikey id
      backOfficeApiKeyClientId = ${?ADMIN_API_CLIENT_ID}  # default value for admin api apikey id
      backOfficeApiKeyClientId = ${?OTOROSHI_ADMIN_API_CLIENT_ID}  # default value for admin api apikey id
      backOfficeApiKeyClientSecret = "admin-api-apikey-secret" # default value for admin api apikey secret
      backOfficeApiKeyClientSecret = ${?otoroshi.admin-api-secret} # default value for admin api apikey secret
      backOfficeApiKeyClientSecret = ${?OTOROSHI_otoroshi.admin-api-secret} # default value for admin api apikey secret
      backOfficeApiKeyClientSecret = ${?ADMIN_API_CLIENT_SECRET} # default value for admin api apikey secret
      backOfficeApiKeyClientSecret = ${?OTOROSHI_ADMIN_API_CLIENT_SECRET} # default value for admin api apikey secret
      backOfficeServiceId = "admin-api-service" # default value for admin api service id
      backOfficeServiceId = ${?ADMIN_API_SERVICE_ID} # default value for admin api service id
      backOfficeServiceId = ${?OTOROSHI_ADMIN_API_SERVICE_ID} # default value for admin api service id
    }
    proxy {
      https = false # backoffice proxy admin api over https
      https = ${?ADMIN_API_HTTPS} # backoffice proxy admin api over https
      https = ${?OTOROSHI_ADMIN_API_HTTPS} # backoffice proxy admin api over https
      local = true # backoffice proxy admin api on localhost
      local = ${?ADMIN_API_LOCAL} # backoffice proxy admin api on localhost
      local = ${?OTOROSHI_ADMIN_API_LOCAL} # backoffice proxy admin api on localhost
    }
  }
  claim {
    sharedKey = "secret" # the default secret used to sign otoroshi exchange protocol tokens
    sharedKey = ${?CLAIM_SHAREDKEY} # the default secret used to sign otoroshi exchange protocol tokens
    sharedKey = ${?OTOROSHI_CLAIM_SHAREDKEY} # the default secret used to sign otoroshi exchange protocol tokens
  }
  webhooks {
    size = 100#not-used
    size = ${?WEBHOOK_SIZE}#not-used
    size = ${?OTOROSHI_WEBHOOK_SIZE}#not-used
  }
  redis { # configuration to fetch/store otoroshi state from a redis datastore using rediscala
    host = "localhost"
    host = ${?REDIS_HOST}
    host = ${?OTOROSHI_REDIS_HOST}
    port = 6379
    port = ${?REDIS_PORT}
    port = ${?OTOROSHI_REDIS_PORT}
    password = ${?REDIS_PASSWORD}
    password = ${?OTOROSHI_REDIS_PASSWORD}
    windowSize = 99
    windowSize = ${?REDIS_WINDOW_SIZE}
    windowSize = ${?OTOROSHI_REDIS_WINDOW_SIZE}
    slaves = []
    slavesStr = ${?REDIS_SLAVES}
    slavesStr = ${?OTOROSHI_REDIS_SLAVES}
    slavesStr = ${?REDIS_MEMBERS}
    slavesStr = ${?OTOROSHI_REDIS_MEMBERS}
    useScan = false
    useScan =  ${?REDIS_USE_SCAN}
    useScan =  ${?OTOROSHI_REDIS_USE_SCAN}

    pool {
      members = []
      members = ${?REDIS_POOL_MEMBERS}
      members = ${?OTOROSHI_REDIS_POOL_MEMBERS}
    }

    mpool {
      members = []
      membersStr = ${?REDIS_MPOOL_MEMBERS}
      membersStr = ${?OTOROSHI_REDIS_MPOOL_MEMBERS}
    }

    lf {
      master {
        host = ${?REDIS_LF_HOST}
        host = ${?OTOROSHI_REDIS_LF_HOST}
        port = ${?REDIS_LF_PORT}
        port = ${?OTOROSHI_REDIS_LF_PORT}
        password = ${?REDIS_LF_PASSWORD}
        password = ${?OTOROSHI_REDIS_LF_PASSWORD}
      }
      slaves = []
      slavesStr = ${?REDIS_LF_SLAVES}
      slavesStr = ${?OTOROSHI_REDIS_LF_SLAVES}
      slavesStr = ${?REDIS_LF_MEMBERS}
      slavesStr = ${?OTOROSHI_REDIS_LF_MEMBERS}
    }

    sentinels {
      master = ${?REDIS_SENTINELS_MASTER}
      master = ${?OTOROSHI_REDIS_SENTINELS_MASTER}
      password = ${?REDIS_SENTINELS_PASSWORD}
      password = ${?OTOROSHI_REDIS_SENTINELS_PASSWORD}
      db = ${?REDIS_SENTINELS_DB}
      db = ${?OTOROSHI_REDIS_SENTINELS_DB}
      name = ${?REDIS_SENTINELS_NAME}
      name = ${?OTOROSHI_REDIS_SENTINELS_NAME}
      members = []
      membersStr = ${?REDIS_SENTINELS_MEMBERS}
      membersStr = ${?OTOROSHI_REDIS_SENTINELS_MEMBERS}

      lf {
        master = ${?REDIS_SENTINELS_LF_MASTER}
        master = ${?OTOROSHI_REDIS_SENTINELS_LF_MASTER}
        members = []
        membersStr = ${?REDIS_SENTINELS_LF_MEMBERS}
        membersStr = ${?OTOROSHI_REDIS_SENTINELS_LF_MEMBERS}
      }
    }

    cluster {
      members = []
      membersStr = ${?REDIS_CLUSTER_MEMBERS}
      membersStr = ${?OTOROSHI_REDIS_CLUSTER_MEMBERS}
    }

    lettuce { # configuration to fetch/store otoroshi state from a redis datastore using the lettuce driver (the next default one)
      connection = "default"
      connection = ${?REDIS_LETTUCE_CONNECTION}
      connection = ${?OTOROSHI_REDIS_LETTUCE_CONNECTION}
      uri =  ${?REDIS_LETTUCE_URI}
      uri =  ${?OTOROSHI_REDIS_LETTUCE_URI}
      uri =  ${?REDIS_URL}
      uri =  ${?OTOROSHI_REDIS_URL}
      uris = []
      urisStr = ${?REDIS_LETTUCE_URIS}
      urisStr = ${?OTOROSHI_REDIS_LETTUCE_URIS}
      readFrom = "MASTER_PREFERRED"
      readFrom = ${?REDIS_LETTUCE_READ_FROM}
      readFrom = ${?OTOROSHI_REDIS_LETTUCE_READ_FROM}
      startTLS = false
      startTLS = ${?REDIS_LETTUCE_START_TLS}
      startTLS = ${?OTOROSHI_REDIS_LETTUCE_START_TLS}
      verifyPeers = true
      verifyPeers = ${?REDIS_LETTUCE_VERIFY_PEERS}
      verifyPeers = ${?OTOROSHI_REDIS_LETTUCE_VERIFY_PEERS}
    }
  }
  inmemory { # configuration to fetch/store otoroshi state in memory
    windowSize = 99
    windowSize = ${?INMEMORY_WINDOW_SIZE}
    windowSize = ${?OTOROSHI_INMEMORY_WINDOW_SIZE}
    experimental = false
    experimental = ${?INMEMORY_EXPERIMENTAL_STORE}
    experimental = ${?OTOROSHI_INMEMORY_EXPERIMENTAL_STORE}
    optimized = false
    optimized = ${?INMEMORY_OPTIMIZED}
    optimized = ${?OTOROSHI_INMEMORY_OPTIMIZED}
    modern = false
    modern =  ${?INMEMORY_MODERN}
    modern =  ${?OTOROSHI_INMEMORY_MODERN}
  }
  filedb { # configuration to fetch/store otoroshi state from a file
    windowSize = 99
    windowSize = ${?FILEDB_WINDOW_SIZE}
    windowSize = ${?OTOROSHI_FILEDB_WINDOW_SIZE}
    path = "./filedb/state.ndjson"
    path = ${?FILEDB_PATH}
    path = ${?OTOROSHI_FILEDB_PATH}
  }
  httpdb { # configuration to fetch/store otoroshi state from an http endpoint
    url = "http://127.0.0.1:8888/worker-0/state.json"
    headers = {}
    timeout = 10000
    pollEvery = 10000
  }
  s3db { # configuration to fetch/store otoroshi state from a S3 bucket
    bucket = "otoroshi-states"
    bucket = ${?OTOROSHI_DB_S3_BUCKET}
    endpoint = "https://otoroshi-states.foo.bar"
    endpoint = ${?OTOROSHI_DB_S3_ENDPOINT}
    region = "eu-west-1"
    region = ${?OTOROSHI_DB_S3_REGION}
    access = "secret"
    access = ${?OTOROSHI_DB_S3_ACCESS}
    secret = "secret"
    secret = ${?OTOROSHI_DB_S3_SECRET}
    key = "/otoroshi/states/state"
    key = ${?OTOROSHI_DB_S3_KEY}
    chunkSize = 8388608
    chunkSize = ${?OTOROSHI_DB_S3_CHUNK_SIZE}
    v4auth = true
    v4auth = ${?OTOROSHI_DB_S3_V4_AUTH}
    writeEvery = 60000 # write interval
    writeEvery = ${?OTOROSHI_DB_S3_WRITE_EVERY} # write interval
    acl = "Private"
    acl = ${?OTOROSHI_DB_S3_ACL}
  }
  pg { # postrgesql settings. everything possible with the client
    uri = ${?PG_URI}
    uri = ${?OTOROSHI_PG_URI}
    uri = ${?POSTGRESQL_ADDON_URI}
    uri = ${?OTOROSHI_POSTGRESQL_ADDON_URI}
    poolSize = 20
    poolSize = ${?PG_POOL_SIZE}
    poolSize = ${?OTOROSHI_PG_POOL_SIZE}
    port = 5432
    port = ${?PG_PORT}
    port = ${?OTOROSHI_PG_PORT}
    host = "localhost"
    host = ${?PG_HOST}
    host = ${?OTOROSHI_PG_HOST}
    database = "otoroshi"
    database = ${?PG_DATABASE}
    database = ${?OTOROSHI_PG_DATABASE}
    user = "otoroshi"
    user = ${?PG_USER}
    user = ${?OTOROSHI_PG_USER}
    password = "otoroshi"
    password = ${?PG_PASSWORD}
    password = ${?OTOROSHI_PG_PASSWORD}
    logQueries = ${?PG_DEBUG_QUERIES}
    logQueries = ${?OTOROSHI_PG_DEBUG_QUERIES}
    avoidJsonPath = false
    avoidJsonPath = ${?PG_AVOID_JSON_PATH}
    avoidJsonPath = ${?OTOROSHI_PG_AVOID_JSON_PATH}
    optimized = true
    optimized = ${?PG_OPTIMIZED}
    optimized = ${?OTOROSHI_PG_OPTIMIZED}
    connect-timeout = ${?PG_CONNECT_TIMEOUT}
    connect-timeout = ${?OTOROSHI_PG_CONNECT_TIMEOUT}
    idle-timeout = ${?PG_IDLE_TIMEOUT}
    idle-timeout = ${?OTOROSHI_PG_IDLE_TIMEOUT}
    log-activity = ${?PG_LOG_ACTIVITY}
    log-activity = ${?OTOROSHI_PG_LOG_ACTIVITY}
    pipelining-limit = ${?PG_PIPELINING_LIMIT}
    pipelining-limit = ${?OTOROSHI_PG_PIPELINING_LIMIT}
    ssl {
      enabled = false
      enabled = ${?PG_SSL_ENABLED}
      enabled = ${?OTOROSHI_PG_SSL_ENABLED}
      mode = "verify_ca"
      mode = ${?PG_SSL_MODE}
      mode = ${?OTOROSHI_PG_SSL_MODE}
      trusted-certs-path = []
      trusted-certs = []
      trusted-cert-path = ${?PG_SSL_TRUSTED_CERT_PATH}
      trusted-cert-path = ${?OTOROSHI_PG_SSL_TRUSTED_CERT_PATH}
      trusted-cert = ${?PG_SSL_TRUSTED_CERT}
      trusted-cert = ${?OTOROSHI_PG_SSL_TRUSTED_CERT}
      client-certs-path = []
      client-certs = []
      client-cert-path = ${?PG_SSL_CLIENT_CERT_PATH}
      client-cert-path = ${?OTOROSHI_PG_SSL_CLIENT_CERT_PATH}
      client-cert = ${?PG_SSL_CLIENT_CERT}
      client-cert = ${?OTOROSHI_PG_SSL_CLIENT_CERT}
      trust-all = ${?PG_SSL_TRUST_ALL}
      trust-all = ${?OTOROSHI_PG_SSL_TRUST_ALL}
    }
  }
  cassandra { # cassandra settings. everything possible with the client
    windowSize = 99
    windowSize = ${?CASSANDRA_WINDOW_SIZE}
    windowSize = ${?OTOROSHI_CASSANDRA_WINDOW_SIZE}
    host = "127.0.0.1"
    host = ${?CASSANDRA_HOST}
    host = ${?OTOROSHI_CASSANDRA_HOST}
    port = 9042
    port = ${?CASSANDRA_PORT}
    port = ${?OTOROSHI_CASSANDRA_PORT}
    replicationFactor = 1
    replicationFactor = ${?CASSANDRA_REPLICATION_FACTOR}
    replicationFactor = ${?OTOROSHI_CASSANDRA_REPLICATION_FACTOR}
    replicationOptions = ${?CASSANDRA_REPLICATION_OPTIONS}
    replicationOptions = ${?OTOROSHI_CASSANDRA_REPLICATION_OPTIONS}
    durableWrites = true
    durableWrites = ${?CASSANDRA_DURABLE_WRITES}
    durableWrites = ${?OTOROSHI_CASSANDRA_DURABLE_WRITES}
    basic.contact-points = [ ${app.cassandra.host}":"${app.cassandra.port} ]
    basic.session-name = "otoroshi"
    basic.session-name = ${?OTOROSHI_CASSANDRA_SESSION_NAME}
    basic.session-keyspace = ${?OTOROSHI_CASSANDRA_SESSION_KEYSPACE}
    basic.config-reload-interval = 5 minutes
    basic.request {
      timeout = 10 seconds
      consistency = LOCAL_ONE
      consistency = ${?OTOROSHI_CASSANDRA_CONSISTENCY}
      page-size = 5000
      page-size = ${?OTOROSHI_CASSANDRA_PAGE_SIZE}
      serial-consistency = SERIAL
      serial-consistency = ${?OTOROSHI_CASSANDRA_SERIAL_CONSISTENCY}
      default-idempotence = false
      default-idempotence = ${?OTOROSHI_CASSANDRA_DEFAULT_IDEMPOTENCE}
    }
    basic.load-balancing-policy {
      class = DefaultLoadBalancingPolicy
      local-datacenter = datacenter1
      local-datacenter = ${?OTOROSHI_CASSANDRA_LOCAL_DATACENTER}
      # filter.class=
      slow-replica-avoidance = true
    }
    basic.cloud {
      # secure-connect-bundle = /location/of/secure/connect/bundle
    }
    basic.application {
      # name =
      # version =
    }
    basic.graph {
      # name = your-graph-name
      traversal-source = "g"
      # is-system-query = false
      # read-consistency-level = LOCAL_QUORUM
      # write-consistency-level = LOCAL_ONE
      # timeout = 10 seconds
    }
    advanced.connection {
      connect-timeout = 5 seconds
      init-query-timeout = 500 milliseconds
      set-keyspace-timeout = ${datastax-java-driver.advanced.connection.init-query-timeout}
      pool {
        local {
          size = 1
        }
        remote {
          size = 1
        }
      }
      max-requests-per-connection = 1024
      max-orphan-requests = 256
      warn-on-init-error = true
    }
    advanced.reconnect-on-init = false
    advanced.reconnection-policy {
      class = ExponentialReconnectionPolicy
      base-delay = 1 second
      max-delay = 60 seconds
    }
    advanced.retry-policy {
      class = DefaultRetryPolicy
    }
    advanced.speculative-execution-policy {
      class = NoSpeculativeExecutionPolicy
      # max-executions = 3
      # delay = 100 milliseconds
    }
    advanced.auth-provider {
      # class = PlainTextAuthProvider
      username = ${?CASSANDRA_USERNAME}
      username = ${?OTOROSHI_CASSANDRA_USERNAME}
      password = ${?CASSANDRA_PASSWORD}
      password = ${?OTOROSHI_CASSANDRA_PASSWORD}
      authorization-id = ${?OTOROSHI_CASSANDRA_AUTHORIZATION_ID}
      //service = "cassandra"
      # login-configuration {
      #   principal = "[email protected]"
      #   useKeyTab = "true"
      #   refreshKrb5Config = "true"
      #   keyTab = "/path/to/keytab/file"
      # }
      # sasl-properties {
      #   javax.security.sasl.qop = "auth-conf"
      # }
    }
    advanced.ssl-engine-factory {
      # class = DefaultSslEngineFactory
      # cipher-suites = [ "TLS_RSA_WITH_AES_128_CBC_SHA", "TLS_RSA_WITH_AES_256_CBC_SHA" ]
      # hostname-validation = true
      # truststore-path = /path/to/client.truststore
      # truststore-password = password123
      # keystore-path = /path/to/client.keystore
      # keystore-password = password123
    }
    advanced.timestamp-generator {
      class = AtomicTimestampGenerator
      drift-warning {
        threshold = 1 second
        interval = 10 seconds
      }
      force-java-clock = false
    }
    advanced.request-tracker {
      class = NoopRequestTracker
      logs {
        # success.enabled = true
        slow {
          # threshold = 1 second
          # enabled = true
        }
        # error.enabled = true
        # max-query-length = 500
        # show-values = true
        # max-value-length = 50
        # max-values = 50
        # show-stack-traces = true
      }
    }
    advanced.throttler {
      class = PassThroughRequestThrottler
      # max-queue-size = 10000
      # max-concurrent-requests = 10000
      # max-requests-per-second = 10000
      # drain-interval = 10 milliseconds
    }
    advanced.node-state-listener.class = NoopNodeStateListener
    advanced.schema-change-listener.class = NoopSchemaChangeListener
    advanced.address-translator {
      class = PassThroughAddressTranslator
    }
    advanced.resolve-contact-points = true
    advanced.protocol {
      version = V4
      version = ${?OTOROSHI_CASSANDRA_PROTOCOL_VERSION}
      compression = lz4
      compression = ${?OTOROSHI_CASSANDRA_PROTOCOL_COMPRESSION}
      max-frame-length = 256 MB
    }
    advanced.request {
      warn-if-set-keyspace = false
      trace {
        attempts = 5
        interval = 3 milliseconds
        consistency = ONE
      }
      log-warnings = true
    }
    advanced.graph {
      # sub-protocol = "graphson-2.0"
      paging-enabled = "AUTO"
      paging-options {
        page-size = ${datastax-java-driver.advanced.continuous-paging.page-size}
        max-pages = ${datastax-java-driver.advanced.continuous-paging.max-pages}
        max-pages-per-second = ${datastax-java-driver.advanced.continuous-paging.max-pages-per-second}
        max-enqueued-pages = ${datastax-java-driver.advanced.continuous-paging.max-enqueued-pages}
      }
    }
    advanced.continuous-paging {
      page-size = ${datastax-java-driver.basic.request.page-size}
      page-size-in-bytes = false
      max-pages = 0
      max-pages-per-second = 0
      max-enqueued-pages = 4
      timeout {
        first-page = 2 seconds
        other-pages = 1 second
      }
    }
    advanced.monitor-reporting {
      enabled = true
    }
    advanced.metrics {
      session {
        enabled = [
          # bytes-sent,
          # bytes-received
          # connected-nodes,
          # cql-requests,
          # cql-client-timeouts,
          # cql-prepared-cache-size,
          # throttling.delay,
          # throttling.queue-size,
          # throttling.errors,
          # continuous-cql-requests,
          # graph-requests,
          # graph-client-timeouts
        ]
        cql-requests {
          highest-latency = 3 seconds
          significant-digits = 3
          refresh-interval = 5 minutes
        }
        throttling.delay {
          highest-latency = 3 seconds
          significant-digits = 3
          refresh-interval = 5 minutes
        }
        continuous-cql-requests {
          highest-latency = 120 seconds
          significant-digits = 3
          refresh-interval = 5 minutes
        }
        graph-requests {
          highest-latency = 12 seconds
          significant-digits = 3
          refresh-interval = 5 minutes
        }
      }
      node {
        enabled = [
          # pool.open-connections,
          # pool.available-streams,
          # pool.in-flight,
          # pool.orphaned-streams,
          # bytes-sent,
          # bytes-received,
          # cql-messages,
          # errors.request.unsent,
          # errors.request.aborted,
          # errors.request.write-timeouts,
          # errors.request.read-timeouts,
          # errors.request.unavailables,
          # errors.request.others,
          # retries.total,
          # retries.aborted,
          # retries.read-timeout,
          # retries.write-timeout,
          # retries.unavailable,
          # retries.other,
          # ignores.total,
          # ignores.aborted,
          # ignores.read-timeout,
          # ignores.write-timeout,
          # ignores.unavailable,
          # ignores.other,
          # speculative-executions,
          # errors.connection.init,
          # errors.connection.auth,
          # graph-messages,
        ]
        cql-messages {
          highest-latency = 3 seconds
          significant-digits = 3
          refresh-interval = 5 minutes
        }
        graph-messages {
          highest-latency = 3 seconds
          significant-digits = 3
          refresh-interval = 5 minutes
        }
      }
    }
    advanced.socket {
      tcp-no-delay = true
      //keep-alive = false
      //reuse-address = true
      //linger-interval = 0
      //receive-buffer-size = 65535
      //send-buffer-size = 65535
    }
    advanced.heartbeat {
      interval = 30 seconds
      timeout = ${datastax-java-driver.advanced.connection.init-query-timeout}
    }
    advanced.metadata {
      topology-event-debouncer {
        window = 1 second
        max-events = 20
      }
      schema {
        enabled = true
        # refreshed-keyspaces = [ "ks1", "ks2" ]
        request-timeout = ${datastax-java-driver.basic.request.timeout}
        request-page-size = ${datastax-java-driver.basic.request.page-size}
        debouncer {
          window = 1 second
          max-events = 20
        }
      }
      token-map.enabled = true
    }
    advanced.control-connection {
      timeout = ${datastax-java-driver.advanced.connection.init-query-timeout}
      schema-agreement {
        interval = 200 milliseconds
        timeout = 10 seconds
        warn-on-failure = true
      }
    }
    advanced.prepared-statements {
      prepare-on-all-nodes = true
      reprepare-on-up {
        enabled = true
        check-system-table = false
        max-statements = 0
        max-parallelism = 100
        timeout = ${datastax-java-driver.advanced.connection.init-query-timeout}
      }
    }
    advanced.netty {
      daemon = false
      io-group {
        size = 0
        shutdown {quiet-period = 2, timeout = 15, unit = SECONDS}
      }
      admin-group {
        size = 2
        shutdown {quiet-period = 2, timeout = 15, unit = SECONDS}
      }
      timer {
        tick-duration = 100 milliseconds
        ticks-per-wheel = 2048
      }
    }
    advanced.coalescer {
      max-runs-with-no-work = 5
      reschedule-interval = 10 microseconds
    }
  }
  kafka { #not-used
    host = "127.0.0.1" #not-used
    host = ${?KAFKA_HOST} #not-used
    host = ${?OTOROSHI_KAFKA_HOST} #not-used
    port = "9092" #not-used
    port = ${?KAFKA_PORT} #not-used
    port = ${?OTOROSHI_KAFKA_PORT} #not-used
    servers = ${app.kafka.host}":"${app.kafka.port} #not-used
    servers = ${?KAFKA_HOSTS_AND_PORTS} #not-used
    servers = ${?OTOROSHI_KAFKA_HOSTS_AND_PORTS} #not-used
    groupId = "otoroshi" #not-used
    nbPartitions = 3 #not-used
    nbPartitions = ${?KAFKA_NB_PARTITIONS} #not-used
    nbPartitions = ${?OTOROSHI_KAFKA_NB_PARTITIONS} #not-used
    keyPass = ${?KAFKA_PASSWORD} #not-used
    keyPass = ${?OTOROSHI_KAFKA_PASSWORD} #not-used
    keystore { #not-used
      location = ${?KAFKA_KEYSTORE_LOCATION} #not-used
      location = ${?OTOROSHI_KAFKA_KEYSTORE_LOCATION} #not-used
    } #not-used
    truststore { #not-used
      location = ${?KAFKA_TRUSTORE_LOCATION} #not-used
      location = ${?OTOROSHI_KAFKA_TRUSTORE_LOCATION} #not-used
    } #not-used
  } #not-used
  actorsystems {
    otoroshi {
      akka { # otoroshi actorsystem configuration
        version = ${akka.version}
        log-dead-letters-during-shutdown = false
        jvm-exit-on-fatal-error = false
        default-dispatcher {
          type = Dispatcher
          executor = "fork-join-executor"
          fork-join-executor {
            parallelism-factor = 4.0
            parallelism-factor = ${?OTOROSHI_CORE_DISPATCHER_PARALLELISM_FACTOR}
            parallelism-min = 8
            parallelism-min = ${?OTOROSHI_CORE_DISPATCHER_PARALLELISM_MIN}
            parallelism-max = 128
            parallelism-max = ${?OTOROSHI_CORE_DISPATCHER_PARALLELISM_MAX}
            task-peeking-mode = "FIFO"
            task-peeking-mode = ${?OTOROSHI_CORE_DISPATCHER_TASK_PEEKING_MODE}
          }
          throughput = 1
          throughput = ${?OTOROSHI_CORE_DISPATCHER_THROUGHPUT}
        }
        http {
          parsing {
            max-uri-length             = 4k
            max-uri-length             = ${?OTOROSHI_AKKA_HTTP_CLIENT_PARSING_MAX_URI_LENGTH}
            max-method-length          = 16
            max-method-length          = ${?OTOROSHI_AKKA_HTTP_CLIENT_PARSING_MAX_METHOD_LENGTH}
            max-response-reason-length = 64
            max-response-reason-length = ${?OTOROSHI_AKKA_HTTP_CLIENT_PARSING_MAX_RESPONSE_REASON_LENGTH}
            max-header-name-length     = 128
            max-header-name-length     = ${?OTOROSHI_AKKA_HTTP_CLIENT_PARSING_MAX_HEADER_NAME_LENGTH}
            max-header-value-length    = 16k
            max-header-value-length    = ${?OTOROSHI_AKKA_HTTP_CLIENT_PARSING_MAX_HEADER_VALUE_LENGTH}
            max-header-count           = 128
            max-header-count           = ${?OTOROSHI_AKKA_HTTP_CLIENT_PARSING_MAX_HEADER_COUNT}
            max-chunk-ext-length       = 256
            max-chunk-ext-length       = ${?OTOROSHI_AKKA_HTTP_CLIENT_PARSING_MAX_CHUNK_EXT_LENGTH}
            max-chunk-size             = 256m
            max-chunk-size             = ${?AKKA_HTTP_CLIENT_MAX_CHUNK_SIZE}
            max-chunk-size             = ${?OTOROSHI_AKKA_HTTP_CLIENT_MAX_CHUNK_SIZE}
            max-chunk-size             = ${?OTOROSHI_AKKA_HTTP_CLIENT_PARSING_MAX_CHUNK_SIZE}
            max-content-length         = infinite
            max-content-length         = ${?AKKA_HTTP_CLIENT_MAX_CONTENT_LENGHT}
            max-content-length         = ${?OTOROSHI_AKKA_HTTP_CLIENT_MAX_CONTENT_LENGHT}
            max-content-length         = ${?OTOROSHI_AKKA_HTTP_CLIENT_PARSING_MAX_CONTENT_LENGHT}
            max-to-strict-bytes        = infinite
            max-to-strict-bytes        = ${?AKKA_HTTP_CLIENT_MAX_TO_STRICT_BYTES}
            max-to-strict-bytes        = ${?OTOROSHI_AKKA_HTTP_CLIENT_MAX_TO_STRICT_BYTES}
            max-to-strict-bytes        = ${?OTOROSHI_AKKA_HTTP_CLIENT_PARSING_MAX_TO_STRICT_BYTES}
          }
        }
      }
    }
    datastore {
      akka {
        version = ${akka.version}
        log-dead-letters-during-shutdown = false
        jvm-exit-on-fatal-error = false
        default-dispatcher {
          type = Dispatcher
          executor = "fork-join-executor"
          fork-join-executor {
            parallelism-factor = 4.0
            parallelism-min = 4
            parallelism-max = 64
            task-peeking-mode = "FIFO"
          }
          throughput = 1
        }
      }
    }
  }
}

otoroshi {
  domain = ${?app.domain}
  maintenanceMode = false # enable global maintenance mode
  maintenanceMode = ${?OTOROSHI_MAINTENANCE_MODE_ENABLED} # enable global maintenance mode
  secret = "verysecretvaluethatyoumustoverwrite" # the secret used to sign sessions
  secret = ${?OTOROSHI_SECRET}  # the secret used to sign sessions
  admin-api-secret = ${?OTOROSHI_ADMIN_API_SECRET}  # the secret for admin api
  elSettings {
    allowEnvAccess = true
    allowEnvAccess = ${?OTOROSHI_EL_SETTINGS_ALLOW_ENV_ACCESS}
    allowConfigAccess = true
    allowConfigAccess = ${?OTOROSHI_EL_SETTINGS_ALLOW_CONFIG_ACCESS}
  }
  open-telemetry {
  	server-logs {
      enabled = false
      enabled = ${?OTOROSHI_OPEN_TELEMETRY_SERVER_LOGS_ENABLED}
      gzip = false
      gzip = ${?OTOROSHI_OPEN_TELEMETRY_SERVER_LOGS_GZIP}
      grpc = false
      grpc = ${?OTOROSHI_OPEN_TELEMETRY_SERVER_LOGS_GRPC}
      endpoint = ${?OTOROSHI_OPEN_TELEMETRY_SERVER_LOGS_ENDPOINT}
      timeout = 5000
      timeout = ${?OTOROSHI_OPEN_TELEMETRY_SERVER_LOGS_TIMEOUT}
      client_cert = ${?OTOROSHI_OPEN_TELEMETRY_SERVER_LOGS_CLIENT_CERT}
      trusted_cert = ${?OTOROSHI_OPEN_TELEMETRY_SERVER_LOGS_TRUSTED_CERT}
      headers = ${?OTOROSHI_OPEN_TELEMETRY_SERVER_LOGS_HEADERS}
      max_batch = ${?OTOROSHI_OPEN_TELEMETRY_SERVER_LOGS_MAX_BATCH}
      max_duration = ${?OTOROSHI_OPEN_TELEMETRY_SERVER_LOGS_MAX_DURATION}
  	}
  	server-metrics {
      enabled = false
      enabled = ${?OTOROSHI_OPEN_TELEMETRY_SERVER_METRICS_ENABLED}
      gzip = false
      gzip = ${?OTOROSHI_OPEN_TELEMETRY_SERVER_METRICS_GZIP}
      grpc = false
      grpc = ${?OTOROSHI_OPEN_TELEMETRY_SERVER_METRICS_GRPC}
      endpoint = ${?OTOROSHI_OPEN_TELEMETRY_SERVER_METRICS_ENDPOINT}
      timeout = 5000
      timeout = ${?OTOROSHI_OPEN_TELEMETRY_SERVER_METRICS_TIMEOUT}
      client_cert = ${?OTOROSHI_OPEN_TELEMETRY_SERVER_METRICS_CLIENT_CERT}
      trusted_cert = ${?OTOROSHI_OPEN_TELEMETRY_SERVER_METRICS_TRUSTED_CERT}
      headers = ${?OTOROSHI_OPEN_TELEMETRY_SERVER_METRICS_HEADERS}
      max_batch = ${?OTOROSHI_OPEN_TELEMETRY_SERVER_METRICS_MAX_BATCH}
      max_duration = ${?OTOROSHI_OPEN_TELEMETRY_SERVER_METRICS_MAX_DURATION}
    }
  }
  next {
    state-sync-interval = 10000
    state-sync-interval = ${?OTOROSHI_NEXT_STATE_SYNC_INTERVAL}
    export-reporting = false
    export-reporting = ${?OTOROSHI_NEXT_EXPORT_REPORTING}
    monitor-proxy-state-size = false
    monitor-proxy-state-size = ${?OTOROSHI_NEXT_MONITOR_PROXY_STATE_SIZE}
    monitor-datastore-size = false
    monitor-datastore-size = ${?OTOROSHI_NEXT_MONITOR_DATASTORE_SIZE}
    plugins {
      merge-sync-steps = true
      merge-sync-steps = ${?OTOROSHI_NEXT_PLUGINS_MERGE_SYNC_STEPS}
      apply-legacy-checks = true
      apply-legacy-checks = ${?OTOROSHI_NEXT_PLUGINS_APPLY_LEGACY_CHECKS}
    }
    experimental {
    	netty-client {
    		wiretap = false
    		wiretap = ${?OTOROSHI_NEXT_EXPERIMENTAL_NETTY_CLIENT_WIRETAP}
    		enforce = false
    		enforce = ${?OTOROSHI_NEXT_EXPERIMENTAL_NETTY_CLIENT_ENFORCE}
    		enforce-akka = false
				enforce-akka = ${?OTOROSHI_NEXT_EXPERIMENTAL_NETTY_CLIENT_ENFORCE_AKKA}
    	}
   		netty-server {
   			enabled = false
   			enabled = ${?OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_ENABLED}
   			new-engine-only = false
   			new-engine-only = ${?OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_NEW_ENGINE_ONLY}
   			host = "0.0.0.0"
   			host = ${?OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_HOST}
   			http-port = 10049
   			http-port = ${?OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_HTTP_PORT}
   			exposed-http-port = ${?OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_EXPOSED_HTTP_PORT}
   			https-port = 10048
   			https-port = ${?OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_HTTPS_PORT}
				exposed-https-port = ${?OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_EXPOSED_HTTPS_PORT}
   			wiretap = false
   			wiretap = ${?OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_WIRETAP}
   			accesslog = false
   			accesslog = ${?OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_ACCESSLOG}
        threads = 0
        threads = ${?OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_THREADS}
   			parser {
   				allowDuplicateContentLengths = ${?OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_PARSER_ALLOW_DUPLICATE_CONTENT_LENGTHS}
          validateHeaders = ${?OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_PARSER_VALIDATE_HEADERS}
          h2cMaxContentLength = ${?OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_PARSER_H_2_C_MAX_CONTENT_LENGTH}
          initialBufferSize = ${?OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_PARSER_INITIAL_BUFFER_SIZE}
          maxHeaderSize = ${?OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_PARSER_MAX_HEADER_SIZE}
          maxInitialLineLength = ${?OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_PARSER_MAX_INITIAL_LINE_LENGTH}
          maxChunkSize = ${?OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_PARSER_MAX_CHUNK_SIZE}
   			}
   			http2 {
					enabled = true
					enabled = ${?OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_HTTP2_ENABLED}
					h2c = true
					h2c = ${?OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_HTTP2_H2C}
				}
   			http3 {
   				enabled = false
   				enabled = ${?OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_HTTP3_ENABLED}
   				port = 10048
   				port = ${?OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_HTTP3_PORT}
   				exposedPort = 10048
   				exposedPort = ${?OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_HTTP3_EXPOSED_PORT}
          initialMaxStreamsBidirectional = 100000
          initialMaxStreamsBidirectional = ${?OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_HTTP_3_INITIAL_MAX_STREAMS_BIDIRECTIONAL}
          initialMaxStreamDataBidirectionalRemote = 1000000
          initialMaxStreamDataBidirectionalRemote = ${?OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_HTTP_3_INITIAL_MAX_STREAM_DATA_BIDIRECTIONAL_REMOTE}
          initialMaxStreamDataBidirectionalLocal = 1000000
          initialMaxStreamDataBidirectionalLocal = ${?OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_HTTP_3_INITIAL_MAX_STREAM_DATA_BIDIRECTIONAL_LOCAL}
          initialMaxData = 10000000
          initialMaxData = ${?OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_HTTP_3_INITIAL_MAX_DATA}
          maxRecvUdpPayloadSize = 1500
          maxRecvUdpPayloadSize = ${?OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_HTTP_3_MAX_RECV_UDP_PAYLOAD_SIZE}
          maxSendUdpPayloadSize = 1500
          maxSendUdpPayloadSize = ${?OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_HTTP_3_MAX_SEND_UDP_PAYLOAD_SIZE}
          disableQpackDynamicTable = true
          disableQpackDynamicTable = ${?OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_HTTP_3_DISABLE_QPACK_DYNAMIC_TABLE}
   			}
   			native {
   				enabled = true
   				enabled = ${?OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_NATIVE_ENABLED}
   				driver = "Auto" # possible values are Auto, Epoll, KQueue, IOUring
   				driver = ${?OTOROSHI_NEXT_EXPERIMENTAL_NETTY_SERVER_NATIVE_DRIVER}
   			}
   		}
    }
  }
  options {
    jsonPathNullReadIsJsNull = false
    jsonPathNullReadIsJsNull = ${?OTOROSHI_OPTIONS_JSONPATHNULLREADISJSNULL}
    bypassUserRightsCheck = false
    bypassUserRightsCheck = ${?OTOROSHI_OPTIONS_BYPASSUSERRIGHTSCHECK}
    emptyContentLengthIsChunked = true
    emptyContentLengthIsChunked = ${?OTOROSHI_OPTIONS_EMPTYCONTENTLENGTHISCHUNKED}
    detectApiKeySooner = true
    detectApiKeySooner = ${?OTOROSHI_OPTIONS_DETECTAPIKEYSOONER}
    sendClientChainAsPem = false
    sendClientChainAsPem = ${?OTOROSHI_OPTIONS_SENDCLIENTCHAINASPEM}
    useOldHeadersComposition = false
    useOldHeadersComposition = ${?OTOROSHI_OPTIONS_USEOLDHEADERSCOMPOSITION}
    manualDnsResolve = true
    manualDnsResolve = ${?OTOROSHI_OPTIONS_MANUALDNSRESOLVE}
    useEventStreamForScriptEvents = true
    useEventStreamForScriptEvents = ${?OTOROSHI_OPTIONS_USEEVENTSTREAMFORSCRIPTEVENTS}
    trustXForwarded = true
    trustXForwarded = ${?OTOROSHI_OPTIONS_TRUST_XFORWARDED}
    disableFunnyLogos = false
    disableFunnyLogos = ${?OTOROSHI_OPTIONS_DISABLE_FUNNY_LOGOS}
    staticExposedDomain = ${?OTOROSHI_OPTIONS_STATIC_EXPOSED_DOMAIN}
    enable-json-media-type-with-open-charset = false # allow application/json media type with charset even if its not standard
    enable-json-media-type-with-open-charset = ${?OTOROSHI_OPTIONS_ENABLE_JSON_MEDIA_TYPE_WITH_OPEN_CHARSET}
    dynamicBodySizeCompute = true
    dynamicBodySizeCompute = ${?OTOROSHI_OPTIONS_DYNAMIC_BODY_SIZE_COMPUTE}
    allowRedirectQueryParamOnLogin = false
    allowRedirectQueryParamOnLogin = ${?OTOROSHI_OPTIONS_ALLOW_REDIRECT_QUERY_PARAM_ON_LOGIN}
    maxHeaderSizeToBackend = ${?OTOROSHI_OPTIONS_MAX_HEADER_SIZE_TO_BACKEND}
    maxHeaderSizeToClient = ${?OTOROSHI_OPTIONS_MAX_HEADER_SIZE_TO_CLIENT}
    limitHeaderSizeToBackend = ${?OTOROSHI_OPTIONS_LIMIT_HEADER_SIZE_TO_BACKEND}
    limitHeaderSizeToClient = ${?OTOROSHI_OPTIONS_LIMIT_HEADER_SIZE_TO_CLIENT}
    defaultPrettyAdminApi = true
    defaultPrettyAdminApi = ${?OTOROSHI_OPTIONS_DEFAULT_PRETTY_ADMIN_API}
  }
  wasm {
  	cache {
  		ttl = 10000
  		ttl = ${?OTOROSHI_WASM_CACHE_TTL}
  		size = 100
  		size = ${?OTOROSHI_WASM_CACHE_SIZE}
  	}
  	queue {
  		buffer {
  			size = 2048
  			size = ${?OTOROSHI_WASM_QUEUE_BUFFER_SIZE}
  		}
  	}
  }
  anonymous-reporting {
  	enabled = true
		enabled = ${?OTOROSHI_ANONYMOUS_REPORTING_ENABLED}
  	redirect = false
		url = ${?OTOROSHI_ANONYMOUS_REPORTING_REDIRECT}
  	url = "https://reporting.otoroshi.io/ingest"
  	url = ${?OTOROSHI_ANONYMOUS_REPORTING_URL}
  	timeout = 60000
  	timeout = ${?OTOROSHI_ANONYMOUS_REPORTING_TIMEOUT}
  	tls {
			# certs = []
			# trustedCerts = []
			enabled = false # enable mtls
			enabled = ${?OTOROSHI_ANONYMOUS_REPORTING_TLS_ENABLED}  # enable mtls
			loose = false # loose verification
			loose = ${?OTOROSHI_ANONYMOUS_REPORTING_TLS_LOOSE}  # loose verification
			trustAll = false # trust any CA
			trustAll = ${?OTOROSHI_ANONYMOUS_REPORTING_TLS_ALL} # trust any CA
		}
		proxy {
			enabled = false # enable proxy
			enabled = ${?OTOROSHI_ANONYMOUS_REPORTING_PROXY_ENABLED}  # enable proxy
			host = ${?OTOROSHI_ANONYMOUS_REPORTING_PROXY_HOST},
			port = ${?OTOROSHI_ANONYMOUS_REPORTING_PROXY_PORT},
			principal = ${?OTOROSHI_ANONYMOUS_REPORTING_PROXY_PRINCIPAL},
			password = ${?OTOROSHI_ANONYMOUS_REPORTING_PROXY_PASSWORD},
			ntlmDomain = ${?OTOROSHI_ANONYMOUS_REPORTING_PROXY_DOMAIN},
			encoding = ${?OTOROSHI_ANONYMOUS_REPORTING_PROXY_ENCODING},
		}
  }
  backoffice {
    flags {
      useAkkaHttpClient = false
      useAkkaHttpClient = ${?OTOROSHI_BACKOFFICE_FLAGS_USE_AKKA_HTTP_CLIENT}
      logUrl = false
      logUrl = ${?OTOROSHI_BACKOFFICE_FLAGS_LOG_URL}
      requestTimeout = 60000
      requestTimeout = ${?OTOROSHI_BACKOFFICE_FLAGS_REQUEST_TIMEOUT}
    }
  }
  sessions {
    secret = ${otoroshi.secret}
    secret = ${?OTOROSHI_SESSIONS_SECRET}
  }
  cache {
    enabled = false
    enabled = ${?USE_CACHE}
    enabled = ${?OTOROSHI_USE_CACHE}
    enabled = ${?OTOROSHI_ENTITIES_CACHE_ENABLED}
    ttl = 2000
    ttl = ${?OTOROSHI_ENTITIES_CACHE_TTL}
  }
  metrics {
    enabled = true
    enabled = ${?OTOROSHI_METRICS_ENABLED}
    every = 30000
    every = ${?OTOROSHI_METRICS_EVERY}
    accessKey = ${?app.health.accessKey}
    accessKey = ${?OTOROSHI_app.health.accessKey}
    accessKey = ${?OTOROSHI_METRICS_ACCESS_KEY}
  }
  plugins {
    packages = []
    packagesStr = ${?OTOROSHI_PLUGINS_SCAN_PACKAGES}
    print = false
    print = ${?OTOROSHI_PLUGINS_PRINT}
    blacklisted = []
    blacklistedStr = ${?OTOROSHI_PLUGINS_BACKLISTED}
  }
  scripts {
    enabled = true # enable scripts
    enabled = ${?OTOROSHI_SCRIPTS_ENABLED} # enable scripts
    static { # settings for statically enabled script/plugins
      enabled = false
      enabled = ${?OTOROSHI_SCRIPTS_STATIC_ENABLED}
      transformersRefs = []
      transformersRefsStr = ${?OTOROSHI_SCRIPTS_STATIC_TRANSFORMER_REFS}
      transformersConfig = {}
      transformersConfigStr= ${?OTOROSHI_SCRIPTS_STATIC_TRANSFORMER_CONFIG}
      validatorRefs = []
      validatorRefsStr = ${?OTOROSHI_SCRIPTS_STATIC_VALIDATOR_REFS}
      validatorConfig = {}
      validatorConfigStr = ${?OTOROSHI_SCRIPTS_STATIC_VALIDATOR_CONFIG}
      preRouteRefs = []
      preRouteRefsStr = ${?OTOROSHI_SCRIPTS_STATIC_PRE_ROUTE_REFS}
      preRouteConfig = {}
      preRouteConfigStr = ${?OTOROSHI_SCRIPTS_STATIC_PRE_ROUTE_CONFIG}
      sinkRefs = []
      sinkRefsStr = ${?OTOROSHI_SCRIPTS_STATIC_SINK_REFS}
      sinkConfig = {}
      sinkConfigStr = ${?OTOROSHI_SCRIPTS_STATIC_SINK_CONFIG}
      jobsRefs = []
      jobsRefsStr = ${?OTOROSHI_SCRIPTS_STATIC_JOBS_REFS}
      jobsConfig = {}
      jobsConfigStr = ${?OTOROSHI_SCRIPTS_STATIC_JOBS_CONFIG}
    }
  }
  tls = ${otoroshi.ssl}
  ssl {
    # the cipher suites used by otoroshi TLS termination
    cipherSuitesJDK11Plus = ["TLS_AES_256_GCM_SHA384", "TLS_AES_128_GCM_SHA256", "TLS_CHACHA20_POLY1305_SHA256", "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256", "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256", "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", "TLS_DHE_RSA_WITH_AES_256_GCM_SHA384", "TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256", "TLS_DHE_DSS_WITH_AES_256_GCM_SHA384", "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256", "TLS_DHE_DSS_WITH_AES_128_GCM_SHA256", "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384", "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384", "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256", "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256", "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256", "TLS_DHE_DSS_WITH_AES_256_CBC_SHA256", "TLS_DHE_RSA_WITH_AES_128_CBC_SHA256", "TLS_DHE_DSS_WITH_AES_128_CBC_SHA256", "TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384", "TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384", "TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256", "TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256", "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384", "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384", "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256", "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256", "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA", "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA", "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", "TLS_DHE_RSA_WITH_AES_256_CBC_SHA", "TLS_DHE_DSS_WITH_AES_256_CBC_SHA", "TLS_DHE_RSA_WITH_AES_128_CBC_SHA", "TLS_DHE_DSS_WITH_AES_128_CBC_SHA", "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA", "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA", "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA", "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA", "TLS_RSA_WITH_AES_256_GCM_SHA384", "TLS_RSA_WITH_AES_128_GCM_SHA256", "TLS_RSA_WITH_AES_256_CBC_SHA256", "TLS_RSA_WITH_AES_128_CBC_SHA256", "TLS_RSA_WITH_AES_256_CBC_SHA", "TLS_RSA_WITH_AES_128_CBC_SHA", "TLS_EMPTY_RENEGOTIATION_INFO_SCSV"]
    cipherSuitesJDK11 = ["TLS_AES_256_GCM_SHA384", "TLS_AES_128_GCM_SHA256", "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", "TLS_DHE_RSA_WITH_AES_256_GCM_SHA384", "TLS_DHE_DSS_WITH_AES_256_GCM_SHA384", "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256", "TLS_DHE_DSS_WITH_AES_128_GCM_SHA256", "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384", "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384", "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256", "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256", "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256", "TLS_DHE_DSS_WITH_AES_256_CBC_SHA256", "TLS_DHE_RSA_WITH_AES_128_CBC_SHA256", "TLS_DHE_DSS_WITH_AES_128_CBC_SHA256", "TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384", "TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384", "TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256", "TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256", "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384", "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384", "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256", "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256", "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA", "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA", "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", "TLS_DHE_RSA_WITH_AES_256_CBC_SHA", "TLS_DHE_DSS_WITH_AES_256_CBC_SHA", "TLS_DHE_RSA_WITH_AES_128_CBC_SHA", "TLS_DHE_DSS_WITH_AES_128_CBC_SHA", "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA", "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA", "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA", "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA", "TLS_RSA_WITH_AES_256_GCM_SHA384", "TLS_RSA_WITH_AES_128_GCM_SHA256", "TLS_RSA_WITH_AES_256_CBC_SHA256", "TLS_RSA_WITH_AES_128_CBC_SHA256", "TLS_RSA_WITH_AES_256_CBC_SHA", "TLS_RSA_WITH_AES_128_CBC_SHA", "TLS_EMPTY_RENEGOTIATION_INFO_SCSV"]
    cipherSuitesJDK8 = ["TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384", "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384", "TLS_RSA_WITH_AES_256_CBC_SHA256", "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384", "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384", "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256", "TLS_DHE_DSS_WITH_AES_256_CBC_SHA256", "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA", "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA", "TLS_RSA_WITH_AES_256_CBC_SHA", "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA", "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA", "TLS_DHE_RSA_WITH_AES_256_CBC_SHA", "TLS_DHE_DSS_WITH_AES_256_CBC_SHA", "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256", "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256", "TLS_RSA_WITH_AES_128_CBC_SHA256", "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256", "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256", "TLS_DHE_RSA_WITH_AES_128_CBC_SHA256", "TLS_DHE_DSS_WITH_AES_128_CBC_SHA256", "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", "TLS_RSA_WITH_AES_128_CBC_SHA", "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA", "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA", "TLS_DHE_RSA_WITH_AES_128_CBC_SHA", "TLS_DHE_DSS_WITH_AES_128_CBC_SHA", "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", "TLS_RSA_WITH_AES_256_GCM_SHA384", "TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384", "TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384", "TLS_DHE_RSA_WITH_AES_256_GCM_SHA384", "TLS_DHE_DSS_WITH_AES_256_GCM_SHA384", "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", "TLS_RSA_WITH_AES_128_GCM_SHA256", "TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256", "TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256", "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256", "TLS_DHE_DSS_WITH_AES_128_GCM_SHA256", "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA", "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA", "SSL_RSA_WITH_3DES_EDE_CBC_SHA", "TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA", "TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA", "SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA", "SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA", "TLS_EMPTY_RENEGOTIATION_INFO_SCSV"]
    # cipherSuites = ["TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA", "TLS_RSA_WITH_AES_128_GCM_SHA256", "TLS_RSA_WITH_AES_128_CBC_SHA", "TLS_RSA_WITH_AES_256_CBC_SHA", "TLS_AES_128_GCM_SHA256", "TLS_AES_256_GCM_SHA384"]
    cipherSuites = ${otoroshi.ssl.cipherSuitesJDK11}
    # the protocols used by otoroshi TLS termination
    protocolsJDK11 = ["TLSv1.3", "TLSv1.2", "TLSv1.1", "TLSv1"]
    protocolsJDK8 = ["SSLv2Hello", "TLSv1", "TLSv1.1", "TLSv1.2"]
    modernProtocols = ["TLSv1.3", "TLSv1.2"]
    protocols = ${otoroshi.ssl.modernProtocols}
    # the JDK cacert access
    cacert {
      path = "$JAVA_HOME/lib/security/cacerts"
      password = "changeit"
    }
    # the mtls mode
    fromOutside {
      clientAuth = "None"
      clientAuth = ${?SSL_OUTSIDE_CLIENT_AUTH}
      clientAuth = ${?OTOROSHI_SSL_OUTSIDE_CLIENT_AUTH}
      netty {
        clientAuth = ${?OTOROSHI_SSL_OUTSIDE_NETTY_CLIENT_AUTH}
      }
    }
    # the default trust mode
    trust {
      all = false
      all = ${?OTOROSHI_SSL_TRUST_ALL}
    }
    rootCa {
    	ca = ${?OTOROSHI_SSL_ROOTCA_CA}
    	cert = ${?OTOROSHI_SSL_ROOTCA_CERT}
    	key = ${?OTOROSHI_SSL_ROOTCA_KEY}
    	importCa = false
			importCa = ${?OTOROSHI_SSL_ROOTCA_IMPORTCA}
    }
    # some initial cacert access, useful to include non standard CA when starting
    initialCacert = ${?CLUSTER_WORKER_INITIAL_CACERT}
    initialCacert = ${?OTOROSHI_CLUSTER_WORKER_INITIAL_CACERT}
    initialCacert = ${?INITIAL_CACERT}
    initialCacert = ${?OTOROSHI_INITIAL_CACERT}
    initialCert = ${?CLUSTER_WORKER_INITIAL_CERT}
    initialCert = ${?OTOROSHI_CLUSTER_WORKER_INITIAL_CERT}
    initialCert = ${?INITIAL_CERT}
    initialCert = ${?OTOROSHI_INITIAL_CERT}
    initialCertKey = ${?CLUSTER_WORKER_INITIAL_CERT_KEY}
    initialCertKey = ${?OTOROSHI_CLUSTER_WORKER_INITIAL_CERT_KEY}
    initialCertKey = ${?INITIAL_CERT_KEY}
    initialCertKey = ${?OTOROSHI_INITIAL_CERT_KEY}
    initialCertImportCa = ${?OTOROSHI_INITIAL_CERT_IMPORTCA}
    # initialCerts = []
    genWildcardCert = true #not-used
    genWildcardCert = ${?OTOROSHI_SSL_GEN_WILDCARD_CERT} #not-used
  }
  cluster {
    mode = "off" # can be "off", "leader", "worker"
    mode = ${?CLUSTER_MODE} # can be "off", "leader", "worker"
    mode = ${?OTOROSHI_CLUSTER_MODE} # can be "off", "leader", "worker"
    compression = -1 # compression of the data sent between leader cluster and worker cluster. From -1 (disabled) to 9
    compression = ${?CLUSTER_COMPRESSION} # compression of the data sent between leader cluster and worker cluster. From -1 (disabled) to 9
    compression = ${?OTOROSHI_CLUSTER_COMPRESSION} # compression of the data sent between leader cluster and worker cluster. From -1 (disabled) to 9
    retryDelay = 300 # the delay before retrying a request to leader
    retryDelay = ${?CLUSTER_RETRY_DELAY} # the delay before retrying a request to leader
    retryDelay = ${?OTOROSHI_CLUSTER_RETRY_DELAY} # the delay before retrying a request to leader
    retryFactor = 2 # the retry factor to avoid high load on failing nodes
    retryFactor = ${?CLUSTER_RETRY_FACTOR} # the retry factor to avoid high load on failing nodes
    retryFactor = ${?OTOROSHI_CLUSTER_RETRY_FACTOR} # the retry factor to avoid high load on failing nodes
    selfAddress = ${?CLUSTER_SELF_ADDRESS} # the instance ip address
    selfAddress = ${?OTOROSHI_CLUSTER_SELF_ADDRESS} # the instance ip address
    autoUpdateState = true # auto update cluster state with a job (more efficient)
    autoUpdateState = ${?CLUSTER_AUTO_UPDATE_STATE} # auto update cluster state with a job (more efficient
    autoUpdateState = ${?OTOROSHI_CLUSTER_AUTO_UPDATE_STATE} # auto update cluster state with a job (more efficient
    backup {
      enabled = false
      enabled = ${?OTOROSHI_CLUSTER_BACKUP_ENABLED}
			kind = "S3"
			kind = ${?OTOROSHI_CLUSTER_BACKUP_KIND}
			instance {
				can-write = false
				can-write = ${?OTOROSHI_CLUSTER_BACKUP_INSTANCE_CAN_WRITE}
				can-read = false
				can-read = ${?OTOROSHI_CLUSTER_BACKUP_INSTANCE_CAN_READ}
			}
			s3 {
				bucket = ${?OTOROSHI_CLUSTER_BACKUP_S3_BUCKET}
        endpoint = ${?OTOROSHI_CLUSTER_BACKUP_S3_ENDPOINT}
        region = ${?OTOROSHI_CLUSTER_BACKUP_S3_REGION}
        access = ${?OTOROSHI_CLUSTER_BACKUP_S3_ACCESSKEY}
        secret = ${?OTOROSHI_CLUSTER_BACKUP_S3_SECRET}
        path = ${?OTOROSHI_CLUSTER_BACKUP_S3_PATH}
        chunk-size = ${?OTOROSHI_CLUSTER_BACKUP_S3_CHUNK_SIZE}
        v4auth = ${?OTOROSHI_CLUSTER_BACKUP_S3_V4AUTH}
        acl = ${?OTOROSHI_CLUSTER_BACKUP_S3_ACL}
			}
    }
    relay { # relay routing settings
      enabled = false # enable relay routing
      enabled = ${?OTOROSHI_CLUSTER_RELAY_ENABLED} # enable relay routing
      leaderOnly = false
      leaderOnly = ${?OTOROSHI_CLUSTER_RELAY_LEADER_ONLY} # workers always pass through leader for relay routing
      location {
        provider = ${?otoroshi.instance.provider}
        provider = ${?OTOROSHI_CLUSTER_RELAY_LOCATION_PROVIDER}
        provider = ${?app.instance.provider}
        zone = ${?otoroshi.instance.zone}
        zone = ${?OTOROSHI_CLUSTER_RELAY_LOCATION_ZONE}
        zone = ${?app.instance.zone}
        region = ${?otoroshi.instance.region}
        region = ${?OTOROSHI_CLUSTER_RELAY_LOCATION_REGION}
        region = ${?app.instance.region}
        datacenter = ${?otoroshi.instance.dc}
        datacenter = ${?OTOROSHI_CLUSTER_RELAY_LOCATION_DATACENTER}
        datacenter = ${?app.instance.dc}
        rack = ${?otoroshi.instance.rack}
        rack = ${?OTOROSHI_CLUSTER_RELAY_LOCATION_RACK}
        rack = ${?app.instance.rack}
      }
      exposition {
        url = ${?OTOROSHI_CLUSTER_RELAY_EXPOSITION_URL}
        urls = []
        urlsStr = ${?OTOROSHI_CLUSTER_RELAY_EXPOSITION_URLS}
        hostname = "otoroshi-api.oto.tools"
        hostname = ${?OTOROSHI_CLUSTER_RELAY_EXPOSITION_HOSTNAME}
        clientId = ${?OTOROSHI_CLUSTER_RELAY_EXPOSITION_CLIENT_ID}
        clientSecret = ${?OTOROSHI_CLUSTER_RELAY_EXPOSITION_CLIENT_SECRET}
        ipAddress = ${?OTOROSHI_CLUSTER_RELAY_EXPOSITION_IP_ADDRESS}
      }
    }
    mtls {
      # certs = []
      # trustedCerts = []
      enabled = false # enable mtls
      enabled = ${?CLUSTER_MTLS_ENABLED}  # enable mtls
      enabled = ${?OTOROSHI_CLUSTER_MTLS_ENABLED}  # enable mtls
      loose = false # loose verification
      loose = ${?CLUSTER_MTLS_LOOSE}  # loose verification
      loose = ${?OTOROSHI_CLUSTER_MTLS_LOOSE}  # loose verification
      trustAll = false # trust any CA
      trustAll = ${?CLUSTER_MTLS_TRUST_ALL} # trust any CA
      trustAll = ${?OTOROSHI_CLUSTER_MTLS_TRUST_ALL} # trust any CA
    }
    proxy {
     	enabled = false # enable proxy
			enabled = ${?CLUSTER_PROXY_ENABLED}  # enable proxy
			host = ${?CLUSTER_PROXY_HOST},
			port = ${?CLUSTER_PROXY_PORT},
			principal = ${?CLUSTER_PROXY_PRINCIPAL},
			password = ${?CLUSTER_PROXY_PASSWORD},
			ntlmDomain = ${?CLUSTER_PROXY_NTLM_DOMAIN},
			encoding = ${?CLUSTER_PROXY_ENCODING},
    }
    leader {
      name = ${?CLUSTER_LEADER_NAME} # the leader name
      name = ${?OTOROSHI_CLUSTER_LEADER_NAME} # the leader name
      urls = ["http://127.0.0.1:8080"] # the leader urls
      urlsStr = ${?CLUSTER_LEADER_URLS} # the leader urls
      urlsStr = ${?OTOROSHI_CLUSTER_LEADER_URLS} # the leader urls
      url = ${?CLUSTER_LEADER_URL} # the leader url
      url = ${?OTOROSHI_CLUSTER_LEADER_URL} # the leader url
      host = "otoroshi-api.oto.tools" # the leaders api hostname
      host = ${?CLUSTER_LEADER_HOST} # the leaders api hostname
      host = ${?OTOROSHI_CLUSTER_LEADER_HOST} # the leaders api hostname
      clientId = "admin-api-apikey-id" # the leaders apikey id to access otoroshi admin api
      clientId = ${?CLUSTER_LEADER_CLIENT_ID} # the leaders apikey id to access otoroshi admin api
      clientId = ${?OTOROSHI_CLUSTER_LEADER_CLIENT_ID} # the leaders apikey id to access otoroshi admin api
      clientSecret = "admin-api-apikey-secret" # the leaders apikey secret to access otoroshi admin api
      clientSecret = ${?CLUSTER_LEADER_CLIENT_SECRET} # the leaders apikey secret to access otoroshi admin api
      clientSecret = ${?OTOROSHI_CLUSTER_LEADER_CLIENT_SECRET} # the leaders apikey secret to access otoroshi admin api
      groupingBy = 50 # items grouping when streaming state
      groupingBy = ${?CLUSTER_LEADER_GROUP_BY} # items grouping when streaming state
      groupingBy = ${?OTOROSHI_CLUSTER_LEADER_GROUP_BY} # items grouping when streaming state
      cacheStateFor = 10000 # the ttl for local state cache
      cacheStateFor = ${?CLUSTER_LEADER_CACHE_STATE_FOR} # the ttl for local state cache
      cacheStateFor = ${?OTOROSHI_CLUSTER_LEADER_CACHE_STATE_FOR} # the ttl for local state cache
      stateDumpPath = ${?CLUSTER_LEADER_DUMP_PATH} # eventually a dump state path for debugging purpose
      stateDumpPath = ${?OTOROSHI_CLUSTER_LEADER_DUMP_PATH} # eventually a dump state path for debugging purpose
    }
    worker {
      name = ${?CLUSTER_WORKER_NAME} # the workers name
      name = ${?OTOROSHI_CLUSTER_WORKER_NAME} # the workers name
      retries = 3 # the number of retries when pushing quotas/pulling state
      retries = ${?CLUSTER_WORKER_RETRIES} # the number of retries when pushing quotas/pulling state
      retries = ${?OTOROSHI_CLUSTER_WORKER_RETRIES} # the number of retries when pushing quotas/pulling state
      timeout = 10000 # the workers timeout when interacting with leaders
      timeout = ${?CLUSTER_WORKER_TIMEOUT} # the workers timeout when interacting with leaders
      timeout = ${?OTOROSHI_CLUSTER_WORKER_TIMEOUT} # the workers timeout when interacting with leaders
      tenants = [] # the list of organization served by this worker. If none, it's all
      tenantsStr = ${?CLUSTER_WORKER_TENANTS} # the list (coma separated) of organization served by this worker. If none, it's all
      tenantsStr = ${?OTOROSHI_CLUSTER_WORKER_TENANTS} # the list (coma separated) of organization served by this worker. If none, it's all
      dbpath = ${?CLUSTER_WORKER_DB_PATH} # state dump path for debugging purpose
      dbpath = ${?OTOROSHI_CLUSTER_WORKER_DB_PATH} # state dump path for debugging purpose
      dataStaleAfter = 600000 # the amount of time needed to consider state is stale
      dataStaleAfter = ${?CLUSTER_WORKER_DATA_STALE_AFTER} # the amount of time needed to consider state is stale
      dataStaleAfter = ${?OTOROSHI_CLUSTER_WORKER_DATA_STALE_AFTER} # the amount of time needed to consider state is stale
      swapStrategy = "Merge" # the internal memory store strategy, can be Replace or Merge
      swapStrategy = ${?CLUSTER_WORKER_SWAP_STRATEGY} # the internal memory store strategy, can be Replace or Merge
      swapStrategy = ${?OTOROSHI_CLUSTER_WORKER_SWAP_STRATEGY} # the internal memory store strategy, can be Replace or Merge
      modern = false # use a modern store implementation
      modern = ${?CLUSTER_WORKER_STORE_MODERN}
      modern = ${?OTOROSHI_CLUSTER_WORKER_STORE_MODERN}
      useWs = false
      useWs = ${?CLUSTER_WORKER_USE_WS}
      useWs = ${?OTOROSHI_CLUSTER_WORKER_USE_WS}
      state {
        retries = ${otoroshi.cluster.worker.retries} # the number of retries when pulling state
        retries = ${?CLUSTER_WORKER_STATE_RETRIES} # the number of retries when pulling state
        retries = ${?OTOROSHI_CLUSTER_WORKER_STATE_RETRIES} # the number of retries when pulling state
        pollEvery = 10000 # polling interval
        pollEvery = ${?CLUSTER_WORKER_POLL_EVERY} # polling interval
        pollEvery = ${?OTOROSHI_CLUSTER_WORKER_POLL_EVERY} # polling interval
        timeout = ${otoroshi.cluster.worker.timeout} # the workers timeout when polling state
        timeout = ${?CLUSTER_WORKER_POLL_TIMEOUT} # the workers timeout when polling state
        timeout = ${?OTOROSHI_CLUSTER_WORKER_POLL_TIMEOUT} # the workers timeout when polling state
      }
      quotas {
        retries = ${otoroshi.cluster.worker.retries} # the number of retries when pushing quotas
        retries = ${?CLUSTER_WORKER_QUOTAS_RETRIES} # the number of retries when pushing quotas
        retries = ${?OTOROSHI_CLUSTER_WORKER_QUOTAS_RETRIES} # the number of retries when pushing quotas
        pushEvery = 10000 # pushing interval
        pushEvery = ${?CLUSTER_WORKER_PUSH_EVERY} # pushing interval
        pushEvery = ${?OTOROSHI_CLUSTER_WORKER_PUSH_EVERY} # pushing interval
        timeout = ${otoroshi.cluster.worker.timeout} # the workers timeout when pushing quotas
        timeout = ${?CLUSTER_WORKER_PUSH_TIMEOUT} # the workers timeout when pushing quotas
        timeout = ${?OTOROSHI_CLUSTER_WORKER_PUSH_TIMEOUT} # the workers timeout when pushing quotas
      }
    }
    analytics { # settings for the analytics actor system which is separated from otoroshi default one for performance reasons
      pressure {
        enabled = true
        enabled = ${?OTOROSHI_ANALYTICS_PRESSURE_ENABLED}
      }
      actorsystem {
        akka {
          version = ${akka.version}
          log-dead-letters-during-shutdown = false
          jvm-exit-on-fatal-error = false
          default-dispatcher {
            type = Dispatcher
            executor = "fork-join-executor"
            fork-join-executor {
              parallelism-factor = 4.0
              parallelism-min = 4
              parallelism-max = 64
              task-peeking-mode = "FIFO"
            }
            throughput = 1
          }
          # http {
          #   parsing {
          #     max-uri-length             = 4k
          #     max-method-length          = 16
          #     max-response-reason-length = 64
          #     max-header-name-length     = 128
          #     max-header-value-length    = 16k
          #     max-header-count           = 128
          #     max-chunk-ext-length       = 256
          #     max-chunk-size             = 256m
          #     max-chunk-size             = ${?AKKA_HTTP_CLIENT_ANALYTICS_MAX_CHUNK_SIZE}
          #     max-chunk-size             = ${?OTOROSHI_AKKA_HTTP_CLIENT_ANALYTICS_MAX_CHUNK_SIZE}
          #     max-content-length         = infinite
          #     max-content-length         = ${?AKKA_HTTP_CLIENT_ANALYTICS_MAX_CONTENT_LENGHT}
          #     max-content-length         = ${?OTOROSHI_AKKA_HTTP_CLIENT_ANALYTICS_MAX_CONTENT_LENGHT}
          #     max-to-strict-bytes        = infinite
          #     max-to-strict-bytes        = ${?AKKA_HTTP_CLIENT_ANALYTICS_MAX_TO_STRICT_BYTES}
          #     max-to-strict-bytes        = ${?OTOROSHI_AKKA_HTTP_CLIENT_ANALYTICS_MAX_TO_STRICT_BYTES}
          #   }
          # }
        }
      }
    }
  }
  headers { # the default headers value for specific otoroshi headers
    trace.label = "Otoroshi-Viz-From-Label"
    trace.from = "Otoroshi-Viz-From"
    trace.parent = "Otoroshi-Parent-Request"
    request.adminprofile = "Otoroshi-Admin-Profile"
    request.simpleapiclientid = "x-api-key"
    request.clientid = "Otoroshi-Client-Id"
    request.clientsecret = "Otoroshi-Client-Secret"
    request.id = "Otoroshi-Request-Id"
    request.timestamp = "Otoroshi-Request-Timestamp"
    request.bearer = "Otoroshi-Token"
    request.authorization = "Otoroshi-Authorization"
    response.proxyhost = "Otoroshi-Proxied-Host"
    response.error = "Otoroshi-Error"
    response.errormsg = "Otoroshi-Error-Msg"
    response.errorcause = "Otoroshi-Error-Cause"
    response.proxylatency = "Otoroshi-Proxy-Latency"
    response.upstreamlatency = "Otoroshi-Upstream-Latency"
    response.dailyquota = "Otoroshi-Daily-Calls-Remaining"
    response.monthlyquota = "Otoroshi-Monthly-Calls-Remaining"
    comm.state = "Otoroshi-State"
    comm.stateresp = "Otoroshi-State-Resp"
    comm.claim = "Otoroshi-Claim"
    healthcheck.test = "Otoroshi-Health-Check-Logic-Test"
    healthcheck.testresult = "Otoroshi-Health-Check-Logic-Test-Result"
    jwt.issuer = "Otoroshi"
    canary.tracker = "Otoroshi-Canary-Id"
    client.cert.chain = "Otoroshi-Client-Cert-Chain"

    request.jwtAuthorization = "access_token"
    request.bearerAuthorization = "bearer_auth"
    request.basicAuthorization = "basic_auth"
  }
  requests {
    validate = true
    validate = ${?OTOROSHI_REQUESTS_VALIDATE}
    maxUrlLength = ${akka.http.parsing.max-uri-length}
    maxCookieLength = ${akka.http.parsing.max-header-value-length}
    maxHeaderNameLength = ${akka.http.parsing.max-header-name-length}
    maxHeaderValueLength = ${akka.http.parsing.max-header-value-length}
  }
  jmx {
    enabled = false
    enabled = ${?OTOROSHI_JMX_ENABLED}
    port = 16000
    port = ${?OTOROSHI_JMX_PORT}
  }
  loggers {
  }
  provider {
    dashboardUrl = ${?OTOROSHI_PROVIDER_DASHBOARD_URL}
    jsUrl = ${?OTOROSHI_PROVIDER_JS_URL}
    cssUrl = ${?OTOROSHI_PROVIDER_CSS_URL}
    secret = "secret"
    secret = ${?OTOROSHI_PROVIDER_SECRET}
    title = "Provider's dashboard"
    title = ${?OTOROSHI_PROVIDER_TITLE}
  }
  healthcheck {
    workers = 4
    workers = ${?OTOROSHI_HEALTHCHECK_WORKERS}
    block-on-red = false
    block-on-red = ${?OTOROSHI_HEALTHCHECK_BLOCK_ON_RED}
    block-on-red = ${?OTOROSHI_HEALTHCHECK_BLOCK_ON_500}
    ttl = 60000
    ttl = ${?OTOROSHI_HEALTHCHECK_TTL}
    ttl-only = true
    ttl-only = ${?OTOROSHI_HEALTHCHECK_TTL_ONLY}
  }
  vaults {
    enabled = true
    enabled = ${?OTOROSHI_VAULTS_ENABLED}
    secrets-ttl = 300000 # 5 minutes between each secret read
    secrets-ttl = ${?OTOROSHI_VAULTS_SECRETS_TTL}
    secrets-error-ttl = 20000 # wait 20000 before retrying on error
    secrets-error-ttl = ${?OTOROSHI_VAULTS_SECRETS_ERROR_TTL}
    cached-secrets = 10000
    cached-secrets = ${?OTOROSHI_VAULTS_CACHED_SECRETS}
		read-ttl = 10000 # 10 seconds
    read-timeout = ${?otoroshi.vaults.read-ttl}
		read-timeout = ${?OTOROSHI_VAULTS_READ_TTL}
		read-timeout = ${?OTOROSHI_VAULTS_READ_TIMEOUT}
    parallel-fetchs = 4
    parallel-fetchs = ${?OTOROSHI_VAULTS_PARALLEL_FETCHS}
    # if enabled, only leader nodes fetches the secrets.
    # entities with secret values filled are then sent to workers when they poll the cluster state.
    # only works if `otoroshi.cluster.autoUpdateState=true`
    leader-fetch-only = false
    leader-fetch-only = ${?OTOROSHI_VAULTS_LEADER_FETCH_ONLY}
    env {
      type = "env"
      prefix = ${?OTOROSHI_VAULTS_ENV_PREFIX}
    }
    local {
    	type = "local"
    	root = ${?OTOROSHI_VAULTS_LOCAL_ROOT}
    }
    # hashicorpvault {
    #   type = "hashicorp-vault"
    #   url = "http://127.0.0.1:8200"
    #   mount = "kv"
    #   kv = "v2"
    #   token = "root"
    # }
  }
  tunnels {
    enabled = true
    enabled = ${?OTOROSHI_TUNNELS_ENABLED}
    worker-ws = true
    worker-ws = ${?OTOROSHI_TUNNELS_WORKER_WS}
    worker-use-internal-ports = false
    worker-use-internal-ports = ${?OTOROSHI_TUNNELS_WORKER_USE_INTERNAL_PORTS}
    worker-use-loadbalancing = false
    worker-use-loadbalancing = ${?OTOROSHI_TUNNELS_WORKER_USE_LOADBALANCING}
    default {
      enabled = false
      enabled = ${?OTOROSHI_TUNNELS_DEFAULT_ENABLED}
      id = "default"
      id = ${?OTOROSHI_TUNNELS_DEFAULT_ID}
      name = "default"
      name = ${?OTOROSHI_TUNNELS_DEFAULT_NAME}
			url = "http://127.0.0.1:8080"
			url = ${?OTOROSHI_TUNNELS_DEFAULT_URL}
			host = "otoroshi-api.oto.tools"
			host = ${?OTOROSHI_TUNNELS_DEFAULT_HOST}
			clientId = "admin-api-apikey-id"
			clientId = ${?OTOROSHI_TUNNELS_DEFAULT_CLIENT_ID}
			clientSecret = "admin-api-apikey-secret"
			clientSecret = ${?OTOROSHI_TUNNELS_DEFAULT_CLIENT_SECRET}
			export-routes = true # send routes information to remote otoroshi instance to facilitate remote route exposition
			export-routes = ${?OTOROSHI_TUNNELS_DEFAULT_EXPORT_ROUTES} # send routes information to remote otoroshi instance to facilitate remote route exposition
			export-routes-tag = ${?OTOROSHI_TUNNELS_DEFAULT_EXPORT_TAG} # only send routes information if the route has this tag
      proxy {
        enabled = false
        host = none
        port = none
        principal = none
        password = none
        nonProxyHosts = []
      }
    }
  }
  admin-extensions {
  	enabled = true
  	enabled = ${?OTOROSHI_ADMIN_EXTENSIONS_ENABLED}
  	configurations {
  		otoroshi_extensions_foo {
  			enabled = false
  		}
      otoroshi_extensions_greenscore {
        enabled = false
        enabled = ${?OTOROSHI_ADMIN_EXTENSIONS_GREENSCORE_ENABLED}
      }
      otoroshi_extensions_httplisteners {
        enabled = true
        enabled = ${?OTOROSHI_ADMIN_EXTENSIONS_HTTPLISTENERS_ENABLED}
        listeners = ${?otoroshi.http-listeners}
        listeners_json = ${?otoroshi.http-listeners}
        listeners_json = ${?OTOROSHI_ADMIN_EXTENSIONS_HTTPLISTENERS_LISTENERS}
      }
  	}
  }
  http-listeners = []
  http-listeners-json = ${?OTOROSHI_HTTP_LISTENERS}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy