Configuração Docker Compose | MQTT EMQX | Broker
- Configuração Docker Compose | MQTT EMQX | Broker
Exemplo
version: "3.9"
services:
# ===============================
# EMQX NODE 1
# ===============================
emqx1:
image: emqx:5.8.8
container_name: emqx1
restart: unless-stopped
environment:
- EMQX_NODE_NAME=emqx@node1.emqx.io
- EMQX_CLUSTER__DISCOVERY_STRATEGY=static
- EMQX_CLUSTER__STATIC__SEEDS=[emqx@node1.emqx.io,emqx@node2.emqx.io]
- EMQX_NODE__COOKIE=superclustersecret
# Dashboard
- EMQX_DASHBOARD__DEFAULT_USERNAME=admin
- EMQX_DASHBOARD__DEFAULT_PASSWORD=admin123
- EMQX_ALLOW_ANONYMOUS=false
# ===============================
# PostgreSQL Authentication
# ===============================
- EMQX_AUTHENTICATION__1__ENABLE=true
- EMQX_AUTHENTICATION__1__MECHANISM=password_based
- EMQX_AUTHENTICATION__1__BACKEND=postgresql
- EMQX_AUTHENTICATION__1__SERVER=postgres:5432
- EMQX_AUTHENTICATION__1__DATABASE=emqx
- EMQX_AUTHENTICATION__1__USERNAME=emqx
- EMQX_AUTHENTICATION__1__PASSWORD_HASH_ALGORITHM__NAME=plain
- EMQX_AUTHENTICATION__1__PASSWORD=emqxpass
- EMQX_AUTHENTICATION__1__QUERY=SELECT password FROM mqtt_user WHERE username = '${username}' LIMIT 1
# ===============================
# JWT Authentication (HMAC)
# ===============================
- EMQX_AUTHENTICATION__2__ENABLE=true
- EMQX_AUTHENTICATION__2__MECHANISM=jwt
- EMQX_AUTHENTICATION__2__USE_JWKS=false
- EMQX_AUTHENTICATION__2__ALGORITHM=hmac-based
- EMQX_AUTHENTICATION__2__SECRET=supersecretjwt
- EMQX_AUTHORIZATION__NO_MATCH=deny
depends_on:
- postgres
healthcheck:
test: ["CMD", "/opt/emqx/bin/emqx", "ctl", "status"]
interval: 5s
timeout: 25s
retries: 5
volumes:
- emqx_data:/opt/emqx/data
- emqx_log:/opt/emqx/log
networks:
emqx-bridge:
aliases:
- node1.emqx.io
ports:
- "1883:1883"
- "8883:8883"
- "18083:18083"
# ===============================
# EMQX NODE 2
# ===============================
emqx2:
image: emqx:5.8.8
container_name: emqx2
restart: unless-stopped
environment:
- EMQX_NODE_NAME=emqx@node2.emqx.io
- EMQX_CLUSTER__DISCOVERY_STRATEGY=static
- EMQX_CLUSTER__STATIC__SEEDS=[emqx@node1.emqx.io,emqx@node2.emqx.io]
- EMQX_NODE__COOKIE=superclustersecret
healthcheck:
test: ["CMD", "/opt/emqx/bin/emqx", "ctl", "status"]
interval: 5s
timeout: 25s
retries: 5
networks:
emqx-bridge:
aliases:
- node2.emqx.io
# ===============================
# POSTGRESQL
# ===============================
postgres:
image: postgres:15
container_name: emqx_postgres
restart: unless-stopped
environment:
POSTGRES_USER: emqx
POSTGRES_PASSWORD: emqxpass
POSTGRES_DB: emqx
volumes:
- pg_data:/var/lib/postgresql/data
networks:
- emqx-bridge
networks:
emqx-bridge:
driver: bridge
volumes:
pg_data:
emqx_data:
emqx_log:
Visão Geral
O EMQX é um broker MQTT de alto desempenho projetado para suportar milhões de conexões simultâneas. Ele pode ser executado facilmente usando Docker Compose, permitindo configurar listeners, autenticação, cluster e limites operacionais por meio de variáveis de ambiente.
O protocolo MQTT utiliza o modelo publish/subscribe, no qual clientes publicam mensagens em tópicos e outros clientes podem se inscrever nesses tópicos para receber eventos.
Arquitetura básica:
Client (Publisher) ──► MQTT Broker (EMQX) ──► Client (Subscriber)
Características do MQTT:
- Comunicação leve
- Baixo consumo de banda
- Conexões persistentes
- Escalabilidade para milhares de clientes
Propriedades Comuns do EMQX no docker-compose
| Propriedade | Descrição | Valores possíveis |
|---|---|---|
EMQX_NAME | Nome do nó do broker | emqx, mqtt-broker |
EMQX_HOST | Hostname usado no cluster | node1.emqx.local |
EMQX_NODE_NAME | Identificador completo do nó | emqx@hostname |
EMQX_CLUSTER__DISCOVERY_STRATEGY | Estratégia de descoberta do cluster | static, dns, etcd, k8s, manual |
EMQX_CLUSTER__STATIC__SEEDS | Lista de nós do cluster | ["emqx@node1","emqx@node2"] |
EMQX_LISTENER__TCP__EXTERNAL | Listener MQTT TCP | 1883, 0.0.0.0:1883 |
EMQX_LISTENER__SSL__EXTERNAL | Listener MQTT TLS | 8883 |
EMQX_LISTENER__WS__EXTERNAL | MQTT via WebSocket | 8083 |
EMQX_LISTENER__WSS__EXTERNAL | MQTT via WebSocket TLS | 8084 |
EMQX_DASHBOARD__DEFAULT_USERNAME | Usuário do painel administrativo | admin |
EMQX_DASHBOARD__DEFAULT_PASSWORD | Senha do painel administrativo | string |
EMQX_ALLOW_ANONYMOUS | Permite conexões sem autenticação | true / false |
EMQX_AUTH__USER__PASSWORD_HASH | Algoritmo de hash de senha | sha256, bcrypt, plain |
EMQX_MAX_CONNECTIONS | Número máximo de conexões simultâneas | inteiro |
EMQX_MQTT__MAX_PACKET_SIZE | Tamanho máximo do payload MQTT | 1MB, 10MB |
EMQX_MQTT__KEEPALIVE | Intervalo padrão de keepalive | segundos |
EMQX_MQTT__SESSION_EXPIRY_INTERVAL | Tempo de expiração de sessão | segundos |
EMQX_MQTT__RETAIN_AVAILABLE | Permite mensagens retained | true / false |
EMQX_MQTT__MAX_TOPIC_ALIAS | Número máximo de aliases MQTT 5 | inteiro |
EMQX_LOG__LEVEL | Nível de log do broker | debug, info, warning, error |
EMQX_LOG__CONSOLE_HANDLER__LEVEL | Nível de log no console | debug, info, warning, error |
EMQX_AUTHORIZATION__NO_MATCH | Política de autorização padrão | allow, deny |
Configuração de Autenticação no EMQX 5
No EMQX 5, a autenticação é definida como uma lista ordenada de autenticadores.
Cada autenticador possui um índice:
EMQX_AUTHENTICATION__1__
EMQX_AUTHENTICATION__2__
EMQX_AUTHENTICATION__3__
Estrutura da configuração:
EMQX_AUTHENTICATION__<indice>__<propriedade>
Exemplo:
EMQX_AUTHENTICATION__1__ENABLE=true
Componentes da variável:
| Parte | Significado |
|---|---|
AUTHENTICATION | seção de autenticação |
<indice> | posição na lista de autenticadores |
<propriedade> | configuração específica |
Fluxo de autenticação:
Cliente conecta
│
▼
Autenticador 1
│
├ sucesso → conexão aceita
│
└ falha → Autenticador 2
│
▼
Autenticador 3
Mecanismos de Autenticação
| Mechanism | Descrição |
|---|---|
password_based | autenticação com usuário e senha |
jwt | autenticação usando JSON Web Token |
scram | autenticação SCRAM |
certificate | autenticação por certificado TLS |
Backends Disponíveis (password_based)
| Backend | Uso |
|---|---|
built_in_database | banco interno do EMQX |
http | API externa |
mysql | banco MySQL |
postgresql | banco PostgreSQL |
mongodb | MongoDB |
redis | Redis |
ldap | diretório LDAP |
Exemplo de Autenticação JWT
EMQX_AUTHENTICATION__1__ENABLE=true
EMQX_AUTHENTICATION__1__MECHANISM=jwt
EMQX_AUTHENTICATION__1__SECRET=mysecret
Fluxo:
Cliente MQTT
│
▼
Token JWT enviado
│
▼
EMQX valida assinatura
│
├ válido → conexão aceita
└ inválido → conexão rejeitada
Exemplo de Autenticação com Banco Interno
EMQX_AUTHENTICATION__1__ENABLE=true
EMQX_AUTHENTICATION__1__MECHANISM=password_based
EMQX_AUTHENTICATION__1__BACKEND=built_in_database
Exemplo de Autenticação via API
EMQX_AUTHENTICATION__1__ENABLE=true
EMQX_AUTHENTICATION__1__MECHANISM=password_based
EMQX_AUTHENTICATION__1__BACKEND=http
EMQX_AUTHENTICATION__1__URL=[http://api:5000/mqtt/auth](http://api:5000/mqtt/auth)
Fluxo:
Cliente MQTT
│
▼
EMQX
│
▼
HTTP Request → API
│
├ 200 → permitido
└ 401 → negado
Exemplo com Múltiplos Autenticadores
EMQX_AUTHENTICATION__1__ENABLE=true
EMQX_AUTHENTICATION__1__MECHANISM=jwt
EMQX_AUTHENTICATION__1__SECRET=mysecret
EMQX_AUTHENTICATION__2__ENABLE=true
EMQX_AUTHENTICATION__2__MECHANISM=password_based
EMQX_AUTHENTICATION__2__BACKEND=built_in_database
Fluxo:
JWT → Database
Exemplo de docker-compose com EMQX
version: "3"
services:
emqx:
image: emqx/emqx:5
container_name: emqx
ports:
- "1883:1883"
- "8083:8083"
- "8084:8084"
- "18083:18083"
environment:
EMQX_NAME: emqx
EMQX_HOST: node1.emqx.local
EMQX_ALLOW_ANONYMOUS: "false"
EMQX_DASHBOARD__DEFAULT_USERNAME: admin
EMQX_DASHBOARD__DEFAULT_PASSWORD: public
EMQX_LISTENER__TCP__EXTERNAL: 0.0.0.0:1883
EMQX_MAX_CONNECTIONS: 100000
EMQX_LOG__LEVEL: info
Portas Padrão do EMQX
| Porta | Uso |
|---|---|
| 1883 | MQTT TCP |
| 8883 | MQTT TLS |
| 8083 | MQTT WebSocket |
| 8084 | MQTT WebSocket TLS |
| 18083 | Dashboard administrativo |
Propriedades Importantes para Arquiteturas com Muitos Clientes
Para cenários com milhares de clientes conectados:
| Propriedade | Motivo |
|---|---|
EMQX_MAX_CONNECTIONS | controla limite de conexões |
EMQX_MQTT__SESSION_EXPIRY_INTERVAL | mantém sessões offline |
EMQX_MQTT__MAX_PACKET_SIZE | limita tamanho do payload |
EMQX_ALLOW_ANONYMOUS | controla segurança |
EMQX_LISTENER__TCP__EXTERNAL | porta principal MQTT |
EMQX_CLUSTER__DISCOVERY_STRATEGY | permite escalar cluster |
Ajustes para Alta Escala
Para ambientes com 6000 a 20000 conexões simultâneas, recomenda-se ajustar:
EMQX_MAX_CONNECTIONS=200000
EMQX_NODE__PROCESS_LIMIT=2097152
Essas propriedades aumentam o limite de processos da VM Erlang utilizada pelo EMQX.