Node-RED 自托管部署指南:打造可视化 IoT 自动化平台

Node-RED 自托管部署指南:打造可视化 IoT 自动化平台

Node-RED 是 IBM 开源的流程化编程平台,通过拖拽节点的方式将各种 API、设备、数据库连接起来,无需复杂编码即可构建强大的自动化工作流。从 IoT 设备数据采集到家庭自动化,从 HTTP Webhook 处理到 MQTT 消息路由,Node-RED 都是理想的选择。本文详细介绍如何在 Linux 服务器上通过 Docker Compose 部署 Node-RED,并介绍常用工作流构建方法。

前置要求

  • 操作系统:Ubuntu 22.04 LTS 或 Debian 12
  • 已安装 Docker 和 Docker Compose
  • 基本 Linux 命令行操作能力
  • 开放 1880 端口

服务器配置

Node-RED 基于 Node.js 构建,资源占用极低,即使是树莓派也能流畅运行。

推荐使用 雨云服务器 rainyun-com 部署,注册填 2026off 领 5 折,1 核 1GB 机型(Node.js,极轻量,树莓派都能跑)完全满足 Node-RED 的运行需求,入门价格极低,适合个人 IoT 和自动化项目。

配置建议:

资源 建议规格
CPU 1 核
内存 1 GB
硬盘 10 GB SSD
带宽 5 Mbps+

安装 Docker 和 Docker Compose

bash 复制代码
# 安装 Docker
curl -fsSL https://get.docker.com | bash -s docker

# 添加当前用户到 docker 组(免 sudo)
sudo usermod -aG docker $USER
newgrp docker

# 安装 Docker Compose
sudo apt install -y docker-compose-plugin

# 验证安装
docker --version
docker compose version

Docker Compose 部署 Node-RED

创建 Node-RED 工作目录:

bash 复制代码
mkdir -p ~/nodered/data
cd ~/nodered

创建 docker-compose.yml 文件:

bash 复制代码
nano ~/nodered/docker-compose.yml

写入以下内容:

yaml 复制代码
version: '3.8'

services:
  node-red:
    image: nodered/node-red:latest
    container_name: node-red
    restart: unless-stopped
    ports:
      - "1880:1880"
    volumes:
      # 持久化 Node-RED 数据(流程、配置、已安装节点)
      - ./data:/data
    environment:
      - TZ=Asia/Shanghai              # 设置时区
      - NODE_RED_ENABLE_PROJECTS=true # 启用项目功能
    user: "1000:1000"                 # 使用非 root 用户运行
    networks:
      - nodered-net

networks:
  nodered-net:
    driver: bridge

启动 Node-RED:

bash 复制代码
# 设置数据目录权限
sudo chown -R 1000:1000 ~/nodered/data

# 启动服务
docker compose up -d

# 查看运行状态
docker compose ps
docker compose logs -f node-red

启动后访问 http://YOUR_SERVER_IP:1880 即可进入 Node-RED 编辑界面。


配置 settings.js(认证与安全)

Node-RED 默认不开启认证,生产环境务必配置用户名密码:

bash 复制代码
# 生成密码哈希
docker exec -it node-red node -e "
const bcrypt = require('bcryptjs');
bcrypt.hash('YourPassword123', 8, function(err, hash) {
  console.log(hash);
});"

将生成的哈希值填入配置文件:

bash 复制代码
nano ~/nodered/data/settings.js

找到并修改 adminAuth 部分:

javascript 复制代码
module.exports = {
    // 管理员认证配置
    adminAuth: {
        type: "credentials",
        users: [
            {
                username: "admin",
                password: "$2b$08$YourGeneratedHashHere",  // 填入生成的 bcrypt 哈希
                permissions: "*"
            },
            {
                username: "viewer",
                password: "$2b$08$AnotherHashForViewer",
                permissions: "read"
            }
        ]
    },

    // 启用项目功能(Git 版本控制)
    editorTheme: {
        projects: {
            enabled: true
        }
    },

    // 日志设置
    logging: {
        console: {
            level: "info",
            metrics: false,
            audit: false
        }
    },

    // 流程文件位置
    flowFile: "flows.json",

    // 允许的上下文存储
    contextStorage: {
        default: { module: "memory" },
        file: { module: "localfilesystem" }
    }
}

修改配置后重启容器:

bash 复制代码
docker compose restart node-red

使用 Caddy 配置反向代理(可选)

建议使用 Caddy 为 Node-RED 配置 HTTPS:

bash 复制代码
sudo apt install -y caddy

sudo nano /etc/caddy/Caddyfile

写入:

