1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
[]
# Bridge state publishing (LWT on remote broker)
= "a/node_123/bridge_state" # topic on remote broker
= "1" # payload when connected
= "0" # LWT payload when disconnected
# Local broker configuration (Broker A)
[]
= "127.0.0.1:1883"
= "convoy-local"
= 3600
= false
= 100
# username = "local_user" # optional
# password = "local_pass" # optional
# TLS is supported for local broker as well if needed
# [bridge.local.tls]
# ca_file = "/etc/ssl/certs/ca-certificates.crt"
# Remote broker configuration (Broker B)
[]
= "mqtt.example.com:8883"
= "convoy-remote"
= 90
= false
= "edge_device_01"
= "secure_password"
# QoS 1/2 messages allowed in-flight before ack
# Lower = more durable (fewer messages lost on crash), higher = more throughput
# With SQLite cache, keep this low (2-10) to maximize reliability
= 2
# TLS for remote connection (native-tls)
[]
# CA certificate to verify the remote broker's certificate
# Use system CA bundle on most Linux systems:
= "/etc/ssl/certs/ca-certificates.crt"
# Or specify a custom CA certificate:
# ca_file = "/etc/convoy/ca.crt"
# Optional: mTLS with PKCS12 client certificate for mutual authentication
# client_cert = "/etc/convoy/client.p12"
# client_password = "password"
# DANGER: Disable certificate verification (INSECURE - for testing only!)
# danger_accept_invalid_certs = false
#
# Note: On macOS, native-tls may not honor custom CA certificates provided via ca_file
# due to limitations in macOS Security.framework. If you encounter "certificate not trusted"
# errors with a valid custom CA, you can either:
# 1. Add the CA to the macOS system keychain (recommended for development)
# 2. Set danger_accept_invalid_certs = true (insecure, for local testing only)
# 3. Use a certificate signed by a system-trusted CA (recommended for production)
# Topics to forward LOCAL -> REMOTE (with caching)
# Maps local topic to <remote_prefix>/<local_topic>
[[]]
= "u/#"
= "a/node_123/"
= 1
# Topics to forward REMOTE -> LOCAL (no caching)
# Strips remote_prefix from remote topic before forwarding to local
[[]]
= "a/node_123/d/#"
= "a/node_123/" # strip this prefix
= 1
# -------------------------
# SQLite cache (for A→B only)
# -------------------------
[]
= "/tmp/cache.db"
# Cache policy
= false # cache QoS0? (default false)
= 500000 # hard cap to avoid unbounded growth
= "drop_oldest" # "drop_oldest" | "reject_new"
# Replay behavior
= 10 # messages per replay batch
= 100 # replay tick interval
= 5000 # SQLite busy timeout
# SQLite durability
= "FULL" # "FULL" | "NORMAL" | "OFF"