Vulture/VNode/_software_lib/nanomq-0.22.10/config/nanomq_example.conf

1322 lines
36 KiB
Plaintext
Raw Normal View History

# NanoMQ Configuration 0.19.1
# #============================================================
# # NanoMQ Broker
# #============================================================
system {
# # num_taskq_thread
# # Use a specified number of taskq threads
# #
# # Value: 1-255, Obtain automatically if 0
num_taskq_thread = 0
# # max_taskq_thread
# # Use a specified maximunm number of taskq threads
# #
# # Value: 1-255, Obtain automatically if 0
max_taskq_thread = 0
# # parallel
# # Handle a specified maximum number of outstanding requests
# #
# # Value: 1-255, Obtain automatically if 0
parallel = 0
# # hook_ipc_url
# # Specify hook ipc url
# #
## Value: ipc://path
hook_ipc_url = "ipc:///tmp/nanomq_hook.ipc"
# # cmd_ipc_url
# # Specify cmd ipc url
# #
# # Value: ipc://path
cmd_ipc_url = "ipc:///tmp/nanomq_cmd.ipc"
}
mqtt {
# # max_packet_size
# # Defines the default max size of a packet that NanoMQ could accept and send
# #
# # Hot updatable
# # Value: 1 Byte-260 MB
max_packet_size = 1KB
# # max_mqueue_len
# # The queue length in-flight window
# # This is essential for performance and memory consumption
# #
# # Hot updatable
# # Value: 1-infinity
max_mqueue_len = 2048
# # Unsupported now
max_inflight_window = 2048
max_awaiting_rel = 10s
await_rel_timeout = 10s
# # retry_interval (s)
# # The retry interval is nano qos duration which also controls timer
# # interval of each pipe
# #
# # Hot updatable
# # Value: 1-infinity
retry_interval = 10s
# # The backoff for MQTT keepalive timeout.
# # broker will discolse client when there is no activity for
# # 'Keepalive * backoff * timeout.
# #
# # Hot updatable
# # Value: Float > 0.5
keepalive_multiplier = 1.25
# # property_size
# # The max size for a MQTT user property
# #
# # Hot updatable
# # Value: 1-infinity
property_size = 32
}
listeners.tcp {
# # bind
# # Connect with the host and port
# #
# # Value: host:port
bind = "0.0.0.0:1883"
}
listeners.tcp.default_1 {
bind = "0.0.0.0:1884"
}
listeners.tcp.default_2 {
bind = "0.0.0.0:1885"
}
# #============================================================
# # TLS/SSL
# #============================================================
listeners.ssl {
# # tls url
# #
# # Value: "host:port"
bind = "0.0.0.0:8883"
# # tls key password
# # String containing the user's password. Only used if the private keyfile
# # is password-protected.
# #
# # Value: String
# key_password="yourpass"
# # tls keyfile
# # Path to the file containing the user's private PEM-encoded key.
# #
# # Value: File
keyfile = "/etc/certs/key.pem"
# # tls cert file
# # Path to a file containing the user certificate.
# #
# # Value: File
certfile = "/etc/certs/cert.pem"
# # tls ca cert file
# # Path to the file containing PEM-encoded CA certificates. The CA certificates
# # are used during server authentication and when building the client certificate chain.
# #
# # Value: File
cacertfile = "/etc/certs/cacert.pem"
# # A server only does x509-path validation in mode verify_peer,
# # as it then sends a certificate request to the client (this
# # message is not sent if the verify option is verify_none).
# # You can then also want to specify option fail_if_no_peer_cert.
# #
# # Value: true: verify_peer | false: verify_none
verify_peer = false
# # Used together with {verify, verify_peer} by an SSL server. If set to true,
# # the server fails if the client does not have a certificate to send, that is,
# # sends an empty certificate.
# #
# # Value: true | false
fail_if_no_peer_cert = false
}
listeners.ssl.default_1 {
bind = "0.0.0.0:8881"
keyfile = "/etc/certs/key.pem"
certfile = "/etc/certs/cert.pem"
cacertfile = "/etc/certs/cacert.pem"
verify_peer = false
fail_if_no_peer_cert = false
}
listeners.ssl.default_2 {
bind = "0.0.0.0:8884"
keyfile = "/etc/certs/key.pem"
certfile = "/etc/certs/cert.pem"
cacertfile = "/etc/certs/cacert.pem"
verify_peer = false
fail_if_no_peer_cert = false
}
# #============================================================
# # WebSocket
# #============================================================
listeners.ws {
# # websocket url
# #
# # Value: "host:port/path"
bind = "0.0.0.0:8083/mqtt"
}
listeners.wss {
# # websocket tls url
# #
# # Value: "host:port/path"
bind = "0.0.0.0:8086/mqtt"
}
# # -------------------- SQLite Config -------------------- ##
sqlite {
# # Max message limitation for caching
# # ( 0 means ineffective )
# # Value: 1-infinity
disk_cache_size = 102400
# # Mounted file path
# #
# # Value: path
# mounted_file_path="/tmp/"
# # The threshold of flushing messages to flash.
# #
# # Hot updatable
# # Value: 1-infinity
flush_mem_threshold = 100
# # Resend interval (ms)
# # The interval for resending the messages after failure recovered. (not related to trigger)
# #
# # Value: 1-infinity
resend_interval = 5000
}
# #============================================================
# # Http server
# #============================================================
http_server {
# # http server port
# #
# # Value: 0 - 65535
port = 8081
# # limit connector
# # Handle a specified maximum number of outstanding requests
# #
# # Value: 1-infinity
limit_conn = 32
# # http server username
# #
# # Value: String
username = admin
# # http server password
# #
# # Value: String
password = public
# # http server auth type
# # If set auth_type=jwt, make sure you have built JWT dependency with `-DENABLE_JWT=ON` first.
# #
# # Value: String basic | jwt
auth_type = basic
jwt {
# # http server jwt public key file
# # Used together with 'http_server.auth_type=jwt',
# # Path to the file containing the user's private key.
# #
# # Value: File
public.keyfile = "/etc/certs/jwt/jwtRS256.key.pub"
}
}
# # ------------------ Logging Config ------------------ ##
log {
# # Where to emit the logs.
# #
# # - file: write logs to file
# # - console: write logs to standard I/O
# # - syslog: write logs to syslog
# # Value: file | console | syslog
# # Example: file,console,syslog
to = [file, console]
# # The log severity level.
# #
# # Value: trace | debug | info | warn | error | fatal
# #
# # Note: Only the messages with severity level higher than or equal to
# # this level will be logged.
# #
# # Default: warn
level = warn
# # The dir for log files.
# #
# # Value: Folder
dir = "/tmp"
# # The log filename for logs of level specified in "log.level".
# #
# # Value: String
# # Default: nanomq.log
file = "nanomq.log"
rotation {
# # Maximum size of each log file.
# #
# # Value: Number
# # Default: 10M
# # Supported Unit: KB | MB | GB
size = 10MB
# # Maximum rotation count of log files.
# #
# # Value: Number
# # Default: 5
count = 5
}
}
# #============================================================
# # WebHook
# #============================================================
# webhook {
# ## Webhook URL
# ##
# ## Value: String
# url="http://127.0.0.1:80"
# ## HTTP Headers
# ##
# ## Example:
# ## 1. web.hook.headers.content-type="application/json"
# ## 2. web.hook.headers.accept="*"
# ##
# ## Value: String
# headers.content-type="application/json"
# ## The encoding format of the payload field in the HTTP body
# ## The payload field only appears in the on_message_publish and on_message_delivered actions
# ##
# ## Value: plain | base64 | base62
# body.encoding="plain"
# ## Connection process pool size
# ##
# ## Value: Number
# pool_size=32
#
# # Unsupport now
# # tls {
# # keyfile="/etc/certs/key.pem"
# # certfile="/etc/certs/cert.pem"
# # cacertfile="/etc/certs/cacert.pem"
# # }
#
# }
webhook {
url = "http://127.0.0.1:80"
headers.content-type = "application/json"
body.encoding = plain
pool_size = 32
events = [
{
# # Webhook event.
# #
# # Value: String
# # Supported event list:
# # event: on_client_connect
# # event: on_client_connack
# # event: on_client_connected
# # event: on_client_disconnected
# # event: on_client_subscribe
# # event: on_client_unsubscribe
# # event: on_session_subscribed
# # event: on_session_unsubscribed
# # event: on_session_terminated
# # event: on_message_publish
# # event: on_message_delivered
# # event: on_message_acked
event = "on_message_publish"
# # Webhook topic.
# #
# # Value: String
# # Support on message publish
topic = "a/b/c"
}
{
event = "on_client_connack"
}
]
}
auth {
# # anonymous
# # allow anonymous login
# #
# # Hot updatable
# # Value: true | false
allow_anonymous = true
# # Allow or deny if no ACL rules matched.
# #
# # Value: allow | deny
no_match = allow
# # The action when acl check reject current operation
# #
# # Value: ignore | disconnect
# # Default: ignore
deny_action = ignore
cache = {
# # The maximum count of ACL entries can be cached for a client.
# #
# # Value: Integer greater than 0
# # Default: 32
max_size = 32
# # The time after which an ACL cache entry will be deleted
# #
# # Value: Duration
# # Default: 1 minute
ttl = 1m
}
# # This is password conf file.
# #
# # Value: path string
# # Default: "/etc/pwd.conf"
password = {include "/etc/nanomq_pwd.conf"}
# # This is acl conf file.
# #
# # Value: path string
# # Default: "/etc/acl.conf"
acl = {include "/etc/nanomq_acl.conf"}
http_auth = {
auth_req {
# # HTTP URL API path for Auth Request
# #
# # Value: URL
# #
# # Examples: http://127.0.0.1:80/mqtt/auth, https://[::1]:80/mqtt/auth
url = "http://127.0.0.1:80/mqtt/auth"
# # HTTP Request Method for Auth Request
# #
# # Value: post | get
method = post
# # HTTP Request Headers for Auth Request, Content-Type header is configured by default.
# # The possible values of the Content-Type header: application/x-www-form-urlencoded, application/json
# #
# # Examples: auth.http.auth_req.headers.accept = */*
headers.content-type = "application/x-www-form-urlencoded"
# # Parameters used to construct the request body or query string parameters
# # When the request method is GET, these parameters will be converted into query string parameters
# # When the request method is POST, the final format is determined by content-type
# #
# # Available Variables:
# # - %u: username
# # - %c: clientid
# # - %a: ipaddress
# # - %r: protocol
# # - %P: password
# # - %p: sockport of server accepted
# # - %C: common name of client TLS cert
# # - %d: subject of client TLS cert
# #
# # Value: <K1>=<V1>,<K2>=<V2>,...
params = {clientid = "%c", username = "%u", password = "%p"}
# Unsupport now
# tls {
# keyfile="/etc/certs/key.pem"
# certfile="/etc/certs/cert.pem"
# cacertfile="/etc/certs/cacert.pem"
# }
}
super_req {
url = "http://127.0.0.1:80/mqtt/superuser"
method = "post"
headers.content-type = "application/x-www-form-urlencoded"
params = {clientid = "%c", username = "%u", password = "%p"}
# Unsupport now
# tls {
# keyfile="/etc/certs/key.pem"
# certfile="/etc/certs/cert.pem"
# cacertfile="/etc/certs/cacert.pem"
# }
}
# # HTTP ACL request is unsupported.
acl_req {
url = "http://127.0.0.1:8991/mqtt/acl"
method = "post"
headers.content-type = "application/x-www-form-urlencoded"
params = {clientid = "%c", username = "%u", access = "%A", ipaddr = "%a", topic = "%t", mountpoint = "%m"}
# Unsupport now
# tls {
# keyfile="/etc/certs/key.pem"
# certfile="/etc/certs/cert.pem"
# cacertfile="/etc/certs/cacert.pem"
# }
}
# # Time-out time for the request.
# #
# # Value: Duration
# # -h: hour, e.g. '2h' for 2 hours
# # -m: minute, e.g. '5m' for 5 minutes
# # -s: second, e.g. '30s' for 30 seconds
# #
# # Default: 5s
timeout = 5s
# # Connection time-out time, used during the initial request,
# # when the client is connecting to the server.
# #
# # Value: Duration
# # -h: hour, e.g. '2h' for 2 hours
# # -m: minute, e.g. '5m' for 5 minutes
# # -s: second, e.g. '30s' for 30 seconds
# #
# # Default: 5s
connect_timeout = 5s
# # Connection process pool size
# #
# # Value: Number
pool_size = 32
}
}
# #====================================================================
# # MQTT Broker Bridge
# #====================================================================
# # Here, you can use the include syntax of HOCON to put the
# # configuration file of the bridge into nanomq_bridge.conf.
# # include "path/to/nanomq_bridge.conf"
bridges.mqtt.emqx1 {
# # Bridge address: host:port .
# #
# # Value: String
# # Example: mqtt-tcp://127.0.0.1:1883
# # tls+mqtt-tcp://127.0.0.1:8883
# # mqtt-quic://54.75.171.11:14567
server = "mqtt-tcp://127.0.0.1:1883"
# # Protocol version of the bridge.
# #
# # Value: Enum
# # - 5: mqttv5
# # - 4: mqttv311
# # - 3: mqttv31
proto_ver = 5
# # The ClientId of a remote bridge.
# # Default random string.
# #
# # Value: String
# clientid="bridge_client"
# # Ping: interval of a downward bridge.
# #
# # Value: Duration
# # Default: 10 seconds
keepalive = 60s
# # The maximum backoff timeout.
# # Reconnect after no more than backoff_max when bridge connection lost.
# #
# # Value: Duration
# # Default: 60s
backoff_max = 60s
# # The Clean start flag of a remote bridge.
# #
# # Value: boolean
# # Default: false
# #
# # NOTE: Some IoT platforms require clean_start
# # must be set to 'true'
clean_start = false
# # The username for a remote bridge.
# #
# # Value: String
username = username
# # The password for a remote bridge.
# #
# # Value: String
password = passwd
# # Properties for MQTT V5
conn_properties = {
# # Maximum Packet Size
# #
# # If the Maximum Packet Size is not present, no limit on the packet size is imposed beyond
# # the limitations in the protocol as a result of the remaining length encoding and the protocol header sizes.
# # Value: 1 ~ 4294967295
maximum_packet_size = 1024
# # Receive Maximum
# #
# # The Client uses this value to limit the number of QoS 1 and QoS 2 publications that it is willing to process concurrently.
# # There is no mechanism to limit the QoS 0 publications that the Server might try to send.
# # The value of Receive Maximum applies only to the current Network Connection.
# # If the Receive Maximum value is absent then its value defaults to 65,535.
# #
# # Value: 1 ~ 65535
receive_maximum = 65535
# # Topic Alias Maximum
# #
# # If the Topic Alias Maximum property is absent, the default value is 0.
# # This value indicates the highest value that the Client will accept as a Topic Alias sent by the Server.
# # The Client uses this value to limit the number of Topic Aliases that it is willing to hold on this Connection.
# # Default: 0
# # Value: 0 ~ 65535
topic_alias_maximum = 0
# # Request Problem Information
# #
# # If the Request Problem Information is absent, the value of 1 is used.
# # The Client uses this value to indicate whether the Reason String or User Properties are sent in the case of failures.
# # If the value of Request Problem Information is 0, the Server MAY return a Reason String or User Properties on a CONNACK or DISCONNECT packet,
# # but MUST NOT send a Reason String or User Properties on any packet other than PUBLISH, CONNACK, or DISCONNECT.
# # If the value is 0 and the Client receives a Reason String or User Properties in a packet other than PUBLISH, CONNACK, or DISCONNECT,
# # it uses a DISCONNECT packet with Reason Code 0x82 (Protocol Error) as described in section 4.13 Handling errors.
# # If this value is 1, the Server MAY return a Reason String or User Properties on any packet where it is allowed.
# #
# # Default: 1
# # Value: 0 | 1
request_problem_infomation = 1
# # Request Response Information
# #
# # If the Request Response Information is absent, the value of 0 is used.
# # The Client uses this value to request the Server to return Response Information in the CONNACK.
# # A value of 0 indicates that the Server MUST NOT return Response Information.
# # If the value is 1 the Server MAY return Response Information in the CONNACK packet.
# #
# # Default: 0
# # Value: 0 | 1
request_response_infomation = 0
# # Session Expiry Interval
# #
# # If the Session Expiry Interval is absent the value 0 is used.
# # If it is set to 0, or is absent, the Session ends when the Network Connection is closed.
# # If the Session Expiry Interval is 4294967295 (UINT_MAX), the Session does not expire.
# #
# # Value: 0 ~ 4294967295
session_expiry_interval = 0
# # User Property
# #
# # The User Property is allowed to appear multiple times to represent multiple name, value pairs.
# # The same name is allowed to appear more than once.
# # Value: Map[key(String) - value(String)]
user_property = {
key1 = value1
key2 = value2
}
}
will {
# # Will topic
topic = "will_topic"
# # Will QoS
qos = 1
# # Will paylad retain flag
retain = false
# # Will payload
payload = "will_message"
# # Will properties
properties = {
# # Payload Format Indicator
# #
# # 0 (0x00) Byte Indicates that the Will Message is unspecified bytes,
# # which is equivalent to not sending a Payload Format Indicator.
# #
# # 1 (0x01) Byte Indicates that the Will Message is UTF-8 Encoded Character Data.
# #
# # Default: 0
# # Value: 0 | 1
payload_format_indicator = 0
# # Message Expiry Interval
# #
# # If present, the Four Byte value is the lifetime of the Will Message in seconds
# # and is sent as the Publication Expiry Interval when the Server publishes the Will Message.
# #
# # If absent, no Message Expiry Interval is sent when the Server publishes the Will Message.
message_expiry_interval = 0
# # Content Type
# # The value of the Content Type is defined by the sending and receiving application.
content_type = ""
# # Response Topic
# # The presence of a Response Topic identifies the Will Message as a Request.
response_topic = ""
# # Correlation Data
# # The Correlation Data is used by the sender of the Request Message to identify which request
# # the Response Message is for when it is received.
correlation_data = ""
# # Will Delay Interval
# #
# # If the Will Delay Interval is absent, the default value is 0 and there is no delay
# # before the Will Message is published.
# #
# # The Server delays publishing the Clients Will Message until the Will Delay Interval
# # has passed or the Session ends, whichever happens first.
# # If a new Network Connection to this Session is made before the Will Delay Interval has passed, the Server MUST NOT send the Will Message
will_delay_interval = 0
# # User Property
# #
# # The User Property is allowed to appear multiple times to represent multiple name, value pairs.
# # The same name is allowed to appear more than once.
# # Value: Map[key(String) - value(String)]
user_property = {
key1 = value1
key2 = value2
}
}
}
# # Ssl config ##
## ssl {
## # # Ssl key password
## # # String containing the user's password. Only used if the private keyfile
## # # is password-protected.
## # #
## # # Value: String
## key_password = "yourpass"
## # # Ssl keyfile
## # # Path of the file containing the client's private key.
## # #
## # # Value: File
## keyfile = "/etc/certs/key.pem"
## # # Ssl cert file
## # # Path of the file containing the client certificate.
## # #
## # # Value: File
## certfile = "/etc/certs/cert.pem"
## # # Ssl ca cert file
## # # Path of the file containing the server's root CA certificate.
## # #
## # # Value: File
## cacertfile = "/etc/certs/cacert.pem"
##}
# # Topics that need to be forward to IoTHUB
# #
# # Value: String
forwards = [
{
# # This is for Topic reflection, if you want the vanila way:
# # Leave `remote_topic=""` to preserve the original topic in msg
# #
# # Value: String
remote_topic = "fwd/topic1"
# # The topic filter of which to forward to remote broker
# #
# # Local topic means the original topic of locale publish msg
# # msgs from local_topic will be reflected to remote_topic
# # This must present to enable the forwarding of bridging
# # Value: String
local_topic = "topic1"
# # Retain is used to override the ratain flag in the msg is about
# # to forward to remote. (0|1) stand for override the retain flag with (0|1).
# # 2 or not set this value will keep retain flag as it is.
# # Value: Number (0|1|2)
# # Default: 2
# retain = 2
# # Prefix string adds to the remote topic.(or original topic if you leave remote_topic as "")
# # Value: String
# # Default: NULL
# prefix = ""
# # Suffix string adds to the remote topic.(or original topic if you leave remote_topic as "")
# # Value: String
# # Default: NULL
# suffix = ""
}
{
remote_topic = "fwd/topic2"
local_topic = "topic2"
}
]
# #--------------------------------------------------------------------
# # The following config params only effective when set QUIC as the
# # transport layer of bridging connection (mqtt-quic://{host}:{port})!
# #
# # Ping: interval of a sending keepalive packet via QUIC transport.
# #
# # Value: Duration
# # Default: 120 seconds
quic_keepalive = 120s
# # Idle Timeout: How long a connection can go idle before it is gracefully shut down.
# # 0 to disable timeout, which may lost disconnect event msg.
# # Value: Duration
# # Default: 120 seconds
quic_idle_timeout = 120s
# # Disconnect Timeout: How long to wait for an ACK before declaring
# # a path dead and disconnecting, This affects stream living time.
# # Value: Duration
# # Default: 20 seconds
quic_discon_timeout = 20s
# # Handshake Timeout: the Max time NanoMQ waits for establishing QUIC connection
# # How long a handshake can idle before it is discarded
# # Value: Duration
# # Default: 60 seconds
quic_handshake_timeout = 60s
# # Send Idle Timeout: Reset congestion control after being idle `SendIdleTimeout`
# # Value: Duration
# # Default: 60 seconds
quic_send_idle_timeout = 2s
# # Initial RTT: Initial RTT estimate. (ms)
# # RTT: round trip time
# # Default: 800ms
quic_initial_rtt_ms = 800ms
# # Max Ack Delay: How long to wait after receiving data before sending an ACK.
# # Value: Duration
# # Default: 100ms
quic_max_ack_delay_ms = 100ms
# # multi-stream mode: enable or disable the multi-stream bridging mode
# # Warning: This is a feature WIP. Do not enable it!
# # Value: True/False
# # Default: False
quic_multi_stream = false
# # qos_priority: send QoS 1/2 msg in high prority
# # QoS 0 messages remain as same
# # Value: true/false
# # Default: true
quic_qos_priority = true
# # 0RTT: enable or diable 0RTT, 0RTT is a feature of QUIC to re-establish
# # connection quickly.
# # Value: true/false
# # Default: true
quic_0rtt = true
subscription = [
{
# # The topic filter of which subscribe to remote broker
# # This must present to enable the subscription of bridging
# #
# # Value: String
remote_topic = "cmd/topic3"
# # This is for Topic reflection, if you want the vanila way:
# # Leave `local_topic=""` to preserve the original topic in msg
# # Value: String
local_topic = "topic3"
# # Need to subscribe to remote topics QoS.
# # Please set QoS for each subscription topic
# # otherwise topic is invalid, NanoMQ won't sub to any topic
# # Value: Number
qos = 1
# # Retain is used to override the ratain flag in the msg is about
# # to forward to local. (0|1) stand for override the retain flag with (0|1).
# # 2 or not set this value will keep retain flag as it is.
# # Value: Number (0|1|2)
# # Default: 2
# # retain = 2
# # Retain As Published is used to tell broker what to do with retain flag.
# # If 1, message forwarded using this subscription have the RETAIN flag they were published with.
# # If 0, message forwarded using this subscription have the RETAIN flag set to 0.
# # Value: Number (0|1)
retain_as_published = 1
# # Retain Handling is used to tell broker whether retain message should be sent.
# # If Retain Handing is set to 0, send all retain messages.
# # If Retain Handing is set to 1, send retain messages only if this subscription is not already exist. Otherwise do not send.
# # If Retain Handing is set to 2, do not send any retain message.
# # Value: Number (0|1|2)
retain_handling = 2
# # Prefix string adds to the local topic.(or original topic if you leave local_topic as "")
# # Value: String
# # Default: NULL
# prefix = ""
# # Suffix string adds to the local topic.(or original topic if you leave local_topic as "")
# # Value: String
# # Default: NULL
# suffix = ""
}
{
remote_topic = "cmd/topic4"
local_topic = "topic4"
qos = 2
}
]
# # Properties of subscribe for MQTT V5
sub_properties {
# # Subscription Identifier
# #
# # The Subscription Identifier can have the value of 1 to 268,435,455.
# # It is a Protocol Error if the Subscription Identifier has a value of 0.
# # It is a Protocol Error to include the Subscription Identifier more than once.
# # The Subscription Identifier is associated with any subscription created or modified as the result of this SUBSCRIBE packet.
# # If there is a Subscription Identifier, it is stored with the subscription.
# # If this property is not specified, then the absence of a Subscription Identifier is stored with the subscription.
# #
# # Value: 1 ~ 268,435,455
identifier = 1
# # User Property
# #
# # The User Property is allowed to appear multiple times to represent multiple name, value pairs.
# # The same name is allowed to appear more than once.
# #
# # Value: Map[key(String) - value(String)]
user_property = {
key1 = value1
key2 = value2
}
}
# # Hybrid bridging: enable or disable the hybrid bridging mode
# # Value: True/False
# # Default: False
hybrid_bridging = false
# # Hybrid servers
# # When hybrid mode is enabled and the connection to server is
# # disconnected. Bridge will switch to hybrid_servers in roundrobin.
# # Value: Array
# # Default: []
hybrid_servers = ["mqtt-quic://127.1:14567", "mqtt-tcp://127.1:1883"]
# # max_parallel_processes
# # Handle a specified maximum number of outstanding requests
# #
# # Value: 1-infinity
max_parallel_processes = 2
# # max send queue length
# # Handle a specified maximum number of message send queue length
# #
# # Value: 1-infinity
max_send_queue_len = 32
# # max receive queue length
# # Handle a specified maximum number of message receive queue length
# #
# # Value: 1-infinity
max_recv_queue_len = 128
# # Resend interval (ms)
# # The interval for resending the messages after failure recovered. (not related to trigger)
# # move from cache to bridge since 0.22.8
# # Value: 1-infinity (uint64)
resend_interval = 5000
# # Resend wait time (ms)
# # The waiting time for resending the messages after it is publiushed.
# # Tips: set it longer than keepalive if you dont want too much duplicated msg
# # Value: 1-infinity (uint64)
resend_wait = 3000
# # max Ack wait time for each QoS msg (ms)
# # The waiting time for Acknowledgment of every QoS msg. Does not affect normal sending.
# # Tips: QoS msg requries a delivered ack, which occupies an AIO.
# # set a max timeout time to cancel the ack action.
# # once it is canceled, there is no more retrying of this msg.
# # Value: 1-infinity (uint64)
cancel_timeout = 8000
}
# # The configuration of this cache is shared by all MQTT bridges.
bridges.mqtt.cache {
# # Max message limitation for caching
# # ( 0 means ineffective )
# # Value: 1-infinity
disk_cache_size = 102400
# # Mounted file path
# #
# # Value: path
# mounted_file_path="/tmp/"
# # The threshold of flushing messages to flash.
# #
# # Value: 1-infinity
flush_mem_threshold = 100
}
# #====================================================================
# # AWS IoT Core Bridge
# #====================================================================
bridges.aws.c1 {
# # Aws address: host:port .
# #
# # Value: String
server = "127.0.0.1:8883"
# # Protocol version of the bridge.
# #
# # Value: Enum
# # - 5: mqttv5
# # - 4: mqttv311
proto_ver = 4
# # The ClientId of a remote bridge.
# # Default random string.
# #
# # Value: String
clientid = "aws_bridge_client"
# # Ping interval of a down bridge.
# #
# # Value: Duration
# # Default: 10 seconds
keepalive = 60s
# # The Clean start flag of a remote bridge.
# #
# # Value: boolean
# # Default: true
# #
# # NOTE: Some IoT platforms require clean_start
# # must be set to 'true'
clean_start = true
# # The username for a remote bridge.
# #
# # Value: String
# username = "username"
# # The password for a remote bridge.
# #
# # Value: String
# password = "passwd"
# ssl {
# # # Ssl key password
# # # String containing the user's password. Only used if the private keyfile
# # # is password-protected.
# # #
# # # Value: String
# key_password = "yourpass"
# # # Ssl keyfile
# # # Path of the file containing the client's private key.
# # #
# # # Value: File
# keyfile = "/etc/certs/key.pem"
# # # Ssl cert file
# # # Path of the file containing the client certificate.
# # #
# # # Value: File
# certfile = "/etc/certs/cert.pem"
# # # Ssl ca cert file
# # # Path of the file containing the server's root CA certificate.
# # #
# # # This certificate is used to identify the AWS IoT server and is publicly
# # # available.
# # #
# # # Value: File
# cacertfile = "/etc/certs/cacert.pem"
# }
# # Topics that need to be forward to IoTHUB
# #
# # Value: String
forwards = [
{
# # Need to forward to remote broker topics
# #
# # Value: String
remote_topic = "fwd/topic1"
# # topic reflection with remote_topic
# #
# # Value: String
local_topic = "topic1"
}
{
remote_topic = "fwd/topic2"
local_topic = "topic2"
}
]
subscription = [
{
# # Need to subscribe to remote broker topics
# #
# # Value: String
remote_topic = "cmd/topic1"
# # topic reflection with remote_topic
# #
# # Value: String
local_topic = "topic1"
# # Need to subscribe to remote topics QoS.
# #
# # Value: Number
qos = 1
},
{
remote_topic = "cmd/topic2"
local_topic = "topic2"
qos = 2
}
]
# # max_parallel_processes
# # Handle a specified maximum number of outstanding requests
# #
# # Value: 1-infinity
max_parallel_processes = 2
# # Ssl config ##
# # Ssl config is invalid when working in MQTT over QUIC mode ##
}
# #============================================================
# # MQTT Rule Engine
# #============================================================
rules.sqlite {
# # Rule engine option SQLite3 database path
# # Rule engine db path, default is exec path.
# #
# # Value: File
path = "/tmp/sqlite_rule.db"
rules = [
{
# # Rule engine option sql
# # Rule engine sql clause.
# #
# # Value: String
sql = "SELECT payload.x.y as y, payload.z as z FROM \"#\" WHERE y > 10 and z != 'str'"
# # Rule engine option SQLite3 database table name
# # Rule engine db table name.
# #
# # Value: String
table = broker
},
{
sql = "SELECT topic, payload FROM \"abc\""
table = broker1
}
]
}
# #====================================================================
# # MQTT Rule Engine for Repub
# #====================================================================
rules.repub {
rules = [
{
# # Repub address: host:port .
# #
# # Value: String
# # Example: mqtt-tcp://127.0.0.1:1883
server = "mqtt-tcp://localhost:1883"
# # Repub topic .
# #
# # Value: String
# # Example: topic/repub
topic = "topic/repub1"
# # Protocol version of the Repub.
# #
# # Value: Enum
# # - 5: mqttv5
# # - 4: mqttv311
# # - 3: mqttv31
proto_ver = 4
# # The ClientId of a Repub client.
# # Default random string.
# #
# # Value: String
clientid = "repub_client1"
# # Ping interval of a Repub client.
# #
# # Value: Duration
# # Default: 60 seconds
keepalive = 60s
# # The Clean start flag of a Repub client.
# #
# # Value: boolean
# # Default: true
# #
# # NOTE: Some IoT platforms require clean_start
# # must be set to 'true'
clean_start = true
# # The username for a Repub client.
# #
# # Value: String
username = username
# # The password for a Repub.
# #
# # Value: String
password = passwd
# # Rule engine option sql
# # Rule engine sql clause.
# #
# # Value: String
sql = "SELECT payload.x.y as y, payload.z as z FROM \"#\" WHERE y > 10 and z != 'str'"
},
{
server = "mqtt-tcp://localhost:1883"
topic = "topic/repub2"
proto_ver = 4
clientid = "repub_client2"
keepalive = 60s
clean_start = true
username = username
password = passwd
sql = "SELECT topic, payload FROM \"abc\""
}
]
}
# #====================================================================
# # MQTT Rule Engine for Mysql
# #====================================================================
# # Currently, MySQL rule only supports the configuration of one database.
rules.mysql.mysql_rule_db {
conn = {
# # The host for a mqsql client.
# #
# # Value: String
host = localhost
# # The username for a mqsql client.
# #
# # Value: String
username = username
# # The password for a mysql client.
# #
# # Value: String
password = password
# # Rule engine option mysql database name
# # Rule engine db path, default is exec path.
# #
# # Value: File
database = db_name
}
rules = [
{
# # Rule engine option mysql database table name
# # Rule engine db table name.
# #
# # Value: String
table = broker
# # Rule engine option sql
# # Rule engine sql clause.
# #
# # Value: String
sql = "SELECT payload.x.y as y, payload.z as z FROM \"#\" WHERE y > 10 and z != 'str'"
},
{
table = broker1
sql = "SELECT * FROM \"abc\""
}
]
}
# #====================================================================
# # Exchange configuration for Embedded Messaging Queue
# #====================================================================
# # Initalize multiple MQ exchanger by giving them different name (mq1)
exchange_client.mq1 {
# # Currently NanoMQ only support one MQ object. URL shall be exactly same.
exchange_url = "tcp://127.0.0.1:10000"
# # exchanges contains multiple MQ exchanger
exchange {
# # MQTT Topic for filtering messages and saving to queue
topic = "exchange/topic1",
# # MQ name
name = "exchange_no1",
# # MQ category. Only support Ringbus for now
ringbus = {
# # ring buffer name
name = "ringbus",
# # max length of ring buffer (msg count)
cap = 1000,
# # 0: RB_FULL_NONE: When the ringbus is full, no action is taken and the message enqueue fail
# # 1: RB_FULL_DROP: When the ringbus is full, the data in the ringbus is discarded
# # 2: RB_FULL_RETURN: When the ringbus is full, the data in the ringbus is taken out and returned to the aio
# # 3: RB_FULL_FILE: When the ringbus is full, the data in the ringbus is written to the file
#
# # Value: 0-4
# # Default: 0
fullOp = 2
}
}
}
# #====================================================================
# # Parquet configuration (Apply to Exchange/Messaging_Queue)
# #====================================================================
parquet {
# # Parquet compress type.
# #
# # Value: uncompressed | snappy | gzip | brotli | zstd | lz4
compress = uncompressed
# # Encryption options
encryption {
# # Set a key retrieval metadata.
# #
# # Value: String
key_id = kf
# # Parquet encryption key.
# #
# # Value: String key must be either 16, 24 or 32 bytes.
key = "0123456789012345"
# # Set encryption algorithm. If not called, files
# # will be encrypted with AES_GCM_V1 (default).
# #
# # Value: AES_GCM_CTR_V1 | AES_GCM_V1
type = AES_GCM_V1
}
# # The dir for parquet files.
# #
# # Value: Folder
dir = "/tmp/nanomq-parquet"
# # The prefix of parquet files written.
# #
# # Value: string
file_name_prefix = ""
# # Maximum rotation count of parquet files.
# #
# # Value: Number
# # Default: 5
file_count = 5
# # The max size of parquet file written.
# #
# # Default: 10M
# # Value: Number
# # Supported Unit: KB | MB | GB
file_size = 1KB
# # The max number of searches per second.
# #
# # Default: 5
# # Value: Number
limit_frequency = 5
}
plugin {
libs = [{
path = "/path/to/plugin_user_property.so"
}]
}