Node-Red: automação simplificada

Saudações.

O Node-Red é um sistema simples de programar um fluxo de trabalho (workflow) simples, pontual e flexível.

Pré-requisitos (constam em outros artigos aqui do blog):

  • Instalação do Linux (Debian);
  • Internet no servidor;
  • Docker CE instalado;

1 – Apresentando o Node-Red

O Node-Red é mantido pela IBM por meio da OpenJS Foundation, foi criado em 2013 e possui uma maturidade elevadíssima.

É totalmente OpenSource e gratuito, sem limitações de software, sem licença, sem custo adicional com software.

O foco principal é provar uma maneira LowCode (desenhavel) de criar automações para IoT, hardware e dispositivos.

Seu diferencial é a flexibilidade de criação de nodes personalizados para integraçãom com APIs modernas (HTTP, gRPC, ND-JSON).

É possível e fácil criar nodes próprios em Javascript/Typescript (NodeJS).

Ele conta com uma vasta biblioteca online oficial de nodes da comunidade.

Node-RED é ideal para:

  • Desenvolvedores que trabalham com IoT e dispositivos conectados;
  • Automação residencial (Home Assistant, Raspberry Pi);
  • Integração com sensores, PLCs e protocolos industriais (MQTT, OPC-UA, Modbus);
  • Edge computing e ambientes industriais (IIoT);

Sites:

Explore e descubra coisas incríveis!

2 – Instalando no Docker

O Node-Red roda um servidor web na porta HTTP 1880 para edição e gerenciamento de fluxos.

2.1 – Execução simples

Para rodar em Docker para uso imediato:

Bash
# Preparar diretorio do volume com permissao correta
    mkdir -p /storage/node-red;
    chown -R 1000:1000 /storage/node-red;

# Rodar:
    docker run -d \
        --name node-red \
        -h node-red.intranet.br \
        -p 1880:1880 \
        -e TZ=America/Sao_Paulo \
        -v /storage/node-red:/data \
        nodered/node-red:latest;

2.2 – Execução com Traefik

Para rodar em nome de DNS (FQDN) público com certificado, instale previamente o Traefik (consta em outros tutoriais do site).

Modo “docker run

Bash
#!/bin/sh

# Variaveis
    NAME=node-red;
    FQDN="$NAME.$(hostname -f)";
    IMAGE=nodered/node-red:latest;

    TZ="America/Sao_Paulo";
    DATADIR="/storage/$NAME";

# Preparar pasta do volume e ajustar permissoes
    mkdir -p $DATADIR;
    chown 1000:1000 $DATADIR;

# Obter imagem atualizada
    docker pull $IMAGE;

# Rodar/Renovar
    # n8n_main1
    docker rm -f $NAME 2>/dev/null;
    docker run -d \
        --name $NAME \
        -h $NAME.intranet.br \
        \
        --network network_public \
        --ip=10.249.1.11 \
        --ip6=2001:db8:10:249::1:11 \
        --mac-address 02:cd:02:49:01:11 \
        \
        -e TZ=$TZ \
        \
        -v ${DATADIR}:/data \
        \
        --label "traefik.enable=true" \
        --label "traefik.http.routers.$NAME.rule=Host(\`$FQDN\`)" \
        --label "traefik.http.routers.$NAME.entrypoints=web,websecure" \
        --label "traefik.http.routers.$NAME.tls=true" \
        --label "traefik.http.routers.$NAME.tls.certresolver=letsencrypt" \
        --label "traefik.http.services.$NAME.loadbalancer.server.port=1880" \
        \
        $IMAGE;

Stack para Docker Compose (para quem gosta de Portainer)

YAML
services:
  node-red:
    image: nodered/node-red:latest
    container_name: node-red
    hostname: node-red.intranet.br
    restart: always
    tmpfs:
      - /run:rw,noexec,nosuid,size=2m
    cpus: "8.0"
    mem_limit: 4g
    memswap_limit: 4g
    environment:
      - TZ=America/Sao_Paulo
    volumes:
      - /storage/node-red:/data
    networks:
      network_public:
        ipv4_address: 10.249.1.11
        ipv6_address: 2001:db8:10:249::1:11
        mac_address: 02:cd:02:49:01:11
    labels:
      - traefik.enable=true
      - traefik.http.routers.node-red.rule=Host(`node-red.seu-site.com.br`)
      - traefik.http.routers.node-red.entrypoints=web,websecure
      - traefik.http.routers.node-red.tls=true
      - traefik.http.routers.node-red.tls.certresolver=letsencrypt
      - traefik.http.services.node-red.loadbalancer.server.port=1880
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:1880"]
      interval: 30s
      timeout: 10s
      retries: 3

networks:
  network_public:
    driver: bridge
    enable_ipv6: true
    ipam:
      config:
        - subnet: 10.249.0.0/16
          gateway: 10.249.255.254
        - subnet: 2001:db8:10:249::/64
          gateway: 2001:db8:10:249::ffff

