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 响应的简单示例:
- 在编辑界面从左侧节点库拖入 HTTP in 节点
- 双击配置:Method = POST,URL =
/api/hello - 拖入 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;
- 拖入 HTTP response 节点,设置状态码 200
- 将三个节点连接:HTTP in → Function → HTTP response
- 点击右上角「部署」按钮
测试:
bash
curl -X POST http://YOUR_SERVER_IP:1880/api/hello \
-H "Content-Type: application/json" \
-d '{"name": "Node-RED"}'
示例:MQTT 订阅 IoT 数据流
模拟 IoT 传感器数据采集流程:
- 拖入 MQTT in 节点,配置 Broker 地址和订阅 Topic:
sensors/# - 拖入 JSON 节点(自动解析 JSON 字符串)
- 拖入 Switch 节点,根据
msg.payload.type字段分流:- 温度数据 → 写入数据库
- 告警数据 → 发送通知
- 拖入 Debug 节点查看消息内容
- 连接:MQTT in → JSON → Switch → Debug
示例:定时任务触发器
每天早上 8 点推送天气预报:
- 拖入 Inject 节点,配置定时:每天 08:00:00
- 拖入 HTTP request 节点,配置天气 API 地址
- 拖入 Function 节点,解析天气数据:
javascript
const weather = msg.payload;
msg.payload = {
to: "your@email.com",
subject: `今日天气:${weather.city}`,
body: `温度:${weather.temp}°C,天气:${weather.desc}`
};
return msg;
- 拖入 Email 节点发送邮件(需安装
node-red-node-email)
安装社区节点
Node-RED 拥有丰富的社区节点库:
通过编辑界面安装:
- 点击右上角菜单 → 「节点管理」
- 搜索并安装需要的节点
常用社区节点推荐:
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 后可构建可视化界面:
- 安装
node-red-dashboard节点 - 拖入 gauge(仪表盘)节点,配置 Tab 和 Group
- 将 MQTT 数据流连接到 gauge 节点
- 访问
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