node {
  name = "emqx@127.0.0.1"
  cookie = "emqxsecretcookie"
  data_dir = "data"
}

log {
  file_handlers.default {
    level = warning
    file = "log/emqx.log"
  }
}

cluster {
  name = emqxcl
  discovery_strategy = manual
}

dashboard {
    listeners.http {
        bind = 18083
    }
    default_username = "admin"
    default_password = "public"
}

authentication = [
  {
    backend = "built_in_database"
    mechanism = "password_based"
    password_hash_algorithm {name = "sha256", salt_position = "suffix"}
    user_id_type = "username"
  },
  {
    algorithm = "hmac-based"
    from = "password"
    mechanism = "jwt"
    secret = "emqxsecret"
    "secret_base64_encoded" = false
    use_jwks = false
  },
  {
    backend = "http"
    body {password = "${password}", username = "${username}"}
    connect_timeout = "15s"
    enable_pipelining = 100
    headers {"content-type" = "application/json"}
    mechanism = "password_based"
    method = "post"
    pool_size = 8
    request_timeout = "5s"
    ssl {enable = false, verify = "verify_peer"}
    url = "http://127.0.0.1:8080"
  }
]
authorization {
  cache {enable = true}
  deny_action = "ignore"
  no_match = "allow"
  sources = [
    {
      cmd = "HGETALL mqtt_acl:${username}"
      database = 0
      pool_size = 8
      redis_type = "single"
      server = "127.0.0.1:6379"
      ssl {enable = false, verify = "verify_peer"}
      type = "redis"
    },
    {
      database = "mqtt_acl"
      pool_size = 8
      query = "SELECT action, permission, topic FROM mqtt_acl where username = ${username}"
      server = "127.0.0.1:5432"
      ssl {enable = false, verify = "verify_peer"}
      type = "postgresql"
      username = "root"
    },
    {
      collection = "users"
      database = "mqtt"
      filter {username = "${username}"}
      mongo_type = "single"
      pool_size = 8
      server = "127.0.0.1:27017"
      ssl {enable = false, verify = "verify_peer"}
      topology {connect_timeout_ms = "20s"}
      type = "mongodb"
    },
    {
      database = "mqtt_acl"
      pool_size = 8
      query = "SELECT action, permission, topic FROM mqtt_acl where username = ${username}"
      server = "127.0.0.1:3306"
      ssl {enable = false, verify = "verify_peer"}
      type = "mysql"
      username = "root"
    },
    {
      body {username = "${username}"}
      connect_timeout = "15s"
      enable_pipelining = 100
      headers {"content-type" = "application/json"}
      method = "post"
      pool_size = 8
      request_timeout = "30s"
      ssl {enable = false, verify = "verify_peer"}
      type = "http"
      url = "http://127.0.0.1:8080"
    },
    {
      enable = true
      path = "etc/acl.conf"
      type = "file"
    }
  ]
}
bridges {
  webhook {
    test {
      connect_timeout = "15s"
      enable_pipelining = 100
      headers {"content-type" = "application/json"}
      method = "post"
      pool_size = 8
      pool_type = "random"
      request_timeout = "15s"
      resource_opts {
        async_inflight_window = 100
        auto_restart_interval = "60s"
        health_check_interval = "15s"
        max_queue_bytes = "1GB"
        query_mode = "async"
        request_timeout = "15s"
        worker_pool_size = 4
      }
      ssl {enable = false, verify = "verify_peer"}
      url = "http://127.0.0.1:8080/test"
    }
  }
}
conn_congestion {enable_alarm = true, min_alarm_sustain_duration = "1m"}
delayed {enable = true, max_delayed_messages = 10}
exhook {
  servers = [
    {
      auto_reconnect = "60s"
      enable = false
      failed_action = "deny"
      name = "testx"
      pool_size = 16
      request_timeout = "5s"
      ssl {enable = false, verify = "verify_peer"}
      url = "http://127.0.0.1:8080/exhook"
    }
  ]
}
flapping_detect {
  ban_time = "5m"
  enable = false
  max_count = 15
  window_time = "1m"
}
force_gc {
  bytes = "16MB"
  count = 16000
  enable = true
}
force_shutdown {
  enable = true
  max_heap_size = "32MB"
  max_message_queue_len = 1000
}
gateway {
  coap {
    connection_required = false
    enable_stats = true
    listeners {
      udp {
        default {
          bind = "5683"
          max_conn_rate = 1000
          max_connections = 1024000
        }
      }
    }
    mountpoint = ""
    notify_type = "qos"
    publish_qos = "coap"
    subscribe_qos = "coap"
  }
  exproto {
    enable_stats = true
    handler {
      address = "http://127.0.0.1:9001"
      ssl_options {enable = false}
    }
    idle_timeout = "30s"
    listeners {
      tcp {
        default {
          acceptors = 16
          bind = "7993"
          max_conn_rate = 1000
          max_connections = 1024000
        }
      }
    }
    mountpoint = ""
    server {
      bind = "127.0.0.1:9100"
      ssl_options {verify = "verify_none"}
    }
  }
  "lwm2m" {
    auto_observe = true
    enable_stats = true
    idle_timeout = "30s"
    lifetime_max = "86400s"
    lifetime_min = "1s"
    listeners {
      udp {
        default {
          bind = "5783"
          max_conn_rate = 1000
          max_connections = 1024000
        }
      }
    }
    mountpoint = ""
    qmode_time_window = "22s"
    translators {
      command {qos = 0, topic = "dn/#"}
      notify {qos = 0, topic = "up/notify"}
      register {qos = 0, topic = "up/resp"}
      response {qos = 0, topic = "up/resp"}
      update {qos = 0, topic = "up/update"}
    }
    update_msg_publish_condition = "contains_object_list"
    xml_dir = "etc/lwm2m_xml/"
  }
  mqttsn {
    broadcast = true
    "enable_qos3" = true
    enable_stats = true
    gateway_id = 1
    idle_timeout = "30s"
    listeners {
      udp {
        default {
          bind = "1884"
          max_conn_rate = 1000
          max_connections = 1024000
        }
      }
    }
    mountpoint = ""
    predefined = []
  }
  stomp {
    enable_stats = true
    frame {
      max_body_length = 8192
      max_headers = 10
      max_headers_length = 1024
    }
    idle_timeout = "30s"
    listeners {
      tcp {
        default {
          bind = "61613"
          max_conn_rate = 1000
          max_connections = 1024000
        }
      }
    }
    mountpoint = ""
  }
}
listeners {
  ssl {
    default {
      bind = "0.0.0.0:8883"
      max_connections = 512000
      ssl_options {
        cacertfile = "etc/certs/cacert.pem"
        certfile = "etc/certs/cert.pem"
        keyfile = "etc/certs/key.pem"
      }
    }
  }
  tcp {
    default {
      acceptors = 32
      bind = "0.0.0.0:1883"
      enable_authn = true
      enabled = true
      limiter {
        bytes_in {
          capacity = "infinity"
          initial = "0"
          rate = "infinity"
        }
        client {
          bytes_in {
            capacity = "infinity"
            divisible = false
            failure_strategy = "force"
            initial = "0"
            low_watermark = "0"
            max_retry_time = "10s"
            rate = "infinity"
          }
          connection {
            capacity = "infinity"
            divisible = false
            failure_strategy = "force"
            initial = "0"
            low_watermark = "0"
            max_retry_time = "10s"
            rate = "infinity"
          }
          message_in {
            capacity = "infinity"
            divisible = false
            failure_strategy = "force"
            initial = "0"
            low_watermark = "0"
            max_retry_time = "10s"
            rate = "infinity"
          }
          message_routing {
            capacity = "infinity"
            divisible = false
            failure_strategy = "force"
            initial = "0"
            low_watermark = "0"
            max_retry_time = "10s"
            rate = "infinity"
          }
        }
        connection {
          capacity = "1000"
          initial = "0"
          rate = "1000/s"
        }
        message_in {
          capacity = "infinity"
          initial = "0"
          rate = "infinity"
        }
        message_routing {
          capacity = "infinity"
          initial = "0"
          rate = "infinity"
        }
      }
      max_connections = 1024000
      proxy_protocol = false
      proxy_protocol_timeout = "3s"
      tcp_options {
        active_n = 100
        backlog = 1024
        buffer = "4KB"
        high_watermark = "1MB"
        nodelay = true
        reuseaddr = true
        send_timeout = "15s"
        send_timeout_close = true
      }
      zone = "default"
    }
  }
  ws {
    default {
      bind = "0.0.0.0:8083"
      max_connections = 1024000
      websocket {mqtt_path = "/mqtt"}
    }
  }
  wss {
    default {
      bind = "0.0.0.0:8084"
      max_connections = 512000
      ssl_options {
        cacertfile = "etc/certs/cacert.pem"
        certfile = "etc/certs/cert.pem"
        keyfile = "etc/certs/key.pem"
      }
      websocket {mqtt_path = "/mqtt"}
    }
  }
}
mqtt {
  await_rel_timeout = "300s"
  exclusive_subscription = false
  idle_timeout = "15s"
  ignore_loop_deliver = false
  keepalive_backoff = 0.75
  max_awaiting_rel = 100
  max_clientid_len = 65535
  max_inflight = 320
  max_mqueue_len = 1000
  max_packet_size = "10MB"
  max_qos_allowed = 2
  max_subscriptions = "infinity"
  max_topic_alias = 65535
  max_topic_levels = 128
  mqueue_default_priority = "lowest"
  mqueue_priorities = "disabled"
  "mqueue_store_qos0" = true
  peer_cert_as_clientid = "disabled"
  peer_cert_as_username = "disabled"
  response_information = ""
  retain_available = true
  retry_interval = "30s"
  server_keepalive = "disabled"
  session_expiry_interval = "2h"
  shared_subscription = true
  strict_mode = false
  upgrade_qos = false
  use_username_as_clientid = false
  wildcard_subscription = true
}
overload_protection {
  backoff_delay = 1
  backoff_gc = false
  backoff_hibernation = true
  backoff_new_conn = true
  enable = false
}
retainer {
  backend {
    index_specs = [
      [1, 2, 3],
      [1, 3],
      [2, 3],
      [3]
    ]
    max_retained_messages = 0
    storage_type = "ram"
    type = "built_in_database"
  }
  enable = true
  flow_control {
    batch_deliver_limiter {
      capacity = "infinity"
      client {
        capacity = "infinity"
        divisible = false
        failure_strategy = "force"
        initial = "0"
        low_watermark = "0"
        max_retry_time = "10s"
        rate = "infinity"
      }
      initial = "0"
      rate = "infinity"
    }
    batch_deliver_number = 0
    batch_read_number = 0
  }
  max_payload_size = "10MB"
  msg_clear_interval = "0s"
  msg_expiry_interval = "0s"
  stop_publish_clear_msg = false
}
rule_engine {
  ignore_sys_message = true
  jq_function_default_timeout = "10s"
  jq_implementation_module = "jq_nif"
  rules {
    rule_plna {
      actions = ["webhook:test"]
      description = ""
      metadata {created_at = 1684226199152}
      sql = "SELECT\n  *\nFROM\n  \"t/#\""
    }
  }
}
slow_subs {
  enable = true
  expire_interval = "300s"
  stats_type = "whole"
  threshold = "500ms"
  top_k_num = 10
}
stats {enable = true}
sys_topics {
  sys_event_messages {
    client_connected = true
    client_disconnected = true
    client_subscribed = true
    client_unsubscribed = true
  }
  sys_heartbeat_interval = "30s"
  sys_msg_interval = "1m"
}