Obs.: O redirecionamento de portas é opcional ao usar com o Traefik. Deixei a instrução “ports: 1880:1880” mas recomendo que remova quando o acesso pelo Traefik funcionar.

3 – Adicionando nodes da comunidade

Nodes da comunidade aumentam significativamente o poder da sua automação, resumindo em um node o que antes precisaria de uma rede enorme de nós.

Alguns nodes famosos:

  • node-red-contrib-influxdb: Integração com InfluxDB (banco de dados de séries temporais), amplamente usado em projetos IoT e monitoramento;
  • node-red-contrib-modbus: Suporte completo para Modbus TCP, UDP e Serial, essencial para automação industrial;
  • node-red-contrib-telegrambot: Integração com Telegram para bots e notificações, muito usado em projetos de automação residencial;
  • node-red-contrib-home-assistant-websocket: Integração com Home Assistant, popular em projetos de casa inteligente;
  • node-red-contrib-uibuilder: Cria interfaces web personalizadas sem limitações do Dashboard, suporta Vue, React e outros frameworks;
  • node-red-node-mysql: Conecta Node-RED a bancos de dados MySQL/MariaDB, essencial para persistência de dados;
  • node-red-contrib-moment: Manipulação avançada de datas e horários usando Moment.js, suporte a timezone, DST e locale;
  • node-red-node-mongodb: Integração com MongoDB, popular para aplicações NoSQL;
  • node-red-contrib-bigtimer: Timer avançado com suporte a nascer/pôr do sol, muito usado em automação baseada em tempo;

Top nodes mais baixados:

  • node-red-dashboard (agora @flowfuse/node-red-dashboard): dashboard melhorada;
  • node-red-contrib-cron-plus: Nó de agendamento flexível (cron, eventos solares, datas fixas) com controle dinâmico completo e suporte a fusos horários;
  • node-red-contrib-zigbee2mqtt e node-red-contrib-zigbee2mqtt-devices: Integração com dispositivos Zigbee através do Zigbee2MQTT, controlar lâmpadas, sensores e dispositivos Zigbee (Ikea Trådfri, Philips Hue, Xiaomi Aqara, etc.);
  • node-red-contrib-aedes: Servidor MQTT broker completo rodando dentro do Node-RED para criar um broker MQTT local sem necessidade de Mosquitto ou outro servidor externo;
  • node-red-node-pushbullet / node-red-contrib-pushbell: Enviar notificações push para smartphones e desktops, alertas e notificações de automação residencial, monitoramento de sistemas;
  • node-red-contrib-sendgrid / node-red-node-email: Envio de emails através de SMTP ou API do SendGrid, envia alertas por email, relatórios automatizados, notificações de eventos;
  • node-red-contrib-http-request: Node HTTP aprimorado com suporte otimizado para proxy, requisições HTTP/HTTPS com recursos avançados, alternativa ao node HTTP nativo quando precisa de recursos adicionais, suporte a proxy HTTPS via CONNECT, conexões persistentes, e mais opções de configuração;

Top nodes de IA/LLM:

  • node-red-contrib-ai-agent: Agente de IA que permite processamento de linguagem natural com memória, integração de ferramentas (HTTP e Functions), encadeamento de múltiplos agentes, persistência de memória em arquivo;
  • node-red-contrib-ollama: módulo que encapsula a biblioteca ollama.js, ideal para rodar LLMs localmente., oferecendo funcionalidades como nós configuráveis para fácil integração em fluxos (chat, generate, embed, list/pull/push de modelos);
  • node-red-contrib-openai: biblioteca que fornece acesso conveniente à API OpenAI, suportando qualquer plataforma compatível com OpenAI API, suporta MCP, endpoint de responses API, compabibilidade com OpenRouter, Groq, etc);
  • node-red-ai-toolkit: coleção de nós e fluxos para desenvolvimento low-code interativo de aplicações usando tecnologias de IA, recursos:
    • Catálogo de modelos testados;
    • Tool Store para expandir agentes;
    • Recipe Store para guiar agentes;
    • Key-Value e Vector Stores;
    • Busca na web (Brave, Startpage);
  • LangChain/LangGraph: é possível usar LangGraph importando as bibliotecas diretamente nos function nodes, criando agentes com ferramentas como TavilySearchResults e mantendo histórico de conversação com MemorySaver;

Instalando via repositório NPM:

Bash
# Garantir as permissoes do volume para o usuario node-red (UID 1000)
mkdir -p /storage/node-red;
chown -R 1000:1000 /storage/node-red;


# Funcao mais rapida:
nodered_install(){
    #USER=root;
    USER=node-red;
    docker exec \
        --user $USER \
        -it node-red bash -c \
        "npm install $1";
};


