Fonoster
Fonoster is an open-source alternative to Twilio. A complete telephony stack for building voice applications with SIP, WebRTC, and PSTN connectivity.
Configuration
services:
dashboard:
image: fonoster/dashboard:0.15.15
restart: unless-stopped
ports:
- 3030
environment:
- SERVER_DASHBOARD_SESSION_SECRET=${SERVER_DASHBOARD_SESSION_SECRET}
apiserver:
image: fonoster/apiserver:0.15.15
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
environment:
- APISERVER_APP_URL=${APISERVER_APP_URL}
- APISERVER_ASTERISK_ARI_PROXY_URL=${APISERVER_ASTERISK_ARI_PROXY_URL}
- APISERVER_ASTERISK_ARI_SECRET=${APISERVER_ASTERISK_ARI_SECRET}
- APISERVER_ASTERISK_ARI_USERNAME=${APISERVER_ASTERISK_ARI_USERNAME}
- APISERVER_AUTHZ_SERVICE_ENABLED=${APISERVER_AUTHZ_SERVICE_ENABLED}
- APISERVER_AUTHZ_SERVICE_HOST=${APISERVER_AUTHZ_SERVICE_HOST}
- APISERVER_AUTHZ_SERVICE_METHODS=${APISERVER_AUTHZ_SERVICE_METHODS}
- APISERVER_AUTHZ_SERVICE_PORT=${APISERVER_AUTHZ_SERVICE_PORT}
- APISERVER_CLOAK_ENCRYPTION_KEY=${APISERVER_CLOAK_ENCRYPTION_KEY}
- APISERVER_DATABASE_URL=${APISERVER_DATABASE_URL}
- APISERVER_IDENTITY_DATABASE_URL=${APISERVER_IDENTITY_DATABASE_URL}
- APISERVER_IDENTITY_ISSUER=${APISERVER_IDENTITY_ISSUER}
- APISERVER_IDENTITY_CONTACT_VERIFICATION_REQUIRED=${APISERVER_IDENTITY_CONTACT_VERIFICATION_REQUIRED}
- APISERVER_IDENTITY_TWO_FACTOR_AUTHENTICATION_REQUIRED=${APISERVER_IDENTITY_TWO_FACTOR_AUTHENTICATION_REQUIRED}
- APISERVER_IDENTITY_WORKSPACE_INVITE_EXPIRATION=${APISERVER_IDENTITY_WORKSPACE_INVITE_EXPIRATION}
- APISERVER_IDENTITY_WORKSPACE_INVITE_FAIL_URL=${APISERVER_IDENTITY_WORKSPACE_INVITE_FAIL_URL}
- APISERVER_IDENTITY_WORKSPACE_INVITE_URL=${APISERVER_IDENTITY_WORKSPACE_INVITE_URL}
- APISERVER_IDENTITY_OAUTH2_GITHUB_CLIENT_ID=${APISERVER_IDENTITY_OAUTH2_GITHUB_CLIENT_ID}
- APISERVER_IDENTITY_OAUTH2_GITHUB_CLIENT_SECRET=${APISERVER_IDENTITY_OAUTH2_GITHUB_CLIENT_SECRET}
- APISERVER_IDENTITY_OAUTH2_GITHUB_ENABLED=${APISERVER_IDENTITY_OAUTH2_GITHUB_ENABLED}
- APISERVER_INFLUXDB_INIT_ORG=${APISERVER_INFLUXDB_INIT_ORG}
- APISERVER_INFLUXDB_INIT_PASSWORD=${APISERVER_INFLUXDB_INIT_PASSWORD}
- APISERVER_INFLUXDB_INIT_TOKEN=${APISERVER_INFLUXDB_INIT_TOKEN}
- APISERVER_INFLUXDB_INIT_USERNAME=${APISERVER_INFLUXDB_INIT_USERNAME}
- APISERVER_INFLUXDB_URL=${APISERVER_INFLUXDB_URL}
- APISERVER_LOGS_FORMAT=${APISERVER_LOGS_FORMAT}
- APISERVER_LOGS_LEVEL=${APISERVER_LOGS_LEVEL}
- APISERVER_LOGS_TRANSPORT=${APISERVER_LOGS_TRANSPORT}
- APISERVER_NATS_URL=${APISERVER_NATS_URL}
- APISERVER_OWNER_EMAIL=${APISERVER_OWNER_EMAIL}
- APISERVER_OWNER_NAME=${APISERVER_OWNER_NAME}
- APISERVER_OWNER_PASSWORD=${APISERVER_OWNER_PASSWORD}
- APISERVER_ROOT_DOMAIN=${APISERVER_ROOT_DOMAIN}
- APISERVER_SMTP_AUTH_PASS=${APISERVER_SMTP_AUTH_PASS}
- APISERVER_SMTP_AUTH_USER=${APISERVER_SMTP_AUTH_USER}
- APISERVER_SMTP_HOST=${APISERVER_SMTP_HOST}
- APISERVER_SMTP_PORT=${APISERVER_SMTP_PORT}
- APISERVER_SMTP_SECURE=${APISERVER_SMTP_SECURE}
- APISERVER_SMTP_SENDER=${APISERVER_SMTP_SENDER}
- APISERVER_SIGNALING_SERVER=${APISERVER_SIGNALING_SERVER}
- APISERVER_TWILIO_ACCOUNT_SID=${APISERVER_TWILIO_ACCOUNT_SID}
- APISERVER_TWILIO_AUTH_TOKEN=${APISERVER_TWILIO_AUTH_TOKEN}
- APISERVER_TWILIO_PHONE_NUMBER=${APISERVER_TWILIO_PHONE_NUMBER}
expose:
- 50051
volumes:
- ../files/config/keys:/opt/fonoster/keys:ro
- ../files/config/integrations.json:/opt/fonoster/integrations.json:ro
autopilot:
image: fonoster/autopilot:0.15.15
restart: unless-stopped
expose:
- 50061
environment:
- AUTOPILOT_AWS_S3_ACCESS_KEY_ID=${AUTOPILOT_AWS_S3_ACCESS_KEY_ID}
- AUTOPILOT_AWS_S3_ENDPOINT=${AUTOPILOT_AWS_S3_ENDPOINT}
- AUTOPILOT_AWS_S3_REGION=${AUTOPILOT_AWS_S3_REGION}
- AUTOPILOT_AWS_S3_SECRET_ACCESS_KEY=${AUTOPILOT_AWS_S3_SECRET_ACCESS_KEY}
- AUTOPILOT_CONVERSATION_PROVIDER=${AUTOPILOT_CONVERSATION_PROVIDER}
- AUTOPILOT_KNOWLEDGE_BASE_ENABLED=${AUTOPILOT_KNOWLEDGE_BASE_ENABLED}
- AUTOPILOT_LOGS_FORMAT=${AUTOPILOT_LOGS_FORMAT}
- AUTOPILOT_LOGS_LEVEL=${AUTOPILOT_LOGS_LEVEL}
- AUTOPILOT_LOGS_TRANSPORT=${AUTOPILOT_LOGS_TRANSPORT}
- AUTOPILOT_OPENAI_API_KEY=${AUTOPILOT_OPENAI_API_KEY}
- AUTOPILOT_UNSTRUCTURED_API_KEY=${AUTOPILOT_UNSTRUCTURED_API_KEY}
- AUTOPILOT_UNSTRUCTURED_API_URL=${AUTOPILOT_UNSTRUCTURED_API_URL}
volumes:
- ../files/config/integrations.json:/opt/fonoster/integrations.json:ro
routr:
image: fonoster/routr-one:2.13.13
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
environment:
DATABASE_URL: ${ROUTR_DATABASE_URL}
EXTERNAL_ADDRS: ${ROUTR_EXTERNAL_ADDRS}
LOGS_FORMAT: ${ROUTR_LOGS_FORMAT}
LOGS_LEVEL: ${ROUTR_LOGS_LEVEL}
LOGS_TRANSPORT: ${ROUTR_LOGS_TRANSPORT}
NATS_PUBLISHER_ENABLED: "true"
NATS_PUBLISHER_URL: ${ROUTR_NATS_PUBLISHER_URL}
RTPENGINE_HOST: ${ROUTR_RTPENGINE_HOST}
START_INTERNAL_DB: "false"
CONNECT_VERIFIER_PUBLIC_KEY_PATH: /etc/routr/keys/public.pem
expose:
- 51907
- 51908
ports:
- 5060:5060/udp
- 5060-5063:5060-5063
volumes:
- ../files/config/keys/public.pem:/etc/routr/keys/public.pem
# RTPEngine uses a range of ports to handle RTP traffic. Because exposing a large range of ports
# is not possible in Docker, we need to use network_mode: host.
#
# Unfortunately, network_mode: host is not supported for Windows or Mac.
# In those cases, we need to use a different approach.
#
# By default we are opening a small range of ports (10000-10100) to handle RTP traffic.
# However, this is not enough for production environments.
#
# We recommend that when using Linux you use network_mode: host and remove the ports section.
rtpengine:
image: fonoster/rtpengine:0.3.17
restart: unless-stopped
platform: linux/x86_64
ports:
- 10000-10100:10000-10100/udp
- 8080:8080
environment:
PORT_MAX: ${RTPENGINE_PORT_MAX}
PORT_MIN: ${RTPENGINE_PORT_MIN}
PUBLIC_IP: ${RTPENGINE_PUBLIC_IP}
asterisk:
image: fonoster/asterisk:20
restart: unless-stopped
environment:
ARI_PROXY_URL: ${ASTERISK_ARI_PROXY_URL}
ARI_SECRET: ${ASTERISK_ARI_SECRET}
ARI_USERNAME: ${ASTERISK_ARI_USERNAME}
CODECS: ${ASTERISK_CODECS}
DTMF_MODE: ${ASTERISK_DTMF_MODE}
RTP_PORT_END: ${ASTERISK_RTP_PORT_END}
RTP_PORT_START: ${ASTERISK_RTP_PORT_START}
SIPPROXY_HOST: ${ASTERISK_SIPPROXY_HOST}
SIPPROXY_PORT: ${ASTERISK_SIPPROXY_PORT}
SIPPROXY_SECRET: ${ASTERISK_SIPPROXY_SECRET}
SIPPROXY_USERNAME: ${ASTERISK_SIPPROXY_USERNAME}
expose:
- 6060
postgres:
image: postgres:16.10-alpine3.22
restart: unless-stopped
environment:
PGTZ: UTC
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_DB: ${POSTGRES_DB}
TZ: UTC
expose:
- 5432
volumes:
- db:/var/lib/postgresql/data
- ../files/config/init-db.sh:/docker-entrypoint-initdb.d/init-db.sh:ro
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 5s
timeout: 5s
retries: 10
influxdb:
image: influxdb:2.7
restart: unless-stopped
expose:
- 8086
environment:
DOCKER_INFLUXDB_INIT_ADMIN_TOKEN: ${INFLUXDB_INIT_TOKEN}
DOCKER_INFLUXDB_INIT_BUCKET: calls
DOCKER_INFLUXDB_INIT_MODE: setup
DOCKER_INFLUXDB_INIT_ORG: ${INFLUXDB_INIT_ORG}
DOCKER_INFLUXDB_INIT_PASSWORD: ${INFLUXDB_INIT_PASSWORD}
DOCKER_INFLUXDB_INIT_USERNAME: ${INFLUXDB_INIT_USERNAME}
volumes:
- influxdb:/var/lib/influxdb2
nats:
image: nats:2.11.8
restart: unless-stopped
expose:
- 4222
envoy:
image: envoyproxy/envoy:v1.35.0
restart: unless-stopped
command: ["/usr/local/bin/envoy", "-c", "/etc/envoy/envoy.yaml"]
volumes:
- ../files/config:/etc/envoy:ro
ports:
- 8449:8449
volumes:
db:
influxdb:[variables]
main_domain = "${domain}"
# Critical: Set these to your host machine's IP address
# For cloud deployments, use the public IP of your server
# For local deployments, use your local machine's IP
host_ip = "CHANGE_ME_TO_HOST_IP"
# Secrets - auto-generated strong passwords
dashboard_session_secret = "${password:64}"
ari_secret = "${password:32}"
asterisk_ari_secret = "${password:32}"
asterisk_sipproxy_secret = "${password:32}"
postgres_password = "${password:32}"
influxdb_password = "${password:32}"
influxdb_token = "${password:64}"
cloak_encryption_key = "${base64:32}"
# Database credentials
postgres_user = "postgres"
postgres_db_fonoster = "fonoster"
postgres_db_identity = "fnidentity"
postgres_db_routr = "routr"
# API Server Configuration
api_server_app_url = "https://${main_domain}"
api_server_root_domain = "${main_domain}"
api_server_owner_email = "admin@${main_domain}"
api_server_owner_name = "Admin User"
api_server_owner_password = "${password:32}"
# InfluxDB Configuration
influxdb_init_org = "fonoster"
influxdb_init_username = "influxdb"
# Asterisk Configuration
asterisk_codecs = "g722,ulaw,alaw"
asterisk_dtmf_mode = "auto_info"
asterisk_rtp_port_start = "10000"
asterisk_rtp_port_end = "20000"
asterisk_sipproxy_port = "5060"
asterisk_sipproxy_username = "voice"
# RTP Engine Configuration
rtpengine_port_min = "10000"
rtpengine_port_max = "20000"
# Routr Configuration
routr_nats_publisher_url = "nats://nats:4222"
# Logging Configuration
logs_format = "json"
logs_level = "verbose"
logs_transport = "none"
[config]
env = [
# Dashboard
"SERVER_DASHBOARD_SESSION_SECRET=${dashboard_session_secret}",
# API Server - Core
"APISERVER_APP_URL=${api_server_app_url}",
"APISERVER_ROOT_DOMAIN=${api_server_root_domain}",
"APISERVER_OWNER_EMAIL=${api_server_owner_email}",
"APISERVER_OWNER_NAME=${api_server_owner_name}",
"APISERVER_OWNER_PASSWORD=${api_server_owner_password}",
# API Server - Database
"APISERVER_DATABASE_URL=postgresql://${postgres_user}:${postgres_password}@postgres:5432/${postgres_db_fonoster}",
"APISERVER_IDENTITY_DATABASE_URL=postgresql://${postgres_user}:${postgres_password}@postgres:5432/${postgres_db_identity}",
# API Server - Asterisk ARI
"APISERVER_ASTERISK_ARI_PROXY_URL=http://asterisk:8088",
"APISERVER_ASTERISK_ARI_SECRET=${ari_secret}",
"APISERVER_ASTERISK_ARI_USERNAME=ari",
# API Server - Identity
"APISERVER_IDENTITY_ISSUER=https://${api_server_root_domain}",
"APISERVER_IDENTITY_CONTACT_VERIFICATION_REQUIRED=false",
"APISERVER_IDENTITY_TWO_FACTOR_AUTHENTICATION_REQUIRED=false",
"APISERVER_IDENTITY_WORKSPACE_INVITE_EXPIRATION=1d",
"APISERVER_IDENTITY_WORKSPACE_INVITE_FAIL_URL=${api_server_app_url}/invite-fail",
"APISERVER_IDENTITY_WORKSPACE_INVITE_URL=https://${api_server_root_domain}:8449/api/identity/accept-invite",
"APISERVER_IDENTITY_OAUTH2_GITHUB_CLIENT_ID=",
"APISERVER_IDENTITY_OAUTH2_GITHUB_CLIENT_SECRET=",
"APISERVER_IDENTITY_OAUTH2_GITHUB_ENABLED=false",
# API Server - InfluxDB
"APISERVER_INFLUXDB_URL=http://influxdb:8086",
"APISERVER_INFLUXDB_INIT_ORG=${influxdb_init_org}",
"APISERVER_INFLUXDB_INIT_USERNAME=${influxdb_init_username}",
"APISERVER_INFLUXDB_INIT_PASSWORD=${influxdb_password}",
"APISERVER_INFLUXDB_INIT_TOKEN=${influxdb_token}",
# API Server - NATS
"APISERVER_NATS_URL=nats://nats:4222",
# API Server - Logging
"APISERVER_LOGS_FORMAT=${logs_format}",
"APISERVER_LOGS_LEVEL=${logs_level}",
"APISERVER_LOGS_TRANSPORT=${logs_transport}",
# API Server - Encryption
"APISERVER_CLOAK_ENCRYPTION_KEY=${cloak_encryption_key}",
# API Server - AuthZ Service (disabled by default)
"APISERVER_AUTHZ_SERVICE_ENABLED=false",
"APISERVER_AUTHZ_SERVICE_HOST=fnauthz",
"APISERVER_AUTHZ_SERVICE_METHODS=/fonoster.calls.v1beta2.Calls/CreateCall,/fonoster.identity.v1beta2.Identity/CreateWorkspace",
"APISERVER_AUTHZ_SERVICE_PORT=50071",
# API Server - SMTP (optional, configure if needed)
"APISERVER_SMTP_HOST=your-smtp-server",
"APISERVER_SMTP_PORT=587",
"APISERVER_SMTP_SECURE=true",
"APISERVER_SMTP_AUTH_USER=postmaster@${api_server_root_domain}",
"APISERVER_SMTP_AUTH_PASS=secret",
"APISERVER_SMTP_SENDER=Fonoster Info <info@${api_server_root_domain}>",
# API Server - Signaling
"APISERVER_SIGNALING_SERVER=ws://${api_server_root_domain}:5062",
# API Server - Twilio (optional, configure if needed)
"APISERVER_TWILIO_ACCOUNT_SID=",
"APISERVER_TWILIO_AUTH_TOKEN=",
"APISERVER_TWILIO_PHONE_NUMBER=",
# Autopilot
"AUTOPILOT_CONVERSATION_PROVIDER=api",
"AUTOPILOT_KNOWLEDGE_BASE_ENABLED=false",
"AUTOPILOT_LOGS_FORMAT=${logs_transport}",
"AUTOPILOT_LOGS_LEVEL=${logs_level}",
"AUTOPILOT_LOGS_TRANSPORT=${logs_transport}",
"AUTOPILOT_AWS_S3_ACCESS_KEY_ID=",
"AUTOPILOT_AWS_S3_ENDPOINT=",
"AUTOPILOT_AWS_S3_REGION=us-east-1",
"AUTOPILOT_AWS_S3_SECRET_ACCESS_KEY=",
"AUTOPILOT_OPENAI_API_KEY=",
"AUTOPILOT_UNSTRUCTURED_API_KEY=",
"AUTOPILOT_UNSTRUCTURED_API_URL=",
# Routr
"ROUTR_DATABASE_URL=postgresql://${postgres_user}:${postgres_password}@postgres:5432/${postgres_db_routr}",
"ROUTR_EXTERNAL_ADDRS=${host_ip}",
"ROUTR_RTPENGINE_HOST=rtpengine",
"ROUTR_NATS_PUBLISHER_URL=${routr_nats_publisher_url}",
"ROUTR_LOGS_FORMAT=${logs_transport}",
"ROUTR_LOGS_LEVEL=${logs_level}",
"ROUTR_LOGS_TRANSPORT=${logs_transport}",
# Asterisk
"ASTERISK_ARI_PROXY_URL=http://asterisk:8088",
"ASTERISK_ARI_SECRET=${asterisk_ari_secret}",
"ASTERISK_ARI_USERNAME=ari",
"ASTERISK_CODECS=${asterisk_codecs}",
"ASTERISK_DTMF_MODE=${asterisk_dtmf_mode}",
"ASTERISK_RTP_PORT_START=${asterisk_rtp_port_start}",
"ASTERISK_RTP_PORT_END=${asterisk_rtp_port_end}",
"ASTERISK_SIPPROXY_HOST=${host_ip}",
"ASTERISK_SIPPROXY_PORT=${asterisk_sipproxy_port}",
"ASTERISK_SIPPROXY_SECRET=${asterisk_sipproxy_secret}",
"ASTERISK_SIPPROXY_USERNAME=${asterisk_sipproxy_username}",
# RTP Engine
"RTPENGINE_PUBLIC_IP=${host_ip}",
"RTPENGINE_PORT_MIN=${rtpengine_port_min}",
"RTPENGINE_PORT_MAX=${rtpengine_port_max}",
# InfluxDB
"INFLUXDB_INIT_ORG=${influxdb_init_org}",
"INFLUXDB_INIT_USERNAME=${influxdb_init_username}",
"INFLUXDB_INIT_PASSWORD=${influxdb_password}",
"INFLUXDB_INIT_TOKEN=${influxdb_token}",
# PostgreSQL
"POSTGRES_USER=${postgres_user}",
"POSTGRES_PASSWORD=${postgres_password}",
"POSTGRES_DB=${postgres_db_fonoster}",
]
[[config.domains]]
serviceName = "dashboard"
port = 3030
host = "${main_domain}"
[[config.mounts]]
filePath = "config/integrations.json"
content = """
{
"integrations": []
}
"""
[[config.mounts]]
filePath = "config/init-db.sh"
content = """#!/bin/bash
set -e
# Create additional databases (ignore error if they already exist)
psql -v ON_ERROR_STOP=0 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
CREATE DATABASE fnidentity;
CREATE DATABASE routr;
EOSQL
# Grant privileges
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
GRANT ALL PRIVILEGES ON DATABASE fnidentity TO $POSTGRES_USER;
GRANT ALL PRIVILEGES ON DATABASE routr TO $POSTGRES_USER;
EOSQL
"""
[[config.mounts]]
filePath = "config/keys/.gitkeep"
content = "# Placeholder - RSA keys need to be generated manually after deployment"
[[config.mounts]]
filePath = "config/keys/public.pem"
content = """-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyVvQZ8v3xq7p8BmXdS3C
G9fk654bAbl30tsqq4h9d3N4F11hlue8bGAY=
-----END PUBLIC KEY-----
"""
[[config.mounts]]
filePath = "config/envoy.yaml"
content = """
# Envoy configuration without tls for development and testing.
# Do not use this configuration in production. Please check the docs for examples using tls.
static_resources:
listeners:
- name: listener_http
address:
socket_address: { address: 0.0.0.0, port_value: 8449 }
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
codec_type: auto
stat_prefix: ingress_http
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains: ["*"]
routes:
- match:
prefix: "/api"
route:
cluster: apiserver-cluster-http
timeout: 0s
- match:
prefix: "/"
headers:
- name: "content-type"
safe_regex_match:
google_re2: {}
regex: "^(application/grpc|application/grpc-web-text)$"
route:
cluster: apiserver-cluster
timeout: 0s
max_stream_duration:
grpc_timeout_header_max: 0s
- match:
prefix: "/"
route:
cluster: dashboard-cluster
timeout: 0s
cors:
allow_origin_string_match:
- prefix: "*"
allow_methods: GET, PUT, DELETE, POST, OPTIONS
allow_headers: token,accesskeyid,keep-alive,user-agent,cache-control,content-type,content-transfer-encoding,x-accept-content-transfer-encoding,x-accept-response-streaming,x-user-agent,x-grpc-web,grpc-timeout
max_age: "1728000"
expose_headers: grpc-status,grpc-message
http_filters:
- name: envoy.filters.http.grpc_web
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.grpc_web.v3.GrpcWeb
- name: envoy.filters.http.cors
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.cors.v3.Cors
- name: envoy.filters.http.router
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
clusters:
- name: apiserver-cluster
type: logical_dns
connect_timeout: 20s
http2_protocol_options: {}
lb_policy: round_robin
load_assignment:
cluster_name: apiserver-cluster
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: apiserver
port_value: 50051
- name: apiserver-cluster-http
type: logical_dns
connect_timeout: 20s
lb_policy: round_robin
load_assignment:
cluster_name: apiserver-cluster-http
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: apiserver
port_value: 9876
- name: dashboard-cluster
type: logical_dns
connect_timeout: 20s
lb_policy: round_robin
load_assignment:
cluster_name: dashboard-cluster
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: dashboard
port_value: 3030
"""Base64
To import this template in Dokploy: create a Compose service → Advanced → Base64 import and paste the content below:
ewogICJjb21wb3NlIjogInNlcnZpY2VzOlxuICBkYXNoYm9hcmQ6XG4gICAgaW1hZ2U6IGZvbm9zdGVyL2Rhc2hib2FyZDowLjE1LjE1XG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICBwb3J0czpcbiAgICAgIC0gMzAzMFxuICAgIGVudmlyb25tZW50OlxuICAgICAgLSBTRVJWRVJfREFTSEJPQVJEX1NFU1NJT05fU0VDUkVUPSR7U0VSVkVSX0RBU0hCT0FSRF9TRVNTSU9OX1NFQ1JFVH1cblxuICBhcGlzZXJ2ZXI6XG4gICAgaW1hZ2U6IGZvbm9zdGVyL2FwaXNlcnZlcjowLjE1LjE1XG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICBkZXBlbmRzX29uOlxuICAgICAgcG9zdGdyZXM6XG4gICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5XG4gICAgZW52aXJvbm1lbnQ6XG4gICAgICAtIEFQSVNFUlZFUl9BUFBfVVJMPSR7QVBJU0VSVkVSX0FQUF9VUkx9XG4gICAgICAtIEFQSVNFUlZFUl9BU1RFUklTS19BUklfUFJPWFlfVVJMPSR7QVBJU0VSVkVSX0FTVEVSSVNLX0FSSV9QUk9YWV9VUkx9XG4gICAgICAtIEFQSVNFUlZFUl9BU1RFUklTS19BUklfU0VDUkVUPSR7QVBJU0VSVkVSX0FTVEVSSVNLX0FSSV9TRUNSRVR9XG4gICAgICAtIEFQSVNFUlZFUl9BU1RFUklTS19BUklfVVNFUk5BTUU9JHtBUElTRVJWRVJfQVNURVJJU0tfQVJJX1VTRVJOQU1FfVxuICAgICAgLSBBUElTRVJWRVJfQVVUSFpfU0VSVklDRV9FTkFCTEVEPSR7QVBJU0VSVkVSX0FVVEhaX1NFUlZJQ0VfRU5BQkxFRH1cbiAgICAgIC0gQVBJU0VSVkVSX0FVVEhaX1NFUlZJQ0VfSE9TVD0ke0FQSVNFUlZFUl9BVVRIWl9TRVJWSUNFX0hPU1R9XG4gICAgICAtIEFQSVNFUlZFUl9BVVRIWl9TRVJWSUNFX01FVEhPRFM9JHtBUElTRVJWRVJfQVVUSFpfU0VSVklDRV9NRVRIT0RTfVxuICAgICAgLSBBUElTRVJWRVJfQVVUSFpfU0VSVklDRV9QT1JUPSR7QVBJU0VSVkVSX0FVVEhaX1NFUlZJQ0VfUE9SVH1cbiAgICAgIC0gQVBJU0VSVkVSX0NMT0FLX0VOQ1JZUFRJT05fS0VZPSR7QVBJU0VSVkVSX0NMT0FLX0VOQ1JZUFRJT05fS0VZfVxuICAgICAgLSBBUElTRVJWRVJfREFUQUJBU0VfVVJMPSR7QVBJU0VSVkVSX0RBVEFCQVNFX1VSTH1cbiAgICAgIC0gQVBJU0VSVkVSX0lERU5USVRZX0RBVEFCQVNFX1VSTD0ke0FQSVNFUlZFUl9JREVOVElUWV9EQVRBQkFTRV9VUkx9XG4gICAgICAtIEFQSVNFUlZFUl9JREVOVElUWV9JU1NVRVI9JHtBUElTRVJWRVJfSURFTlRJVFlfSVNTVUVSfVxuICAgICAgLSBBUElTRVJWRVJfSURFTlRJVFlfQ09OVEFDVF9WRVJJRklDQVRJT05fUkVRVUlSRUQ9JHtBUElTRVJWRVJfSURFTlRJVFlfQ09OVEFDVF9WRVJJRklDQVRJT05fUkVRVUlSRUR9XG4gICAgICAtIEFQSVNFUlZFUl9JREVOVElUWV9UV09fRkFDVE9SX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEPSR7QVBJU0VSVkVSX0lERU5USVRZX1RXT19GQUNUT1JfQVVUSEVOVElDQVRJT05fUkVRVUlSRUR9XG4gICAgICAtIEFQSVNFUlZFUl9JREVOVElUWV9XT1JLU1BBQ0VfSU5WSVRFX0VYUElSQVRJT049JHtBUElTRVJWRVJfSURFTlRJVFlfV09SS1NQQUNFX0lOVklURV9FWFBJUkFUSU9OfVxuICAgICAgLSBBUElTRVJWRVJfSURFTlRJVFlfV09SS1NQQUNFX0lOVklURV9GQUlMX1VSTD0ke0FQSVNFUlZFUl9JREVOVElUWV9XT1JLU1BBQ0VfSU5WSVRFX0ZBSUxfVVJMfVxuICAgICAgLSBBUElTRVJWRVJfSURFTlRJVFlfV09SS1NQQUNFX0lOVklURV9VUkw9JHtBUElTRVJWRVJfSURFTlRJVFlfV09SS1NQQUNFX0lOVklURV9VUkx9XG4gICAgICAtIEFQSVNFUlZFUl9JREVOVElUWV9PQVVUSDJfR0lUSFVCX0NMSUVOVF9JRD0ke0FQSVNFUlZFUl9JREVOVElUWV9PQVVUSDJfR0lUSFVCX0NMSUVOVF9JRH1cbiAgICAgIC0gQVBJU0VSVkVSX0lERU5USVRZX09BVVRIMl9HSVRIVUJfQ0xJRU5UX1NFQ1JFVD0ke0FQSVNFUlZFUl9JREVOVElUWV9PQVVUSDJfR0lUSFVCX0NMSUVOVF9TRUNSRVR9XG4gICAgICAtIEFQSVNFUlZFUl9JREVOVElUWV9PQVVUSDJfR0lUSFVCX0VOQUJMRUQ9JHtBUElTRVJWRVJfSURFTlRJVFlfT0FVVEgyX0dJVEhVQl9FTkFCTEVEfVxuICAgICAgLSBBUElTRVJWRVJfSU5GTFVYREJfSU5JVF9PUkc9JHtBUElTRVJWRVJfSU5GTFVYREJfSU5JVF9PUkd9XG4gICAgICAtIEFQSVNFUlZFUl9JTkZMVVhEQl9JTklUX1BBU1NXT1JEPSR7QVBJU0VSVkVSX0lORkxVWERCX0lOSVRfUEFTU1dPUkR9XG4gICAgICAtIEFQSVNFUlZFUl9JTkZMVVhEQl9JTklUX1RPS0VOPSR7QVBJU0VSVkVSX0lORkxVWERCX0lOSVRfVE9LRU59XG4gICAgICAtIEFQSVNFUlZFUl9JTkZMVVhEQl9JTklUX1VTRVJOQU1FPSR7QVBJU0VSVkVSX0lORkxVWERCX0lOSVRfVVNFUk5BTUV9XG4gICAgICAtIEFQSVNFUlZFUl9JTkZMVVhEQl9VUkw9JHtBUElTRVJWRVJfSU5GTFVYREJfVVJMfVxuICAgICAgLSBBUElTRVJWRVJfTE9HU19GT1JNQVQ9JHtBUElTRVJWRVJfTE9HU19GT1JNQVR9XG4gICAgICAtIEFQSVNFUlZFUl9MT0dTX0xFVkVMPSR7QVBJU0VSVkVSX0xPR1NfTEVWRUx9XG4gICAgICAtIEFQSVNFUlZFUl9MT0dTX1RSQU5TUE9SVD0ke0FQSVNFUlZFUl9MT0dTX1RSQU5TUE9SVH1cbiAgICAgIC0gQVBJU0VSVkVSX05BVFNfVVJMPSR7QVBJU0VSVkVSX05BVFNfVVJMfVxuICAgICAgLSBBUElTRVJWRVJfT1dORVJfRU1BSUw9JHtBUElTRVJWRVJfT1dORVJfRU1BSUx9XG4gICAgICAtIEFQSVNFUlZFUl9PV05FUl9OQU1FPSR7QVBJU0VSVkVSX09XTkVSX05BTUV9XG4gICAgICAtIEFQSVNFUlZFUl9PV05FUl9QQVNTV09SRD0ke0FQSVNFUlZFUl9PV05FUl9QQVNTV09SRH1cbiAgICAgIC0gQVBJU0VSVkVSX1JPT1RfRE9NQUlOPSR7QVBJU0VSVkVSX1JPT1RfRE9NQUlOfVxuICAgICAgLSBBUElTRVJWRVJfU01UUF9BVVRIX1BBU1M9JHtBUElTRVJWRVJfU01UUF9BVVRIX1BBU1N9XG4gICAgICAtIEFQSVNFUlZFUl9TTVRQX0FVVEhfVVNFUj0ke0FQSVNFUlZFUl9TTVRQX0FVVEhfVVNFUn1cbiAgICAgIC0gQVBJU0VSVkVSX1NNVFBfSE9TVD0ke0FQSVNFUlZFUl9TTVRQX0hPU1R9XG4gICAgICAtIEFQSVNFUlZFUl9TTVRQX1BPUlQ9JHtBUElTRVJWRVJfU01UUF9QT1JUfVxuICAgICAgLSBBUElTRVJWRVJfU01UUF9TRUNVUkU9JHtBUElTRVJWRVJfU01UUF9TRUNVUkV9XG4gICAgICAtIEFQSVNFUlZFUl9TTVRQX1NFTkRFUj0ke0FQSVNFUlZFUl9TTVRQX1NFTkRFUn1cbiAgICAgIC0gQVBJU0VSVkVSX1NJR05BTElOR19TRVJWRVI9JHtBUElTRVJWRVJfU0lHTkFMSU5HX1NFUlZFUn1cbiAgICAgIC0gQVBJU0VSVkVSX1RXSUxJT19BQ0NPVU5UX1NJRD0ke0FQSVNFUlZFUl9UV0lMSU9fQUNDT1VOVF9TSUR9XG4gICAgICAtIEFQSVNFUlZFUl9UV0lMSU9fQVVUSF9UT0tFTj0ke0FQSVNFUlZFUl9UV0lMSU9fQVVUSF9UT0tFTn1cbiAgICAgIC0gQVBJU0VSVkVSX1RXSUxJT19QSE9ORV9OVU1CRVI9JHtBUElTRVJWRVJfVFdJTElPX1BIT05FX05VTUJFUn1cbiAgICBleHBvc2U6XG4gICAgICAtIDUwMDUxXG4gICAgdm9sdW1lczpcbiAgICAgIC0gLi4vZmlsZXMvY29uZmlnL2tleXM6L29wdC9mb25vc3Rlci9rZXlzOnJvXG4gICAgICAtIC4uL2ZpbGVzL2NvbmZpZy9pbnRlZ3JhdGlvbnMuanNvbjovb3B0L2Zvbm9zdGVyL2ludGVncmF0aW9ucy5qc29uOnJvXG5cbiAgYXV0b3BpbG90OlxuICAgIGltYWdlOiBmb25vc3Rlci9hdXRvcGlsb3Q6MC4xNS4xNVxuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG4gICAgZXhwb3NlOlxuICAgICAgLSA1MDA2MVxuICAgIGVudmlyb25tZW50OlxuICAgICAgLSBBVVRPUElMT1RfQVdTX1MzX0FDQ0VTU19LRVlfSUQ9JHtBVVRPUElMT1RfQVdTX1MzX0FDQ0VTU19LRVlfSUR9XG4gICAgICAtIEFVVE9QSUxPVF9BV1NfUzNfRU5EUE9JTlQ9JHtBVVRPUElMT1RfQVdTX1MzX0VORFBPSU5UfVxuICAgICAgLSBBVVRPUElMT1RfQVdTX1MzX1JFR0lPTj0ke0FVVE9QSUxPVF9BV1NfUzNfUkVHSU9OfVxuICAgICAgLSBBVVRPUElMT1RfQVdTX1MzX1NFQ1JFVF9BQ0NFU1NfS0VZPSR7QVVUT1BJTE9UX0FXU19TM19TRUNSRVRfQUNDRVNTX0tFWX1cbiAgICAgIC0gQVVUT1BJTE9UX0NPTlZFUlNBVElPTl9QUk9WSURFUj0ke0FVVE9QSUxPVF9DT05WRVJTQVRJT05fUFJPVklERVJ9XG4gICAgICAtIEFVVE9QSUxPVF9LTk9XTEVER0VfQkFTRV9FTkFCTEVEPSR7QVVUT1BJTE9UX0tOT1dMRURHRV9CQVNFX0VOQUJMRUR9XG4gICAgICAtIEFVVE9QSUxPVF9MT0dTX0ZPUk1BVD0ke0FVVE9QSUxPVF9MT0dTX0ZPUk1BVH1cbiAgICAgIC0gQVVUT1BJTE9UX0xPR1NfTEVWRUw9JHtBVVRPUElMT1RfTE9HU19MRVZFTH1cbiAgICAgIC0gQVVUT1BJTE9UX0xPR1NfVFJBTlNQT1JUPSR7QVVUT1BJTE9UX0xPR1NfVFJBTlNQT1JUfVxuICAgICAgLSBBVVRPUElMT1RfT1BFTkFJX0FQSV9LRVk9JHtBVVRPUElMT1RfT1BFTkFJX0FQSV9LRVl9XG4gICAgICAtIEFVVE9QSUxPVF9VTlNUUlVDVFVSRURfQVBJX0tFWT0ke0FVVE9QSUxPVF9VTlNUUlVDVFVSRURfQVBJX0tFWX1cbiAgICAgIC0gQVVUT1BJTE9UX1VOU1RSVUNUVVJFRF9BUElfVVJMPSR7QVVUT1BJTE9UX1VOU1RSVUNUVVJFRF9BUElfVVJMfVxuICAgIHZvbHVtZXM6XG4gICAgICAtIC4uL2ZpbGVzL2NvbmZpZy9pbnRlZ3JhdGlvbnMuanNvbjovb3B0L2Zvbm9zdGVyL2ludGVncmF0aW9ucy5qc29uOnJvXG5cbiAgcm91dHI6XG4gICAgaW1hZ2U6IGZvbm9zdGVyL3JvdXRyLW9uZToyLjEzLjEzXG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICBkZXBlbmRzX29uOlxuICAgICAgcG9zdGdyZXM6XG4gICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5XG4gICAgZW52aXJvbm1lbnQ6XG4gICAgICBEQVRBQkFTRV9VUkw6ICR7Uk9VVFJfREFUQUJBU0VfVVJMfVxuICAgICAgRVhURVJOQUxfQUREUlM6ICR7Uk9VVFJfRVhURVJOQUxfQUREUlN9XG4gICAgICBMT0dTX0ZPUk1BVDogJHtST1VUUl9MT0dTX0ZPUk1BVH1cbiAgICAgIExPR1NfTEVWRUw6ICR7Uk9VVFJfTE9HU19MRVZFTH1cbiAgICAgIExPR1NfVFJBTlNQT1JUOiAke1JPVVRSX0xPR1NfVFJBTlNQT1JUfVxuICAgICAgTkFUU19QVUJMSVNIRVJfRU5BQkxFRDogXCJ0cnVlXCJcbiAgICAgIE5BVFNfUFVCTElTSEVSX1VSTDogJHtST1VUUl9OQVRTX1BVQkxJU0hFUl9VUkx9XG4gICAgICBSVFBFTkdJTkVfSE9TVDogJHtST1VUUl9SVFBFTkdJTkVfSE9TVH1cbiAgICAgIFNUQVJUX0lOVEVSTkFMX0RCOiBcImZhbHNlXCJcbiAgICAgIENPTk5FQ1RfVkVSSUZJRVJfUFVCTElDX0tFWV9QQVRIOiAvZXRjL3JvdXRyL2tleXMvcHVibGljLnBlbVxuICAgIGV4cG9zZTpcbiAgICAgIC0gNTE5MDdcbiAgICAgIC0gNTE5MDhcbiAgICBwb3J0czpcbiAgICAgIC0gNTA2MDo1MDYwL3VkcFxuICAgICAgLSA1MDYwLTUwNjM6NTA2MC01MDYzXG4gICAgdm9sdW1lczpcbiAgICAgIC0gLi4vZmlsZXMvY29uZmlnL2tleXMvcHVibGljLnBlbTovZXRjL3JvdXRyL2tleXMvcHVibGljLnBlbVxuXG4gICMgUlRQRW5naW5lIHVzZXMgYSByYW5nZSBvZiBwb3J0cyB0byBoYW5kbGUgUlRQIHRyYWZmaWMuIEJlY2F1c2UgZXhwb3NpbmcgYSBsYXJnZSByYW5nZSBvZiBwb3J0cyBcbiAgIyBpcyBub3QgcG9zc2libGUgaW4gRG9ja2VyLCB3ZSBuZWVkIHRvIHVzZSBuZXR3b3JrX21vZGU6IGhvc3QuXG4gICNcbiAgIyBVbmZvcnR1bmF0ZWx5LCBuZXR3b3JrX21vZGU6IGhvc3QgaXMgbm90IHN1cHBvcnRlZCBmb3IgV2luZG93cyBvciBNYWMuXG4gICMgSW4gdGhvc2UgY2FzZXMsIHdlIG5lZWQgdG8gdXNlIGEgZGlmZmVyZW50IGFwcHJvYWNoLlxuICAjXG4gICMgQnkgZGVmYXVsdCB3ZSBhcmUgb3BlbmluZyBhIHNtYWxsIHJhbmdlIG9mIHBvcnRzICgxMDAwMC0xMDEwMCkgdG8gaGFuZGxlIFJUUCB0cmFmZmljLlxuICAjIEhvd2V2ZXIsIHRoaXMgaXMgbm90IGVub3VnaCBmb3IgcHJvZHVjdGlvbiBlbnZpcm9ubWVudHMuXG4gICNcbiAgIyBXZSByZWNvbW1lbmQgdGhhdCB3aGVuIHVzaW5nIExpbnV4IHlvdSB1c2UgbmV0d29ya19tb2RlOiBob3N0IGFuZCByZW1vdmUgdGhlIHBvcnRzIHNlY3Rpb24uXG4gIHJ0cGVuZ2luZTpcbiAgICBpbWFnZTogZm9ub3N0ZXIvcnRwZW5naW5lOjAuMy4xN1xuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG4gICAgcGxhdGZvcm06IGxpbnV4L3g4Nl82NFxuICAgIHBvcnRzOiBcbiAgICAgIC0gMTAwMDAtMTAxMDA6MTAwMDAtMTAxMDAvdWRwXG4gICAgICAtIDgwODA6ODA4MFxuICAgIGVudmlyb25tZW50OlxuICAgICAgUE9SVF9NQVg6ICR7UlRQRU5HSU5FX1BPUlRfTUFYfVxuICAgICAgUE9SVF9NSU46ICR7UlRQRU5HSU5FX1BPUlRfTUlOfVxuICAgICAgUFVCTElDX0lQOiAke1JUUEVOR0lORV9QVUJMSUNfSVB9XG5cbiAgYXN0ZXJpc2s6XG4gICAgaW1hZ2U6IGZvbm9zdGVyL2FzdGVyaXNrOjIwXG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICBlbnZpcm9ubWVudDpcbiAgICAgIEFSSV9QUk9YWV9VUkw6ICR7QVNURVJJU0tfQVJJX1BST1hZX1VSTH1cbiAgICAgIEFSSV9TRUNSRVQ6ICR7QVNURVJJU0tfQVJJX1NFQ1JFVH1cbiAgICAgIEFSSV9VU0VSTkFNRTogJHtBU1RFUklTS19BUklfVVNFUk5BTUV9XG4gICAgICBDT0RFQ1M6ICR7QVNURVJJU0tfQ09ERUNTfVxuICAgICAgRFRNRl9NT0RFOiAke0FTVEVSSVNLX0RUTUZfTU9ERX1cbiAgICAgIFJUUF9QT1JUX0VORDogJHtBU1RFUklTS19SVFBfUE9SVF9FTkR9XG4gICAgICBSVFBfUE9SVF9TVEFSVDogJHtBU1RFUklTS19SVFBfUE9SVF9TVEFSVH1cbiAgICAgIFNJUFBST1hZX0hPU1Q6ICR7QVNURVJJU0tfU0lQUFJPWFlfSE9TVH1cbiAgICAgIFNJUFBST1hZX1BPUlQ6ICR7QVNURVJJU0tfU0lQUFJPWFlfUE9SVH1cbiAgICAgIFNJUFBST1hZX1NFQ1JFVDogJHtBU1RFUklTS19TSVBQUk9YWV9TRUNSRVR9XG4gICAgICBTSVBQUk9YWV9VU0VSTkFNRTogJHtBU1RFUklTS19TSVBQUk9YWV9VU0VSTkFNRX1cbiAgICBleHBvc2U6XG4gICAgICAtIDYwNjBcblxuICBwb3N0Z3JlczpcbiAgICBpbWFnZTogcG9zdGdyZXM6MTYuMTAtYWxwaW5lMy4yMlxuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG4gICAgZW52aXJvbm1lbnQ6XG4gICAgICBQR1RaOiBVVENcbiAgICAgIFBPU1RHUkVTX1BBU1NXT1JEOiAke1BPU1RHUkVTX1BBU1NXT1JEfVxuICAgICAgUE9TVEdSRVNfVVNFUjogJHtQT1NUR1JFU19VU0VSfVxuICAgICAgUE9TVEdSRVNfREI6ICR7UE9TVEdSRVNfREJ9XG4gICAgICBUWjogVVRDXG4gICAgZXhwb3NlOlxuICAgICAgLSA1NDMyXG4gICAgdm9sdW1lczpcbiAgICAgIC0gZGI6L3Zhci9saWIvcG9zdGdyZXNxbC9kYXRhXG4gICAgICAtIC4uL2ZpbGVzL2NvbmZpZy9pbml0LWRiLnNoOi9kb2NrZXItZW50cnlwb2ludC1pbml0ZGIuZC9pbml0LWRiLnNoOnJvXG4gICAgaGVhbHRoY2hlY2s6XG4gICAgICB0ZXN0OiBbXCJDTUQtU0hFTExcIiwgXCJwZ19pc3JlYWR5IC1VICR7UE9TVEdSRVNfVVNFUn0gLWQgJHtQT1NUR1JFU19EQn1cIl1cbiAgICAgIGludGVydmFsOiA1c1xuICAgICAgdGltZW91dDogNXNcbiAgICAgIHJldHJpZXM6IDEwXG5cbiAgaW5mbHV4ZGI6XG4gICAgaW1hZ2U6IGluZmx1eGRiOjIuN1xuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG4gICAgZXhwb3NlOlxuICAgICAgLSA4MDg2XG4gICAgZW52aXJvbm1lbnQ6XG4gICAgICBET0NLRVJfSU5GTFVYREJfSU5JVF9BRE1JTl9UT0tFTjogJHtJTkZMVVhEQl9JTklUX1RPS0VOfVxuICAgICAgRE9DS0VSX0lORkxVWERCX0lOSVRfQlVDS0VUOiBjYWxsc1xuICAgICAgRE9DS0VSX0lORkxVWERCX0lOSVRfTU9ERTogc2V0dXBcbiAgICAgIERPQ0tFUl9JTkZMVVhEQl9JTklUX09SRzogJHtJTkZMVVhEQl9JTklUX09SR31cbiAgICAgIERPQ0tFUl9JTkZMVVhEQl9JTklUX1BBU1NXT1JEOiAke0lORkxVWERCX0lOSVRfUEFTU1dPUkR9XG4gICAgICBET0NLRVJfSU5GTFVYREJfSU5JVF9VU0VSTkFNRTogJHtJTkZMVVhEQl9JTklUX1VTRVJOQU1FfVxuICAgIHZvbHVtZXM6XG4gICAgICAtIGluZmx1eGRiOi92YXIvbGliL2luZmx1eGRiMlxuXG4gIG5hdHM6XG4gICAgaW1hZ2U6IG5hdHM6Mi4xMS44XG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICBleHBvc2U6XG4gICAgICAtIDQyMjJcblxuICBlbnZveTpcbiAgICBpbWFnZTogZW52b3lwcm94eS9lbnZveTp2MS4zNS4wXG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICBjb21tYW5kOiBbXCIvdXNyL2xvY2FsL2Jpbi9lbnZveVwiLCBcIi1jXCIsIFwiL2V0Yy9lbnZveS9lbnZveS55YW1sXCJdXG4gICAgdm9sdW1lczpcbiAgICAgIC0gLi4vZmlsZXMvY29uZmlnOi9ldGMvZW52b3k6cm9cbiAgICBwb3J0czpcbiAgICAgIC0gODQ0OTo4NDQ5XG5cbnZvbHVtZXM6XG4gIGRiOlxuICBpbmZsdXhkYjpcblxuIiwKICAiY29uZmlnIjogIlt2YXJpYWJsZXNdXG5tYWluX2RvbWFpbiA9IFwiJHtkb21haW59XCJcblxuIyBDcml0aWNhbDogU2V0IHRoZXNlIHRvIHlvdXIgaG9zdCBtYWNoaW5lJ3MgSVAgYWRkcmVzc1xuIyBGb3IgY2xvdWQgZGVwbG95bWVudHMsIHVzZSB0aGUgcHVibGljIElQIG9mIHlvdXIgc2VydmVyXG4jIEZvciBsb2NhbCBkZXBsb3ltZW50cywgdXNlIHlvdXIgbG9jYWwgbWFjaGluZSdzIElQXG5ob3N0X2lwID0gXCJDSEFOR0VfTUVfVE9fSE9TVF9JUFwiXG5cbiMgU2VjcmV0cyAtIGF1dG8tZ2VuZXJhdGVkIHN0cm9uZyBwYXNzd29yZHNcbmRhc2hib2FyZF9zZXNzaW9uX3NlY3JldCA9IFwiJHtwYXNzd29yZDo2NH1cIlxuYXJpX3NlY3JldCA9IFwiJHtwYXNzd29yZDozMn1cIlxuYXN0ZXJpc2tfYXJpX3NlY3JldCA9IFwiJHtwYXNzd29yZDozMn1cIlxuYXN0ZXJpc2tfc2lwcHJveHlfc2VjcmV0ID0gXCIke3Bhc3N3b3JkOjMyfVwiXG5wb3N0Z3Jlc19wYXNzd29yZCA9IFwiJHtwYXNzd29yZDozMn1cIlxuaW5mbHV4ZGJfcGFzc3dvcmQgPSBcIiR7cGFzc3dvcmQ6MzJ9XCJcbmluZmx1eGRiX3Rva2VuID0gXCIke3Bhc3N3b3JkOjY0fVwiXG5jbG9ha19lbmNyeXB0aW9uX2tleSA9IFwiJHtiYXNlNjQ6MzJ9XCJcblxuIyBEYXRhYmFzZSBjcmVkZW50aWFsc1xucG9zdGdyZXNfdXNlciA9IFwicG9zdGdyZXNcIlxucG9zdGdyZXNfZGJfZm9ub3N0ZXIgPSBcImZvbm9zdGVyXCJcbnBvc3RncmVzX2RiX2lkZW50aXR5ID0gXCJmbmlkZW50aXR5XCJcbnBvc3RncmVzX2RiX3JvdXRyID0gXCJyb3V0clwiXG5cbiMgQVBJIFNlcnZlciBDb25maWd1cmF0aW9uXG5hcGlfc2VydmVyX2FwcF91cmwgPSBcImh0dHBzOi8vJHttYWluX2RvbWFpbn1cIlxuYXBpX3NlcnZlcl9yb290X2RvbWFpbiA9IFwiJHttYWluX2RvbWFpbn1cIlxuYXBpX3NlcnZlcl9vd25lcl9lbWFpbCA9IFwiYWRtaW5AJHttYWluX2RvbWFpbn1cIlxuYXBpX3NlcnZlcl9vd25lcl9uYW1lID0gXCJBZG1pbiBVc2VyXCJcbmFwaV9zZXJ2ZXJfb3duZXJfcGFzc3dvcmQgPSBcIiR7cGFzc3dvcmQ6MzJ9XCJcblxuIyBJbmZsdXhEQiBDb25maWd1cmF0aW9uXG5pbmZsdXhkYl9pbml0X29yZyA9IFwiZm9ub3N0ZXJcIlxuaW5mbHV4ZGJfaW5pdF91c2VybmFtZSA9IFwiaW5mbHV4ZGJcIlxuXG4jIEFzdGVyaXNrIENvbmZpZ3VyYXRpb25cbmFzdGVyaXNrX2NvZGVjcyA9IFwiZzcyMix1bGF3LGFsYXdcIlxuYXN0ZXJpc2tfZHRtZl9tb2RlID0gXCJhdXRvX2luZm9cIlxuYXN0ZXJpc2tfcnRwX3BvcnRfc3RhcnQgPSBcIjEwMDAwXCJcbmFzdGVyaXNrX3J0cF9wb3J0X2VuZCA9IFwiMjAwMDBcIlxuYXN0ZXJpc2tfc2lwcHJveHlfcG9ydCA9IFwiNTA2MFwiXG5hc3Rlcmlza19zaXBwcm94eV91c2VybmFtZSA9IFwidm9pY2VcIlxuXG4jIFJUUCBFbmdpbmUgQ29uZmlndXJhdGlvblxucnRwZW5naW5lX3BvcnRfbWluID0gXCIxMDAwMFwiXG5ydHBlbmdpbmVfcG9ydF9tYXggPSBcIjIwMDAwXCJcblxuIyBSb3V0ciBDb25maWd1cmF0aW9uXG5yb3V0cl9uYXRzX3B1Ymxpc2hlcl91cmwgPSBcIm5hdHM6Ly9uYXRzOjQyMjJcIlxuXG4jIExvZ2dpbmcgQ29uZmlndXJhdGlvblxubG9nc19mb3JtYXQgPSBcImpzb25cIlxubG9nc19sZXZlbCA9IFwidmVyYm9zZVwiXG5sb2dzX3RyYW5zcG9ydCA9IFwibm9uZVwiXG5cbltjb25maWddXG5lbnYgPSBbXG4gICMgRGFzaGJvYXJkXG4gIFwiU0VSVkVSX0RBU0hCT0FSRF9TRVNTSU9OX1NFQ1JFVD0ke2Rhc2hib2FyZF9zZXNzaW9uX3NlY3JldH1cIixcbiAgXG4gICMgQVBJIFNlcnZlciAtIENvcmVcbiAgXCJBUElTRVJWRVJfQVBQX1VSTD0ke2FwaV9zZXJ2ZXJfYXBwX3VybH1cIixcbiAgXCJBUElTRVJWRVJfUk9PVF9ET01BSU49JHthcGlfc2VydmVyX3Jvb3RfZG9tYWlufVwiLFxuICBcIkFQSVNFUlZFUl9PV05FUl9FTUFJTD0ke2FwaV9zZXJ2ZXJfb3duZXJfZW1haWx9XCIsXG4gIFwiQVBJU0VSVkVSX09XTkVSX05BTUU9JHthcGlfc2VydmVyX293bmVyX25hbWV9XCIsXG4gIFwiQVBJU0VSVkVSX09XTkVSX1BBU1NXT1JEPSR7YXBpX3NlcnZlcl9vd25lcl9wYXNzd29yZH1cIixcbiAgXG4gICMgQVBJIFNlcnZlciAtIERhdGFiYXNlXG4gIFwiQVBJU0VSVkVSX0RBVEFCQVNFX1VSTD1wb3N0Z3Jlc3FsOi8vJHtwb3N0Z3Jlc191c2VyfToke3Bvc3RncmVzX3Bhc3N3b3JkfUBwb3N0Z3Jlczo1NDMyLyR7cG9zdGdyZXNfZGJfZm9ub3N0ZXJ9XCIsXG4gIFwiQVBJU0VSVkVSX0lERU5USVRZX0RBVEFCQVNFX1VSTD1wb3N0Z3Jlc3FsOi8vJHtwb3N0Z3Jlc191c2VyfToke3Bvc3RncmVzX3Bhc3N3b3JkfUBwb3N0Z3Jlczo1NDMyLyR7cG9zdGdyZXNfZGJfaWRlbnRpdHl9XCIsXG4gIFxuICAjIEFQSSBTZXJ2ZXIgLSBBc3RlcmlzayBBUklcbiAgXCJBUElTRVJWRVJfQVNURVJJU0tfQVJJX1BST1hZX1VSTD1odHRwOi8vYXN0ZXJpc2s6ODA4OFwiLFxuICBcIkFQSVNFUlZFUl9BU1RFUklTS19BUklfU0VDUkVUPSR7YXJpX3NlY3JldH1cIixcbiAgXCJBUElTRVJWRVJfQVNURVJJU0tfQVJJX1VTRVJOQU1FPWFyaVwiLFxuICBcbiAgIyBBUEkgU2VydmVyIC0gSWRlbnRpdHlcbiAgXCJBUElTRVJWRVJfSURFTlRJVFlfSVNTVUVSPWh0dHBzOi8vJHthcGlfc2VydmVyX3Jvb3RfZG9tYWlufVwiLFxuICBcIkFQSVNFUlZFUl9JREVOVElUWV9DT05UQUNUX1ZFUklGSUNBVElPTl9SRVFVSVJFRD1mYWxzZVwiLFxuICBcIkFQSVNFUlZFUl9JREVOVElUWV9UV09fRkFDVE9SX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEPWZhbHNlXCIsXG4gIFwiQVBJU0VSVkVSX0lERU5USVRZX1dPUktTUEFDRV9JTlZJVEVfRVhQSVJBVElPTj0xZFwiLFxuICBcIkFQSVNFUlZFUl9JREVOVElUWV9XT1JLU1BBQ0VfSU5WSVRFX0ZBSUxfVVJMPSR7YXBpX3NlcnZlcl9hcHBfdXJsfS9pbnZpdGUtZmFpbFwiLFxuICBcIkFQSVNFUlZFUl9JREVOVElUWV9XT1JLU1BBQ0VfSU5WSVRFX1VSTD1odHRwczovLyR7YXBpX3NlcnZlcl9yb290X2RvbWFpbn06ODQ0OS9hcGkvaWRlbnRpdHkvYWNjZXB0LWludml0ZVwiLFxuICBcIkFQSVNFUlZFUl9JREVOVElUWV9PQVVUSDJfR0lUSFVCX0NMSUVOVF9JRD1cIixcbiAgXCJBUElTRVJWRVJfSURFTlRJVFlfT0FVVEgyX0dJVEhVQl9DTElFTlRfU0VDUkVUPVwiLFxuICBcIkFQSVNFUlZFUl9JREVOVElUWV9PQVVUSDJfR0lUSFVCX0VOQUJMRUQ9ZmFsc2VcIixcbiAgXG4gICMgQVBJIFNlcnZlciAtIEluZmx1eERCXG4gIFwiQVBJU0VSVkVSX0lORkxVWERCX1VSTD1odHRwOi8vaW5mbHV4ZGI6ODA4NlwiLFxuICBcIkFQSVNFUlZFUl9JTkZMVVhEQl9JTklUX09SRz0ke2luZmx1eGRiX2luaXRfb3JnfVwiLFxuICBcIkFQSVNFUlZFUl9JTkZMVVhEQl9JTklUX1VTRVJOQU1FPSR7aW5mbHV4ZGJfaW5pdF91c2VybmFtZX1cIixcbiAgXCJBUElTRVJWRVJfSU5GTFVYREJfSU5JVF9QQVNTV09SRD0ke2luZmx1eGRiX3Bhc3N3b3JkfVwiLFxuICBcIkFQSVNFUlZFUl9JTkZMVVhEQl9JTklUX1RPS0VOPSR7aW5mbHV4ZGJfdG9rZW59XCIsXG4gIFxuICAjIEFQSSBTZXJ2ZXIgLSBOQVRTXG4gIFwiQVBJU0VSVkVSX05BVFNfVVJMPW5hdHM6Ly9uYXRzOjQyMjJcIixcbiAgXG4gICMgQVBJIFNlcnZlciAtIExvZ2dpbmdcbiAgXCJBUElTRVJWRVJfTE9HU19GT1JNQVQ9JHtsb2dzX2Zvcm1hdH1cIixcbiAgXCJBUElTRVJWRVJfTE9HU19MRVZFTD0ke2xvZ3NfbGV2ZWx9XCIsXG4gIFwiQVBJU0VSVkVSX0xPR1NfVFJBTlNQT1JUPSR7bG9nc190cmFuc3BvcnR9XCIsXG4gIFxuICAjIEFQSSBTZXJ2ZXIgLSBFbmNyeXB0aW9uXG4gIFwiQVBJU0VSVkVSX0NMT0FLX0VOQ1JZUFRJT05fS0VZPSR7Y2xvYWtfZW5jcnlwdGlvbl9rZXl9XCIsXG4gIFxuICAjIEFQSSBTZXJ2ZXIgLSBBdXRoWiBTZXJ2aWNlIChkaXNhYmxlZCBieSBkZWZhdWx0KVxuICBcIkFQSVNFUlZFUl9BVVRIWl9TRVJWSUNFX0VOQUJMRUQ9ZmFsc2VcIixcbiAgXCJBUElTRVJWRVJfQVVUSFpfU0VSVklDRV9IT1NUPWZuYXV0aHpcIixcbiAgXCJBUElTRVJWRVJfQVVUSFpfU0VSVklDRV9NRVRIT0RTPS9mb25vc3Rlci5jYWxscy52MWJldGEyLkNhbGxzL0NyZWF0ZUNhbGwsL2Zvbm9zdGVyLmlkZW50aXR5LnYxYmV0YTIuSWRlbnRpdHkvQ3JlYXRlV29ya3NwYWNlXCIsXG4gIFwiQVBJU0VSVkVSX0FVVEhaX1NFUlZJQ0VfUE9SVD01MDA3MVwiLFxuICBcbiAgIyBBUEkgU2VydmVyIC0gU01UUCAob3B0aW9uYWwsIGNvbmZpZ3VyZSBpZiBuZWVkZWQpXG4gIFwiQVBJU0VSVkVSX1NNVFBfSE9TVD15b3VyLXNtdHAtc2VydmVyXCIsXG4gIFwiQVBJU0VSVkVSX1NNVFBfUE9SVD01ODdcIixcbiAgXCJBUElTRVJWRVJfU01UUF9TRUNVUkU9dHJ1ZVwiLFxuICBcIkFQSVNFUlZFUl9TTVRQX0FVVEhfVVNFUj1wb3N0bWFzdGVyQCR7YXBpX3NlcnZlcl9yb290X2RvbWFpbn1cIixcbiAgXCJBUElTRVJWRVJfU01UUF9BVVRIX1BBU1M9c2VjcmV0XCIsXG4gIFwiQVBJU0VSVkVSX1NNVFBfU0VOREVSPUZvbm9zdGVyIEluZm8gPGluZm9AJHthcGlfc2VydmVyX3Jvb3RfZG9tYWlufT5cIixcbiAgXG4gICMgQVBJIFNlcnZlciAtIFNpZ25hbGluZ1xuICBcIkFQSVNFUlZFUl9TSUdOQUxJTkdfU0VSVkVSPXdzOi8vJHthcGlfc2VydmVyX3Jvb3RfZG9tYWlufTo1MDYyXCIsXG4gIFxuICAjIEFQSSBTZXJ2ZXIgLSBUd2lsaW8gKG9wdGlvbmFsLCBjb25maWd1cmUgaWYgbmVlZGVkKVxuICBcIkFQSVNFUlZFUl9UV0lMSU9fQUNDT1VOVF9TSUQ9XCIsXG4gIFwiQVBJU0VSVkVSX1RXSUxJT19BVVRIX1RPS0VOPVwiLFxuICBcIkFQSVNFUlZFUl9UV0lMSU9fUEhPTkVfTlVNQkVSPVwiLFxuICBcbiAgIyBBdXRvcGlsb3RcbiAgXCJBVVRPUElMT1RfQ09OVkVSU0FUSU9OX1BST1ZJREVSPWFwaVwiLFxuICBcIkFVVE9QSUxPVF9LTk9XTEVER0VfQkFTRV9FTkFCTEVEPWZhbHNlXCIsXG4gIFwiQVVUT1BJTE9UX0xPR1NfRk9STUFUPSR7bG9nc190cmFuc3BvcnR9XCIsXG4gIFwiQVVUT1BJTE9UX0xPR1NfTEVWRUw9JHtsb2dzX2xldmVsfVwiLFxuICBcIkFVVE9QSUxPVF9MT0dTX1RSQU5TUE9SVD0ke2xvZ3NfdHJhbnNwb3J0fVwiLFxuICBcIkFVVE9QSUxPVF9BV1NfUzNfQUNDRVNTX0tFWV9JRD1cIixcbiAgXCJBVVRPUElMT1RfQVdTX1MzX0VORFBPSU5UPVwiLFxuICBcIkFVVE9QSUxPVF9BV1NfUzNfUkVHSU9OPXVzLWVhc3QtMVwiLFxuICBcIkFVVE9QSUxPVF9BV1NfUzNfU0VDUkVUX0FDQ0VTU19LRVk9XCIsXG4gIFwiQVVUT1BJTE9UX09QRU5BSV9BUElfS0VZPVwiLFxuICBcIkFVVE9QSUxPVF9VTlNUUlVDVFVSRURfQVBJX0tFWT1cIixcbiAgXCJBVVRPUElMT1RfVU5TVFJVQ1RVUkVEX0FQSV9VUkw9XCIsXG4gIFxuICAjIFJvdXRyXG4gIFwiUk9VVFJfREFUQUJBU0VfVVJMPXBvc3RncmVzcWw6Ly8ke3Bvc3RncmVzX3VzZXJ9OiR7cG9zdGdyZXNfcGFzc3dvcmR9QHBvc3RncmVzOjU0MzIvJHtwb3N0Z3Jlc19kYl9yb3V0cn1cIixcbiAgXCJST1VUUl9FWFRFUk5BTF9BRERSUz0ke2hvc3RfaXB9XCIsXG4gIFwiUk9VVFJfUlRQRU5HSU5FX0hPU1Q9cnRwZW5naW5lXCIsXG4gIFwiUk9VVFJfTkFUU19QVUJMSVNIRVJfVVJMPSR7cm91dHJfbmF0c19wdWJsaXNoZXJfdXJsfVwiLFxuICBcIlJPVVRSX0xPR1NfRk9STUFUPSR7bG9nc190cmFuc3BvcnR9XCIsXG4gIFwiUk9VVFJfTE9HU19MRVZFTD0ke2xvZ3NfbGV2ZWx9XCIsXG4gIFwiUk9VVFJfTE9HU19UUkFOU1BPUlQ9JHtsb2dzX3RyYW5zcG9ydH1cIixcbiAgXG4gICMgQXN0ZXJpc2tcbiAgXCJBU1RFUklTS19BUklfUFJPWFlfVVJMPWh0dHA6Ly9hc3Rlcmlzazo4MDg4XCIsXG4gIFwiQVNURVJJU0tfQVJJX1NFQ1JFVD0ke2FzdGVyaXNrX2FyaV9zZWNyZXR9XCIsXG4gIFwiQVNURVJJU0tfQVJJX1VTRVJOQU1FPWFyaVwiLFxuICBcIkFTVEVSSVNLX0NPREVDUz0ke2FzdGVyaXNrX2NvZGVjc31cIixcbiAgXCJBU1RFUklTS19EVE1GX01PREU9JHthc3Rlcmlza19kdG1mX21vZGV9XCIsXG4gIFwiQVNURVJJU0tfUlRQX1BPUlRfU1RBUlQ9JHthc3Rlcmlza19ydHBfcG9ydF9zdGFydH1cIixcbiAgXCJBU1RFUklTS19SVFBfUE9SVF9FTkQ9JHthc3Rlcmlza19ydHBfcG9ydF9lbmR9XCIsXG4gIFwiQVNURVJJU0tfU0lQUFJPWFlfSE9TVD0ke2hvc3RfaXB9XCIsXG4gIFwiQVNURVJJU0tfU0lQUFJPWFlfUE9SVD0ke2FzdGVyaXNrX3NpcHByb3h5X3BvcnR9XCIsXG4gIFwiQVNURVJJU0tfU0lQUFJPWFlfU0VDUkVUPSR7YXN0ZXJpc2tfc2lwcHJveHlfc2VjcmV0fVwiLFxuICBcIkFTVEVSSVNLX1NJUFBST1hZX1VTRVJOQU1FPSR7YXN0ZXJpc2tfc2lwcHJveHlfdXNlcm5hbWV9XCIsXG4gIFxuICAjIFJUUCBFbmdpbmVcbiAgXCJSVFBFTkdJTkVfUFVCTElDX0lQPSR7aG9zdF9pcH1cIixcbiAgXCJSVFBFTkdJTkVfUE9SVF9NSU49JHtydHBlbmdpbmVfcG9ydF9taW59XCIsXG4gIFwiUlRQRU5HSU5FX1BPUlRfTUFYPSR7cnRwZW5naW5lX3BvcnRfbWF4fVwiLFxuICBcbiAgIyBJbmZsdXhEQlxuICBcIklORkxVWERCX0lOSVRfT1JHPSR7aW5mbHV4ZGJfaW5pdF9vcmd9XCIsXG4gIFwiSU5GTFVYREJfSU5JVF9VU0VSTkFNRT0ke2luZmx1eGRiX2luaXRfdXNlcm5hbWV9XCIsXG4gIFwiSU5GTFVYREJfSU5JVF9QQVNTV09SRD0ke2luZmx1eGRiX3Bhc3N3b3JkfVwiLFxuICBcIklORkxVWERCX0lOSVRfVE9LRU49JHtpbmZsdXhkYl90b2tlbn1cIixcbiAgXG4gICMgUG9zdGdyZVNRTFxuICBcIlBPU1RHUkVTX1VTRVI9JHtwb3N0Z3Jlc191c2VyfVwiLFxuICBcIlBPU1RHUkVTX1BBU1NXT1JEPSR7cG9zdGdyZXNfcGFzc3dvcmR9XCIsXG4gIFwiUE9TVEdSRVNfREI9JHtwb3N0Z3Jlc19kYl9mb25vc3Rlcn1cIixcbl1cblxuW1tjb25maWcuZG9tYWluc11dXG5zZXJ2aWNlTmFtZSA9IFwiZGFzaGJvYXJkXCJcbnBvcnQgPSAzMDMwXG5ob3N0ID0gXCIke21haW5fZG9tYWlufVwiXG5cbltbY29uZmlnLm1vdW50c11dXG5maWxlUGF0aCA9IFwiY29uZmlnL2ludGVncmF0aW9ucy5qc29uXCJcbmNvbnRlbnQgPSBcIlwiXCJcbntcbiAgXCJpbnRlZ3JhdGlvbnNcIjogW11cbn1cblwiXCJcIlxuXG5bW2NvbmZpZy5tb3VudHNdXVxuZmlsZVBhdGggPSBcImNvbmZpZy9pbml0LWRiLnNoXCJcbmNvbnRlbnQgPSBcIlwiXCIjIS9iaW4vYmFzaFxuc2V0IC1lXG5cbiMgQ3JlYXRlIGFkZGl0aW9uYWwgZGF0YWJhc2VzIChpZ25vcmUgZXJyb3IgaWYgdGhleSBhbHJlYWR5IGV4aXN0KVxucHNxbCAtdiBPTl9FUlJPUl9TVE9QPTAgLS11c2VybmFtZSBcIiRQT1NUR1JFU19VU0VSXCIgLS1kYm5hbWUgXCIkUE9TVEdSRVNfREJcIiA8PC1FT1NRTFxuICAgIENSRUFURSBEQVRBQkFTRSBmbmlkZW50aXR5O1xuICAgIENSRUFURSBEQVRBQkFTRSByb3V0cjtcbkVPU1FMXG5cbiMgR3JhbnQgcHJpdmlsZWdlc1xucHNxbCAtdiBPTl9FUlJPUl9TVE9QPTEgLS11c2VybmFtZSBcIiRQT1NUR1JFU19VU0VSXCIgLS1kYm5hbWUgXCIkUE9TVEdSRVNfREJcIiA8PC1FT1NRTFxuICAgIEdSQU5UIEFMTCBQUklWSUxFR0VTIE9OIERBVEFCQVNFIGZuaWRlbnRpdHkgVE8gJFBPU1RHUkVTX1VTRVI7XG4gICAgR1JBTlQgQUxMIFBSSVZJTEVHRVMgT04gREFUQUJBU0Ugcm91dHIgVE8gJFBPU1RHUkVTX1VTRVI7XG5FT1NRTFxuXCJcIlwiXG5cbltbY29uZmlnLm1vdW50c11dXG5maWxlUGF0aCA9IFwiY29uZmlnL2tleXMvLmdpdGtlZXBcIlxuY29udGVudCA9IFwiIyBQbGFjZWhvbGRlciAtIFJTQSBrZXlzIG5lZWQgdG8gYmUgZ2VuZXJhdGVkIG1hbnVhbGx5IGFmdGVyIGRlcGxveW1lbnRcIlxuXG5bW2NvbmZpZy5tb3VudHNdXVxuZmlsZVBhdGggPSBcImNvbmZpZy9rZXlzL3B1YmxpYy5wZW1cIlxuY29udGVudCA9IFwiXCJcIi0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tXG5NSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXlWdlFaOHYzeHE3cDhCbVhkUzNDXG5HOWZrNjU0YkFibDMwdHNxcTRoOWQzTjRGMTFobHVlOGJHQVk9XG4tLS0tLUVORCBQVUJMSUMgS0VZLS0tLS1cblwiXCJcIlxuXG5bW2NvbmZpZy5tb3VudHNdXVxuZmlsZVBhdGggPSBcImNvbmZpZy9lbnZveS55YW1sXCJcbmNvbnRlbnQgPSBcIlwiXCJcbiMgRW52b3kgY29uZmlndXJhdGlvbiB3aXRob3V0IHRscyBmb3IgZGV2ZWxvcG1lbnQgYW5kIHRlc3RpbmcuXG4jIERvIG5vdCB1c2UgdGhpcyBjb25maWd1cmF0aW9uIGluIHByb2R1Y3Rpb24uIFBsZWFzZSBjaGVjayB0aGUgZG9jcyBmb3IgZXhhbXBsZXMgdXNpbmcgdGxzLlxuc3RhdGljX3Jlc291cmNlczpcbiAgbGlzdGVuZXJzOlxuICAgIC0gbmFtZTogbGlzdGVuZXJfaHR0cFxuICAgICAgYWRkcmVzczpcbiAgICAgICAgc29ja2V0X2FkZHJlc3M6IHsgYWRkcmVzczogMC4wLjAuMCwgcG9ydF92YWx1ZTogODQ0OSB9XG4gICAgICBmaWx0ZXJfY2hhaW5zOlxuICAgICAgICAtIGZpbHRlcnM6XG4gICAgICAgICAgLSBuYW1lOiBlbnZveS5maWx0ZXJzLm5ldHdvcmsuaHR0cF9jb25uZWN0aW9uX21hbmFnZXJcbiAgICAgICAgICAgIHR5cGVkX2NvbmZpZzpcbiAgICAgICAgICAgICAgXCJAdHlwZVwiOiB0eXBlLmdvb2dsZWFwaXMuY29tL2Vudm95LmV4dGVuc2lvbnMuZmlsdGVycy5uZXR3b3JrLmh0dHBfY29ubmVjdGlvbl9tYW5hZ2VyLnYzLkh0dHBDb25uZWN0aW9uTWFuYWdlclxuICAgICAgICAgICAgICBjb2RlY190eXBlOiBhdXRvXG4gICAgICAgICAgICAgIHN0YXRfcHJlZml4OiBpbmdyZXNzX2h0dHBcbiAgICAgICAgICAgICAgcm91dGVfY29uZmlnOlxuICAgICAgICAgICAgICAgIG5hbWU6IGxvY2FsX3JvdXRlXG4gICAgICAgICAgICAgICAgdmlydHVhbF9ob3N0czpcbiAgICAgICAgICAgICAgICAgIC0gbmFtZTogbG9jYWxfc2VydmljZVxuICAgICAgICAgICAgICAgICAgICBkb21haW5zOiBbXCIqXCJdXG4gICAgICAgICAgICAgICAgICAgIHJvdXRlczpcbiAgICAgICAgICAgICAgICAgICAgICAtIG1hdGNoOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXg6IFwiL2FwaVwiXG4gICAgICAgICAgICAgICAgICAgICAgICByb3V0ZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlcjogYXBpc2VydmVyLWNsdXN0ZXItaHR0cFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0OiAwc1xuICAgICAgICAgICAgICAgICAgICAgIC0gbWF0Y2g6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeDogXCIvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG5hbWU6IFwiY29udGVudC10eXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVfcmVnZXhfbWF0Y2g6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2dsZV9yZTI6IHt9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4OiBcIl4oYXBwbGljYXRpb24vZ3JwY3xhcHBsaWNhdGlvbi9ncnBjLXdlYi10ZXh0KSRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcm91dGU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXI6IGFwaXNlcnZlci1jbHVzdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IDBzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9zdHJlYW1fZHVyYXRpb246XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JwY190aW1lb3V0X2hlYWRlcl9tYXg6IDBzXG4gICAgICAgICAgICAgICAgICAgICAgLSBtYXRjaDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4OiBcIi9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgcm91dGU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXI6IGRhc2hib2FyZC1jbHVzdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IDBzXG4gICAgICAgICAgICAgICAgICAgIGNvcnM6XG4gICAgICAgICAgICAgICAgICAgICAgYWxsb3dfb3JpZ2luX3N0cmluZ19tYXRjaDpcbiAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJlZml4OiBcIipcIlxuICAgICAgICAgICAgICAgICAgICAgIGFsbG93X21ldGhvZHM6IEdFVCwgUFVULCBERUxFVEUsIFBPU1QsIE9QVElPTlNcbiAgICAgICAgICAgICAgICAgICAgICBhbGxvd19oZWFkZXJzOiB0b2tlbixhY2Nlc3NrZXlpZCxrZWVwLWFsaXZlLHVzZXItYWdlbnQsY2FjaGUtY29udHJvbCxjb250ZW50LXR5cGUsY29udGVudC10cmFuc2Zlci1lbmNvZGluZyx4LWFjY2VwdC1jb250ZW50LXRyYW5zZmVyLWVuY29kaW5nLHgtYWNjZXB0LXJlc3BvbnNlLXN0cmVhbWluZyx4LXVzZXItYWdlbnQseC1ncnBjLXdlYixncnBjLXRpbWVvdXRcbiAgICAgICAgICAgICAgICAgICAgICBtYXhfYWdlOiBcIjE3MjgwMDBcIlxuICAgICAgICAgICAgICAgICAgICAgIGV4cG9zZV9oZWFkZXJzOiBncnBjLXN0YXR1cyxncnBjLW1lc3NhZ2VcbiAgICAgICAgICAgICAgaHR0cF9maWx0ZXJzOlxuICAgICAgICAgICAgICAgIC0gbmFtZTogZW52b3kuZmlsdGVycy5odHRwLmdycGNfd2ViXG4gICAgICAgICAgICAgICAgICB0eXBlZF9jb25maWc6XG4gICAgICAgICAgICAgICAgICAgIFwiQHR5cGVcIjogdHlwZS5nb29nbGVhcGlzLmNvbS9lbnZveS5leHRlbnNpb25zLmZpbHRlcnMuaHR0cC5ncnBjX3dlYi52My5HcnBjV2ViXG4gICAgICAgICAgICAgICAgLSBuYW1lOiBlbnZveS5maWx0ZXJzLmh0dHAuY29yc1xuICAgICAgICAgICAgICAgICAgdHlwZWRfY29uZmlnOlxuICAgICAgICAgICAgICAgICAgICBcIkB0eXBlXCI6IHR5cGUuZ29vZ2xlYXBpcy5jb20vZW52b3kuZXh0ZW5zaW9ucy5maWx0ZXJzLmh0dHAuY29ycy52My5Db3JzXG4gICAgICAgICAgICAgICAgLSBuYW1lOiBlbnZveS5maWx0ZXJzLmh0dHAucm91dGVyXG4gICAgICAgICAgICAgICAgICB0eXBlZF9jb25maWc6XG4gICAgICAgICAgICAgICAgICAgIFwiQHR5cGVcIjogdHlwZS5nb29nbGVhcGlzLmNvbS9lbnZveS5leHRlbnNpb25zLmZpbHRlcnMuaHR0cC5yb3V0ZXIudjMuUm91dGVyXG5cbiAgY2x1c3RlcnM6XG4gICAgLSBuYW1lOiBhcGlzZXJ2ZXItY2x1c3RlclxuICAgICAgdHlwZTogbG9naWNhbF9kbnNcbiAgICAgIGNvbm5lY3RfdGltZW91dDogMjBzXG4gICAgICBodHRwMl9wcm90b2NvbF9vcHRpb25zOiB7fVxuICAgICAgbGJfcG9saWN5OiByb3VuZF9yb2JpblxuICAgICAgbG9hZF9hc3NpZ25tZW50OlxuICAgICAgICBjbHVzdGVyX25hbWU6IGFwaXNlcnZlci1jbHVzdGVyXG4gICAgICAgIGVuZHBvaW50czpcbiAgICAgICAgICAtIGxiX2VuZHBvaW50czpcbiAgICAgICAgICAgICAgLSBlbmRwb2ludDpcbiAgICAgICAgICAgICAgICAgIGFkZHJlc3M6XG4gICAgICAgICAgICAgICAgICAgIHNvY2tldF9hZGRyZXNzOlxuICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IGFwaXNlcnZlclxuICAgICAgICAgICAgICAgICAgICAgIHBvcnRfdmFsdWU6IDUwMDUxXG5cbiAgICAtIG5hbWU6IGFwaXNlcnZlci1jbHVzdGVyLWh0dHBcbiAgICAgIHR5cGU6IGxvZ2ljYWxfZG5zXG4gICAgICBjb25uZWN0X3RpbWVvdXQ6IDIwc1xuICAgICAgbGJfcG9saWN5OiByb3VuZF9yb2JpblxuICAgICAgbG9hZF9hc3NpZ25tZW50OlxuICAgICAgICBjbHVzdGVyX25hbWU6IGFwaXNlcnZlci1jbHVzdGVyLWh0dHBcbiAgICAgICAgZW5kcG9pbnRzOlxuICAgICAgICAgIC0gbGJfZW5kcG9pbnRzOlxuICAgICAgICAgICAgICAtIGVuZHBvaW50OlxuICAgICAgICAgICAgICAgICAgYWRkcmVzczpcbiAgICAgICAgICAgICAgICAgICAgc29ja2V0X2FkZHJlc3M6XG4gICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogYXBpc2VydmVyXG4gICAgICAgICAgICAgICAgICAgICAgcG9ydF92YWx1ZTogOTg3NlxuXG4gICAgLSBuYW1lOiBkYXNoYm9hcmQtY2x1c3RlclxuICAgICAgdHlwZTogbG9naWNhbF9kbnNcbiAgICAgIGNvbm5lY3RfdGltZW91dDogMjBzXG4gICAgICBsYl9wb2xpY3k6IHJvdW5kX3JvYmluXG4gICAgICBsb2FkX2Fzc2lnbm1lbnQ6XG4gICAgICAgIGNsdXN0ZXJfbmFtZTogZGFzaGJvYXJkLWNsdXN0ZXJcbiAgICAgICAgZW5kcG9pbnRzOlxuICAgICAgICAgIC0gbGJfZW5kcG9pbnRzOlxuICAgICAgICAgICAgICAtIGVuZHBvaW50OlxuICAgICAgICAgICAgICAgICAgYWRkcmVzczpcbiAgICAgICAgICAgICAgICAgICAgc29ja2V0X2FkZHJlc3M6XG4gICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogZGFzaGJvYXJkXG4gICAgICAgICAgICAgICAgICAgICAgcG9ydF92YWx1ZTogMzAzMFxuXCJcIlwiXG5cbiIKfQ==Links
Tags
telephony, voip, sip, webrtc, pstn, communication
Version: 0.15.15