复制代码
nodered.yourdomain.com {
    reverse_proxy localhost:1880
}
bash 复制代码
sudo systemctl restart caddy

构建第一个工作流:HTTP 端点

以下是一个接收 HTTP POST 请求并返回 JSON 响应的简单示例:

  1. 在编辑界面从左侧节点库拖入 HTTP in 节点
  2. 双击配置:Method = POST,URL = /api/hello
  3. 拖入 Function 节点,写入以下 JavaScript:
javascript 复制代码
// Function 节点代码
const body = msg.payload;
const name = body.name || "World";

msg.payload = {
    message: `Hello, ${name}!`,
    timestamp: new Date().toISOString(),
    received: body
};

return msg;
  1. 拖入 HTTP response 节点,设置状态码 200
  2. 将三个节点连接:HTTP in → Function → HTTP response
  3. 点击右上角「部署」按钮

测试:

bash 复制代码
curl -X POST http://YOUR_SERVER_IP:1880/api/hello \
  -H "Content-Type: application/json" \
  -d '{"name": "Node-RED"}'

示例:MQTT 订阅 IoT 数据流

模拟 IoT 传感器数据采集流程:

  1. 拖入 MQTT in 节点,配置 Broker 地址和订阅 Topic:sensors/#
  2. 拖入 JSON 节点(自动解析 JSON 字符串)
  3. 拖入 Switch 节点,根据 msg.payload.type 字段分流:
    • 温度数据 → 写入数据库
    • 告警数据 → 发送通知
  4. 拖入 Debug 节点查看消息内容
  5. 连接:MQTT in → JSON → Switch → Debug

示例:定时任务触发器

每天早上 8 点推送天气预报:

  1. 拖入 Inject 节点,配置定时:每天 08:00:00
  2. 拖入 HTTP request 节点,配置天气 API 地址
  3. 拖入 Function 节点,解析天气数据:
javascript 复制代码
const weather = msg.payload;
msg.payload = {
    to: "your@email.com",
    subject: `今日天气:${weather.city}`,
    body: `温度:${weather.temp}°C,天气:${weather.desc}`
};
return msg;
  1. 拖入 Email 节点发送邮件(需安装 node-red-node-email

安装社区节点

Node-RED 拥有丰富的社区节点库:

通过编辑界面安装:

  1. 点击右上角菜单 → 「节点管理」
  2. 搜索并安装需要的节点

常用社区节点推荐:

bash 复制代码
# 通过命令行安装(进入容器)
docker exec -it node-red bash

# 在容器内执行
cd /data
npm install node-red-dashboard          # 可视化仪表盘
npm install node-red-contrib-influxdb   # InfluxDB 时序数据库
npm install node-red-contrib-mqtt-broker # 内置 MQTT Broker
npm install node-red-node-email         # 发送邮件
npm install node-red-contrib-home-assistant-websocket # 接入 Home Assistant

node-red-dashboard 图表示例

安装 Dashboard 后可构建可视化界面:

  1. 安装 node-red-dashboard 节点
  2. 拖入 gauge(仪表盘)节点,配置 Tab 和 Group
  3. 将 MQTT 数据流连接到 gauge 节点
  4. 访问 http://YOUR_SERVER_IP:1880/ui 查看仪表盘

流程导入导出

Node-RED 支持导出流程为 JSON 文件,方便备份和迁移:

bash 复制代码
# 导出:在编辑器中选择流程 → 右上角菜单 → Export → 复制 JSON

# 命令行备份
cp ~/nodered/data/flows.json ~/flows_backup_$(date +%Y%m%d).json

# 导入:右上角菜单 → Import → 粘贴 JSON

常见问题排查

容器启动失败:

bash 复制代码
# 检查日志
docker compose logs node-red

# 常见问题:数据目录权限
sudo chown -R 1000:1000 ~/nodered/data

节点无法安装:

bash 复制代码
# 检查网络连接
docker exec -it node-red curl https://registry.npmjs.org

# 清除 npm 缓存
docker exec -it node-red npm cache clean --force

界面无法访问:

bash 复制代码
# 检查端口是否开放
sudo ufw allow 1880/tcp
sudo ufw reload
相关推荐
Avan_菜菜4 小时前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
老梁agent13 小时前
Agent 如何看懂时序数据?时间序列查询的 Tool 设计模式
物联网·agent
SelectDB1 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode3 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220703 天前
如何搭建本地yum源(上)
运维
大树886 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠6 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质6 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工6 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
大鱼>6 天前
大语言模型+物联网:LLM理解物理世界
物联网·struts·语言模型·多模态·aiot