Uma instalação do IOTstack no Raspberry Pi entrega Node-RED, InfluxDB e Grafana como contêineres Docker que você pode reconstruir, atualizar e fazer backup com poucos comandos. Neste tutorial você vai instalar o IOTstack, selecionar os contêineres de que precisa, conectar o Node-RED a um broker MQTT externo em vez de um contêiner local do Mosquitto, armazenar leituras no InfluxDB e criar gráficos no Grafana. Ao final, você terá uma stack reproduzível e uma ideia clara do que deve ficar no Pi e do que não deve.
O que é o IOTstack e por que ele ajuda
O IOTstack é um projeto da comunidade que envolve o Docker Compose em um menu. Você escolhe os serviços em uma lista, ele gera um docker-compose.yml com volumes e portas sensatos e você inicia tudo com um único comando. As vantagens em relação a instalar cada ferramenta nativamente são reais:
- Isolamento. A versão do Node.js do Node-RED não entra em conflito com mais nada no Pi.
- Reprodutibilidade. A stack inteira é descrita em um arquivo mais uma pasta
volumes. Copie os dois para um novo Pi e você volta a operar. - Atualizações limpas. Baixe uma imagem mais nova, recrie o contêiner e volte atrás se algo der errado.
O menu também oferece um contêiner do Mosquitto, e muitos guias o instalam por reflexo. Pense se você precisa dele. Um broker local só atende dispositivos que conseguem alcançar o Pi. Se seus sensores estão em mais de um lugar, se você quer acessar os dados pelo celular sem abrir portas ou se simplesmente não quer manter a segurança do broker por conta própria, um broker externo é a melhor escolha. Aqui usamos o broker na nuvem da ConnectMQ, e o Pi se torna um nó puro de processamento e armazenamento.
| Serviço | Contêiner neste tutorial | Porta |
|---|---|---|
| Node-RED | Sim | 1880 |
| InfluxDB 1.8 | Sim | 8086 |
| Grafana | Sim | 3000 |
| Portainer CE | Opcional | 9000 |
| Mosquitto | Não, substituído por um broker na nuvem | n/a |
Instale o IOTstack no Raspberry Pi
Comece com o Raspberry Pi OS Lite ou Desktop, 64 bits, totalmente atualizado. O instalador do IOTstack configura o Docker, o plugin do Compose e a pasta do IOTstack no seu diretório home:
sudo apt update && sudo apt full-upgrade -y
curl -fsSL https://raw.githubusercontent.com/SensorsIot/IOTstack/master/install.sh | bash
O script pode pedir uma reinicialização para que seu usuário entre no grupo docker. Depois de reiniciar, confira se o Docker funciona sem sudo:
docker version
docker compose version
Em seguida, abra o menu:
cd ~/IOTstack
./menu.sh
Escolha Build Stack e use a barra de espaço para selecionar nodered, influxdb e grafana (e portainer-ce, se você gosta de uma interface web para contêineres). Ao selecionar o Node-RED, o menu oferece nós adicionais. Marque node-red-contrib-influxdb e node-red-dashboard (ou o pacote mais novo do Dashboard 2.0, se aparecer na lista). Deixe mosquitto desmarcado. Saia do menu e inicie a stack:
cd ~/IOTstack
docker compose up -d
docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'
Os três contêineres devem aparecer como Up. Os dados ficam em ~/IOTstack/volumes/, uma pasta por serviço.
Crie o banco de dados no InfluxDB
O serviço influxdb do IOTstack é o InfluxDB 1.8, que usa InfluxQL e não tem assistente de configuração. Crie um banco de dados e uma política de retenção de dentro do contêiner:
docker exec -it influxdb influx
CREATE DATABASE sensors
CREATE RETENTION POLICY "ninety_days" ON "sensors" DURATION 90d REPLICATION 1 DEFAULT
SHOW DATABASES
exit
Contêineres do mesmo projeto Compose compartilham uma rede e se alcançam pelo nome do serviço. É por isso que o Node-RED e o Grafana vão usar http://influxdb:8086, e não localhost.
Conecte o Node-RED a um broker MQTT externo
Abra o Node-RED em http://<pi-ip>:1880. Arraste um nó mqtt in para a área de trabalho e edite o servidor:
- Server:
broker.connectmq.com - Port:
1883para testes no servidor público - Protocol: MQTT V5 (ou 3.1.1)
- Client ID: algo único e não vazio, por exemplo
iotstack-nr-5d02e8 - Topic:
connectmq/demo/5d02e8/+/climate - Output: um objeto JSON já interpretado
O servidor público não exige credenciais, então você pode testar imediatamente. Lembre-se de que o servidor MQTT público pode ser lido por qualquer pessoa e serve para testes, não para dados de produção; é por isso que o topic contém um segmento aleatório. Se você é novo nos nós MQTT do Node-RED, o tutorial de Node-RED com MQTT cobre o nó de configuração em profundidade.
O fluxo do Node-RED: do MQTT para o InfluxDB
Importe o fluxo abaixo em Menu, Import. Ele assina o topic de clima de todos os cômodos, extrai o nome do cômodo do topic e grava um ponto no InfluxDB.
[
{
"id": "mqttIn1",
"type": "mqtt in",
"name": "climate in",
"topic": "connectmq/demo/5d02e8/+/climate",
"qos": "1",
"datatype": "json",
"broker": "broker1",
"nl": false,
"rap": true,
"rh": 0,
"inputs": 0,
"x": 140, "y": 100,
"wires": [["toPoint1"]]
},
{
"id": "toPoint1",
"type": "function",
"name": "to InfluxDB point",
"func": "const room = msg.topic.split('/')[3];\nconst p = msg.payload;\nif (typeof p.t !== 'number') { return null; }\nmsg.measurement = 'climate';\nmsg.payload = [\n { temperature: p.t, humidity: p.rh },\n { room: room }\n];\nreturn msg;",
"outputs": 1,
"x": 360, "y": 100,
"wires": [["influxOut1"]]
},
{
"id": "influxOut1",
"type": "influxdb out",
"influxdb": "influxCfg1",
"name": "write sensors",
"measurement": "",
"precision": "",
"retentionPolicy": "",
"x": 580, "y": 100,
"wires": []
},
{
"id": "broker1",
"type": "mqtt-broker",
"name": "ConnectMQ public",
"broker": "broker.connectmq.com",
"port": "1883",
"clientid": "iotstack-nr-5d02e8",
"autoConnect": true,
"usetls": false,
"protocolVersion": "5",
"keepalive": "60",
"cleansession": true
},
{
"id": "influxCfg1",
"type": "influxdb",
"hostname": "influxdb",
"port": "8086",
"database": "sensors",
"name": "IOTstack InfluxDB",
"influxdbVersion": "1.x"
}
]
O nó function retorna um array de dois objetos, primeiro os campos e depois as tags, que é o formato que o node-red-contrib-influxdb espera para um único ponto com tags. Faça o deploy e publique uma leitura de teste:
mosquitto_pub -h broker.connectmq.com -p 1883 -i tester-5d02e8 -q 1 \
-t connectmq/demo/5d02e8/office/climate -m '{"t":22.4,"rh":41}'
Confira se ela chegou:
docker exec -it influxdb influx -database sensors \
-execute 'SELECT * FROM climate ORDER BY time DESC LIMIT 5'
Grafana no IOTstack do Raspberry Pi
Abra o Grafana em http://<pi-ip>:3000, faça login com a conta admin padrão e troque a senha. Adicione uma fonte de dados:
- Connections, Data sources, Add, InfluxDB.
- Linguagem de consulta: InfluxQL.
- URL:
http://influxdb:8086. - Database:
sensors. Não é preciso usuário nem senha com a configuração padrão do IOTstack. - Save and test.
Crie um dashboard com um painel Time series e esta consulta:
SELECT mean("temperature") FROM "climate"
WHERE $timeFilter
GROUP BY time($__interval), "room" fill(none)
Digite $tag_room no campo ALIAS do editor de consulta e você terá uma linha claramente identificada por cômodo. Se preferir o InfluxDB 2 e o Flux, o IOTstack também oferece um serviço influxdb2; o tutorial de Grafana e InfluxDB no Raspberry Pi mostra o lado do Flux em detalhe.
Produção: credenciais de broker privado e TLS
Em implantações reais, substitua o servidor público por um broker privado. Em um broker MQTT gerenciado como a ConnectMQ, você cria um broker no portal e recebe usuário, senha e client ID. No Node-RED, edite o nó de configuração mqtt-broker:
- Porta
8883, marque Use TLS e adicione uma configuração TLS com Verify server certificate ativado. A ConnectMQ usa um certificado Let's Encrypt, então nenhum arquivo de CA personalizado é necessário. - Client ID:
YOUR_CLIENT_ID. A ConnectMQ vincula os client IDs às credenciais emitidas, então use exatamente o que aparece no portal. - Aba Security:
YOUR_USERNAMEeYOUR_PASSWORD.
O Node-RED armazena as credenciais criptografadas em flows_cred.json, dentro de ~/IOTstack/volumes/nodered/data. Defina um credentialSecret no settings.js da mesma pasta para que a chave de criptografia permaneça estável quando o contêiner for reconstruído.
Backups e atualizações
A força do IOTstack é que tudo o que importa está em dois lugares: docker-compose.yml e volumes/. Uma rotina simples:
- Pare a stack brevemente com
docker compose stop(ou use os scripts de backup do IOTstack, se você os instalou). - Compacte a pasta:
sudo tar czf ~/iotstack-$(date +%F).tgz -C ~ IOTstack/docker-compose.yml IOTstack/volumes. - Inicie novamente com
docker compose up -de copie o arquivo para fora do Pi.
Para atualizar as imagens:
cd ~/IOTstack
docker compose pull
docker compose up -d
docker image prune -f
Fixe as tags das imagens no docker-compose.yml para os serviços em que uma atualização de versão principal inesperada causaria problemas, especialmente o InfluxDB.
Solução de problemas
| Sintoma | Causa | Correção |
|---|---|---|
| O nó MQTT do Node-RED fica em "connecting" | Porta ou configuração TLS errada | 1883 sem TLS, 8883 com TLS |
| O Node-RED mostra "disconnected" logo depois de conectar | Client ID duplicado | Cada cliente precisa de seu próprio ID |
Erro no nó InfluxDB ENOTFOUND influxdb |
Host definido como localhost |
Use o nome do serviço, influxdb |
| Grafana mostra "database not found" | Banco de dados não criado | Execute CREATE DATABASE sensors |
| Os contêineres param depois de reiniciar | Falta a política de reinício | O IOTstack define restart: unless-stopped; confira o arquivo |
Comece com a ConnectMQ
Deixe o IOTstack cuidar do processamento e um broker MQTT gerenciado cuidar das conexões. Crie uma conta gratuita em app.connectmq.com, escolha o plano Serverless sem cartão de crédito e cole as credenciais geradas no nó de configuração do Node-RED. Mais projetos com o Pi estão reunidos no tutorial de MQTT com Raspberry Pi.
Perguntas frequentes
Preciso do contêiner do Mosquitto no IOTstack?
Só se todos os dispositivos estiverem na mesma rede local e você quiser o broker no Pi. Com um broker externo na nuvem, o Node-RED assina pela internet e você evita manter a segurança do broker no Pi.
Qual versão do InfluxDB o IOTstack usa?
O serviço influxdb é o InfluxDB 1.8 com InfluxQL, e um serviço separado, influxdb2, oferece a versão 2 com Flux. Escolha uma e mantenha-se nela, já que as configurações do Node-RED e do Grafana são diferentes.
Posso rodar o IOTstack em um Raspberry Pi OS de 32 bits?
Algumas imagens ainda publicam builds de 32 bits, mas o suporte está diminuindo. Um sistema de 64 bits evita a maioria dos problemas de compatibilidade de imagens.
Como mover o IOTstack para um novo Raspberry Pi?
Instale o IOTstack no novo Pi, pare-o, restaure o seu docker-compose.yml e a pasta volumes e execute docker compose up -d.



