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
相关推荐
hj2862511 小时前
Linux学习方法论 + 系统安全加固与性能优化 完整版笔记(含案例)
运维
刘某的Cloud1 小时前
硬链接 和 软链接 区别
运维·系统·硬链接·软链接
jiayong231 小时前
harness 与 hermes-agent 扩展性、安全与运维
运维·人工智能·安全·ai·架构·智能体·harness
福建佰胜张工1 小时前
3DX-RAY 便携式 X 射线系统系列技术解析与应用指南
3d·智能手机·自动化
STDD2 小时前
Linux Namespace:容器隔离的底层原理,PID、网络、挂载隔离实战
linux·运维·网络
todoitbo2 小时前
一台 2C2G 服务器上的 KingbaseES 安装记录
运维·服务器·数据库·国产数据库
Gong-Yu2 小时前
MySQL数据库运维(1)
运维·数据库·mysql·慢查询
Yang96112 小时前
宽频高精度!鼎讯信通 OM-T 台式频谱分析仪风电实验室专用
大数据·运维·网络