应用场景
Node-RED是一个开源的物联网平台,它是一个基于流程的编程工具,主要用于为物联网 (IoT)设备创建流程。它使用可视化编程方法,允许开发人员将预定义的代码块(称为“节点”,Node)连接起来执行任务。连接的节点,通常是输入节点、处理节点和输出节点的组合,当它们连接在一起时,构成一个“流” (Flows)本文将介绍如何基于华为云云耀云服务L实例的Portainer来快速部署Node-RED平台。
资源和成本规划
本次实践使用Portainer镜像。
本实践以如下资源规划为例,您可根据实际需要进行调整。
资源 | 配置 | 说明 |
---|---|---|
云耀云服务器L实例 | - CPU:2核 - 内存:2GB - 系统盘:40GiB | Portainer应用镜像运行的最低配置为2核2GB、系统盘40GiB,建议根据您的需求选择云耀云服务器L实例。 |
镜像 | Portainer | 选择Portainer应用镜像。 |
安全组 | 入方向规则:- 协议:TCP- 端口:80、443、1880 - 源地址:0.0.0.0/0 | - 80:允许使用HTTP协议访问网站。- 443:允许使用HTTPS协议访问网站。- 1880:允许访问nodered 服务 |
域名 | domaintest.com | - 如果您仅为个人开发或测试使用,可以不添加域名。- 如果您的应用对外开放,请为云服务器添加并解析域名。 |
操作流程
购买并配置云耀云服务器L实例
- 登录云耀云服务器L实例控制台。
- 单击“购买资源”,在下拉列表中选择“购买 云耀云服务器L实例”或选择“购买 云耀服务组合”。
- 对云服务器进行资源配置。本例以选择“购买 云耀云服务器L实例”为例。
参数 | 说明 |
---|---|
区域 | 不同区域的云耀云服务器L实例之间内网互不相通。请就近选择靠近您业务的区域,可减少网络时延,提高访问速度。 |
场景镜像 | 选择Portainer应用镜像。 |
套餐规格 | 选择套餐规格。最低配置为2核2GB、系统盘40GiB。 |
实例名称 | 请自定义方便您识别的实例名称,例如Portainer-Example。 |
附加服务(可选) | 仅选择“购买 云耀云服务器L实例”时支持。根据需要任意选择数据盘、主机安全、云备份附加服务。 |
购买时长 | 单次购买最短为1个月,最长为3年。 |
购买数量 | 设置您购买的云耀云服务器L实例数量。 |
- 单击“立即购买”,进入订单详情页面。根据界面提示,请确认配置信息,阅读并勾选协议。
- 单击“去支付”,根据页面提示完成支付。
- 单击“返回华为云云耀云服务解决方案控制台”,查看已创建的云耀云服务器L实例。
设置云耀云服务器L实例密码
- 单击云耀云服务器L实例卡片。
- 在“概览”页“镜像信息”中,单击“管理”登录管理界面,检查应用镜像是否正常启动。
**须知:**在应用镜像启动期间,对云耀云服务器L实例进行重置密码、重启或开关机操作将导致应用镜像管理界面登陆异常。如果管理界面显示正常的引导或登陆界面表示应用镜像已经正常启动。否则请耐心等待1~2分钟,稍后重试。
4. 请参考设置/重置密码,设置云耀云服务器L实例管理员root的密码。
登录云耀云服务器L实例
请参考远程登录Linux云服务器(VNC方式)登录云耀云服务器L实例。
因为Nginx安全级别过高,可能导致部分镜像功能不可用。可登录云服务器后执行如下命令解决:
wget -N https://websoft9.github.io/stackhub/scripts/nginx_huaweicloud.sh && bash nginx_huaweicloud.sh
配置安全组
配置安全组的入方向访问规则,确保可以正常访问应用镜像。
- 单击云耀云服务器L实例卡片,进入资源页面。
- 在左侧列表中单击“云耀云服务器L实例”,单击云服务器名称,进入云服务器详情页面。
- 选择“安全组”页签,单击“添加规则”,添加如下规则。本例只添加基本规则,您可根据需要添加更多规则。
优先级 | 策略 | 类型 | 协议端口 | 源地址 | 描述 |
---|---|---|---|---|---|
100 | 允许 | IPv4 | TCP:1880 | 0.0.0.0/0 | 允许访问node-red服务。 |
100 | 允许 | IPv4 | TCP:443 | 0.0.0.0/0 | 允许使用HTTPS协议访问应用管理界面。 |
100 | 允许 | IPv4 | TCP:80 | 0.0.0.0/0 | 允许访问HTTP协议访问应用管理界面。 |
- **图1 **配置结果 为了方便,我这里将所有的端口都已放开。生产环境请勿这样配置。不太安全。
添加并解析域名(可选)
本文介绍如何为服务器添加并解析域名,以便用户可以使用域名访问网站。如果您仅为个人开发或测试使用,可以不添加域名。
- 在左侧列表中单击“云耀云服务器L实例”,单击云服务器名称,进入云服务器详情页面。
- 选择“域名”页签,单击“添加域名”。输入域名,例如domaintest.com。请确保这里的域名已注册,如果您还没有域名,请单击“立即购买”注册(付费),具体操作详见流程指引。
- 单击“确定”。
- 单击domaintest.com域名操作列表中的“解析域名”。前缀和域名组成子域名。支持将域名或者子域名解析至当前公网IP。若域名前缀为空,表示将域名domaintest.com解析至当前服务器公网IP。
- 在“域名”页签查看解析的域名。
- 备案域名。要想通过域名成功访问服务器,必须备案域名。请在华为云备案中心备案此域名(免费),具体操作详见快速完成网站备案。
初始化Portainer
- 在服务器“概览”页“镜像信息”中,单击“管理”登录管理界面。初始化Portainer有一定时效性,如果未能快速创建用户,会出现如下图提示。请登录云服务器执行命令sudo docker restart portainer重启Portainer,随后快速创建用户。
- 设置Portainer管理员用户名密码,单击“Create user”。如果您有备份的数据,在“Restore Portainer from backup”配置项中,您可以从本地上传备份数据以便快速搭建Portainer环境。
- 选择“Home”菜单,单击Local项目就可以开始使用Portainer进行Docker可视化管理 。
至此,您已获得一台完备的Portainer应用云耀云服务器L实例。您可以开始使用Portainer,下面我们继续在该平台上部署Node-RED平台
使用Portainer部署Node-RED容器
下面我们以部署Node-RED容器为例,介绍如何使用Portainer进行Docker可视化管理。更多操作详见官网指导。
创建Node-RED容器
-
选择“Contaners”菜单,单击“Add container”添加Node-RED容器。
-
按图示配置Node-RED容器参数。
- ①Name:自定义的容器名称
- ②Image:容器镜像名称,例如设置nodered/node-red,系统将自动在DockerHub中拉取node-red最新镜像。
- ③单击“publish a new network port”,添加1880端口,确保可以正常访问Node-RED服务。
- ④Restart policy:建议选择“Always”,使得容器无论在什么情况下停止总会自动重新启动。
-
单击“Deploy the container”创建Node-RED容器。
访问node-red服务
等待容器部署成功后,访问 http://{ip}:1880 就能够访问到node-red服务
安装的节点
安装node-red中最常用的dashboard节点
搜索dashboard,点击安装
测试demo
以下是要准备导入的json流内容
[
{
"id": "24c1f56bc8eb1d36",
"type": "tab",
"label": "双silder 图表",
"disabled": false,
"info": "",
"env": []
},
{
"id": "64c475338976983e",
"type": "ui_slider",
"z": "24c1f56bc8eb1d36",
"name": "",
"label": "水量",
"tooltip": "水量",
"group": "776a423d272e1463",
"order": 0,
"width": "6",
"height": "2",
"passthru": true,
"outs": "all",
"topic": "topic",
"topicType": "msg",
"min": 0,
"max": "100",
"step": 1,
"className": "",
"x": 170,
"y": 260,
"wires": [
[
"c27918d2809fc841"
]
]
},
{
"id": "1353dafc1a7b4a59",
"type": "ui_slider",
"z": "24c1f56bc8eb1d36",
"name": "",
"label": "电量",
"tooltip": "电量",
"group": "776a423d272e1463",
"order": 1,
"width": "6",
"height": "2",
"passthru": true,
"outs": "all",
"topic": "topic",
"topicType": "msg",
"min": 0,
"max": "100",
"step": 1,
"className": "",
"x": 170,
"y": 340,
"wires": [
[
"5b51d2ea7045bff6"
]
]
},
{
"id": "4327197853397112",
"type": "ui_chart",
"z": "24c1f56bc8eb1d36",
"name": "",
"group": "776a423d272e1463",
"order": 2,
"width": "12",
"height": "4",
"label": "chart",
"chartType": "line",
"legend": "true",
"xformat": "HH:mm:ss",
"interpolate": "linear",
"nodata": "",
"dot": false,
"ymin": "0",
"ymax": "100",
"removeOlder": 1,
"removeOlderPoints": "",
"removeOlderUnit": "3600",
"cutout": 0,
"useOneColor": false,
"useUTC": false,
"colors": [
"#1f77b4",
"#f95a15",
"#ff7f0e",
"#2ca02c",
"#98df8a",
"#d62728",
"#ff9896",
"#9467bd",
"#c5b0d5"
],
"outputs": 1,
"useDifferentColor": false,
"className": "",
"x": 630,
"y": 300,
"wires": [
[]
]
},
{
"id": "c27918d2809fc841",
"type": "function",
"z": "24c1f56bc8eb1d36",
"name": "topic水量",
"func": "msg.topic = '水量'\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 380,
"y": 260,
"wires": [
[
"4327197853397112"
]
]
},
{
"id": "5b51d2ea7045bff6",
"type": "function",
"z": "24c1f56bc8eb1d36",
"name": "topic电量",
"func": "msg.topic = '电量'\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 380,
"y": 340,
"wires": [
[
"4327197853397112"
]
]
},
{
"id": "30621a3a429251a3",
"type": "inject",
"z": "24c1f56bc8eb1d36",
"name": "清空图表",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "[]",
"payloadType": "json",
"x": 340,
"y": 460,
"wires": [
[
"4327197853397112"
]
]
},
{
"id": "776a423d272e1463",
"type": "ui_group",
"name": "Default",
"tab": "f00e468d8d4c1d19",
"order": 1,
"disp": true,
"width": "12",
"collapse": false,
"className": ""
},
{
"id": "f00e468d8d4c1d19",
"type": "ui_tab",
"name": "Home",
"icon": "dashboard",
"disabled": false,
"hidden": false
}
]
将要导入的json内容复制到编辑区域,点击导入,再点击部署。
点击右上角的红色部署后,访问ip+1880/ui 即可访问到面板