# Instalar todos os top-nodes:
nodered_install  node-red-contrib-uibuilder;
nodered_install  node-red-contrib-moment;
nodered_install  node-red-contrib-bigtimer;
nodered_install  node-red-contrib-cron-plus;
#nodered_install  node-red-contrib-http-request; < vulneravel

# Instalar modulos de banco de dados
nodered_install  node-red-contrib-postgresql;
nodered_install  node-red-contrib-redis;
nodered_install  node-red-node-mysql;
nodered_install  node-red-node-mongodb;

# Instalar nodes de IA/LLM:
nodered_install  node-red-contrib-ai-agent;
nodered_install  node-red-contrib-ollama;
nodered_install  node-red-contrib-openai;


# Instalar bibliotecas adicionais de IA/LLM
nodered_install  node-red-contrib-ml-rag;

# Instalar langchain:
nodered_install  langchain;                       # Pacote principal
nodered_install  @langchain/core;                 # Principais funcoes
nodered_install  @langchain/anthropic;            # Para Claude
nodered_install  @langchain/google-genai;         # Para Gemini
nodered_install  @langchain/langgraph;            # LangGraph (visual)
nodered_install  @langchain/openai;               # OpenAI (GPT-4, GPT-3.5, etc)
nodered_install  @langchain/google-vertexai;      # Google Vertex AI
nodered_install  @langchain/google-vertexai-web;  # Google Vertex AI
nodered_install  @langchain/mistralai;            # Mistral AI
nodered_install  @langchain/aws;                  # AWS (Bedrock)
nodered_install  @langchain/azure-openai;         # Azure OpenAI
nodered_install  @langchain/groq;                 # Groq
nodered_install  @langchain/cerebras;             # Cerebras
nodered_install  @langchain/cloudflare;           # Cloudflare Workers AI
nodered_install  @langchain/ollama;               # Ollama (modelos locais)
nodered_install  @langchain/together;             # Together AI
nodered_install  @langchain/fireworksai;          # Fireworks AI
nodered_install  @langchain/baidu-qianfan;        # Baidu Qianfan
nodered_install  @langchain/yandex;               # Yandex
# - vector store
nodered_install  @langchain/pinecone;             # Pinecone
nodered_install  @langchain/qdrant;               # Qdrant
nodered_install  @langchain/weaviate;             # Weaviate
nodered_install  @langchain/redis;                # Redis
nodered_install  @langchain/mongodb;              # MongoDB Atlas
nodered_install  @langchain/milvus;               # Milvus


# Conferindo modulos:
docker exec -it --user node-red node-red bash -c 'npm audit';


# Fixar permissoes novamente
# Garantir as permissoes do volume para o usuario node-red (UID 1000)
mkdir -p /storage/node-red;
chown -R 1000:1000 /storage/node-red;

Reinicie o Node-Red para aplicar as novas bibliotecas:

Bash
# Reiniciar node-red
docker restart node-red;

Use e abuse, sempre faça backup das suas automações.

4 – Exemplos

Alguns exemplos para ajudar os iniciantes a verem as coisas acontecendo!

4.1 – Webhook/HttpServer com HTML Hello-World

Automação com servidor http (node Network -> http-in), HTML de Hello-World (node Function -> template) e resposta da requisição (node Network -> http response), acesso via https://node-red.seu-dominio.com.br/v1/test01

JSON
[
    {
        "id": "2e065a883bd6c062",
        "type": "tab",
        "label": "Teste-01",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "d88736d783dcec0e",
        "type": "http in",
        "z": "2e065a883bd6c062",
        "name": "test01",
        "url": "/v1/test01",
        "method": "get",
        "upload": false,
        "skipBodyParsing": false,
        "swaggerDoc": "",
        "x": 170,
        "y": 240,
        "wires": [
            [
                "8172d84ce8b74fa4"
            ]
        ]
    },
    {
        "id": "c468c08b6b68667d",
        "type": "http response",
        "z": "2e065a883bd6c062",
        "name": "reply",
        "statusCode": "",
        "headers": {},
        "x": 550,
        "y": 240,
        "wires": []
    },
    {
        "id": "8172d84ce8b74fa4",
        "type": "template",
        "z": "2e065a883bd6c062",
        "name": "",
        "field": "payload",
        "fieldType": "msg",
        "format": "handlebars",
        "syntax": "mustache",
        "template": "<!DOCTYPE html>\n<html>\n<head>\n    <title>Hello World</title>\n</head>\n<body>\n    <h1>Hello World!</h1>\n    <p>Esta página foi criada com Node-Red.</p>\n</body>\n</html>",
        "output": "str",
        "x": 360,
        "y": 240,
        "wires": [
            [
                "c468c08b6b68667d"
            ]
        ]
    }
]

A vida é como uma caixa de chocolates. Você nunca sabe o que vai encontrar.
Autor: Forest Gump

Terminamos por hoje!

Patrick Brandão, patrickbrandao@gmail.com