Skip to main content

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

PropriedadeDescriçãoValores possíveis
EMQX_NAMENome do nó do brokeremqx, mqtt-broker
EMQX_HOSTHostname usado no clusternode1.emqx.local
EMQX_NODE_NAMEIdentificador completo do nóemqx@hostname
EMQX_CLUSTER__DISCOVERY_STRATEGYEstratégia de descoberta do clusterstatic, dns, etcd, k8s, manual
EMQX_CLUSTER__STATIC__SEEDSLista de nós do cluster["emqx@node1","emqx@node2"]
EMQX_LISTENER__TCP__EXTERNALListener MQTT TCP1883, 0.0.0.0:1883
EMQX_LISTENER__SSL__EXTERNALListener MQTT TLS8883
EMQX_LISTENER__WS__EXTERNALMQTT via WebSocket8083
EMQX_LISTENER__WSS__EXTERNALMQTT via WebSocket TLS8084
EMQX_DASHBOARD__DEFAULT_USERNAMEUsuário do painel administrativoadmin
EMQX_DASHBOARD__DEFAULT_PASSWORDSenha do painel administrativostring
EMQX_ALLOW_ANONYMOUSPermite conexões sem autenticaçãotrue / false
EMQX_AUTH__USER__PASSWORD_HASHAlgoritmo de hash de senhasha256, bcrypt, plain
EMQX_MAX_CONNECTIONSNúmero máximo de conexões simultâneasinteiro
EMQX_MQTT__MAX_PACKET_SIZETamanho máximo do payload MQTT1MB, 10MB
EMQX_MQTT__KEEPALIVEIntervalo padrão de keepalivesegundos
EMQX_MQTT__SESSION_EXPIRY_INTERVALTempo de expiração de sessãosegundos
EMQX_MQTT__RETAIN_AVAILABLEPermite mensagens retainedtrue / false
EMQX_MQTT__MAX_TOPIC_ALIASNúmero máximo de aliases MQTT 5inteiro
EMQX_LOG__LEVELNível de log do brokerdebug, info, warning, error
EMQX_LOG__CONSOLE_HANDLER__LEVELNível de log no consoledebug, info, warning, error
EMQX_AUTHORIZATION__NO_MATCHPolítica de autorização padrãoallow, 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:

ParteSignificado
AUTHENTICATIONseçã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

MechanismDescrição
password_basedautenticação com usuário e senha
jwtautenticação usando JSON Web Token
scramautenticação SCRAM
certificateautenticação por certificado TLS

Backends Disponíveis (password_based)

BackendUso
built_in_databasebanco interno do EMQX
httpAPI externa
mysqlbanco MySQL
postgresqlbanco PostgreSQL
mongodbMongoDB
redisRedis
ldapdiretó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

PortaUso
1883MQTT TCP
8883MQTT TLS
8083MQTT WebSocket
8084MQTT WebSocket TLS
18083Dashboard administrativo

Propriedades Importantes para Arquiteturas com Muitos Clientes

Para cenários com milhares de clientes conectados:

PropriedadeMotivo
EMQX_MAX_CONNECTIONScontrola limite de conexões
EMQX_MQTT__SESSION_EXPIRY_INTERVALmantém sessões offline
EMQX_MQTT__MAX_PACKET_SIZElimita tamanho do payload
EMQX_ALLOW_ANONYMOUScontrola segurança
EMQX_LISTENER__TCP__EXTERNALporta principal MQTT
EMQX_CLUSTER__DISCOVERY_STRATEGYpermite 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.