Node-RED 拖一张「家里服务状态页」:飞牛 NAS Docker 部署 + 内网穿透
作者
小编
发布时间

项目介绍
Node-RED 是一个开源的流程编排工具,最早是 IBM 做出来的,现在在 OpenJS 基金会下面。它的样子很好懂:左边是一排「节点」,把节点拖到画布上、用线连起来,就是一条流程。定时触发、发个请求、判断一下、存起来、再吐一个网页出来 —— 全靠拖,**不用写代码**。
它常被说成是玩智能家居的东西,但那只是它的一种用法。只要你家里已经跑了几个服务,它马上就有用:**定时去看看它们还活着没有**,再把结果排成一张页面。这篇就带你从零拖出这张状态页。
项目地址:node-red/node-red
部署安装
装在自己的 NAS 上之后,它默认只有家里的网络能打开。而这张状态页**本来就是给你在外面看的** —— 人在家里的话,直接打开那个服务就知道它活着,根本用不着这张页。家里没有公网 IP 的话,可以用 帕斯内网穿透 把它开放到公网,飞牛的应用中心里就能直接装到插件,不用另外找工具。具体的操作步骤可以参考 这份全平台上手指南。下面这套流程在飞牛 NAS 上从头到尾走一遍。
打开飞牛的 Docker 应用,切到上面的 Compose 标签,点新增项目,项目名填 nodered。
路径这一栏点右边的文件夹图标,在自己的文件夹里新建一个空目录再选中它。
来源选「创建 docker-compose 文件」,把下面这段整个贴进去:
unknown node**一共十一行,一个服务。** ports 左边的 3413 是 NAS 上对外的端口,你要是这个端口被占了就换一个;右边的 1880 是容器里的,**右边那个不要改**。镜像用官方的 nodered/node-red,两百多兆。
TZ 那一行是时区。这一期要用到定时节点,时区不对的话你在界面上看到的时间戳会对不上,调试的时候很容易被绕进去。
🔴 **最后那一行 volumes 千万别省。** 你拖出来的流程、设置、凭据全在容器里的 /data,不挂出来的话删一次容器就全没了 —— 辛辛苦苦连的线一根都不剩。
⚠ 这里和上游文档有个不一样的地方:官方示例用的是**具名卷**(node_red_data:/data),而飞牛的 Docker 界面里没有「存储卷」这一页,具名卷建了就删不掉。所以这份改成了 **./data:/data** 这种绑定挂载 —— 目录就落在你刚才选的项目目录里,将来想从头来一次,把目录清空就行。
最后勾上「创建项目后立即启动」,点确认,拉完会自己起来。
🔴 通电之前先看这一段:它出厂是不设防的
这一段比上面所有步骤都重要,**看完再往下做**。
Node-RED **出厂没有任何登录**。谁打开那个地址,谁就是管理员,能改你所有的流程。而且它自带一个叫 exec 的节点,**作用是在容器里执行命令**。把一个这样的东西直接敞在公网上,等于把 NAS 交出去。
它自己也有一套鉴权(改 settings.js、再生成一段密文口令填进去),但那要进容器改配置文件、还要会用命令行生成密文,**不是一步能过的事**。
更省事的做法是**让隧道那一层来挡**:建隧道的时候协议选 HTTP,选它之后表单下面会多出「网页访问用户名 / 密码」两栏。填上,以后任何人打开这个公网地址,都要先过这道口令才看得见 Node-RED。
⚠ 这道口令上限是 **12 个字符**,填超了提交是没有提示的 —— 看着像成功了,其实没生效。
⚠ 还要知道这道口令挡的是**公网这条路**。容器在你家局域网里的那个端口仍然是不设防的,家里网络上的设备直接连它照样不用口令。介意的话,就别把这个端口在局域网里随便告诉人。
配上内网穿透
容器跑起来之后紧接着把隧道建上。在飞牛的应用中心里搜 PassNAT 装上,打开插件,账号登一次。
点创建隧道:名字随便起;**协议选 HTTP**(就是上一段说的原因);本地地址那一栏留它默认的不要动,端口填 3413;子域名自己起一个,顶级域名在下拉里挑一个带「自动解析」的;最后把网页访问的用户名和密码填上。
🔴 **先把口令填好,再去通电。** 顺序反过来的话,中间那段时间它是**敞着**的。
建好之后点开这条隧道的详情,把电源按一下,等状态转成运行中,面板上「公网连接」那一行就是分给你的地址 —— HTTP 模式给的是个域名,不是一串 IP 加端口。**后面的操作全在这个地址上做。**
第一次打开
用公网地址打开,先弹出来的是刚才设的那道口令,填进去才是 Node-RED 的编辑器。
⚠ 第一次进去会弹一个英文的小窗「Enable Update Notifications」,问你要不要让它检查新版本(会往外发一次匿名请求)。不想要就点右边那个「No, do not enable notifications」。这个窗**换个浏览器还会再弹一次** —— 它记在浏览器那一侧,不是记在服务器上。
⚠ 紧接着还会再弹一个,是英文的新版导览「Welcome to Node-RED 5.0!」,右下角写着 1/11、有个「开始」按钮。想看就跟着走一遍,不看就点右上角的 × 关掉。它**比上面那个晚十几秒才出来**,所以别以为关掉一个就没事了 —— 等一会儿第二个才到。
拖出这张状态页
这条流程一共九个方块,分成两条线:
**第一条线负责探**:定时的方块每 30 秒响一次 → 一个小方块里写着要探哪几个地址 → http request 挨个去请求 → 最后一个方块把每一条的结果记下来。
**第二条线负责出页面**:有人访问 /status → 把刚才记下的结果排成一张表 → 套上样式拼成 HTML → 发回去。
你不用一个个拖。在编辑器右上角的菜单里点「导入」,把下面这段整个贴进去,确认,九个方块就自己摆好了,线也连好了。然后点右上角的「部署」。
unknown node导入之后打开那个叫「要探的几个服务」的方块,里面就是一张表,**想加一个服务就加一行** —— 名字随便写,地址填你家里那个服务的地址。上面那三行是示例,改成你自己的。
部署完之后,用「公网地址 /status」打开,就是那张页了。通的绿点、不通的红点,下面还有最后一次检查的时间。手机上打开也是这一页。
三个容易卡住的地方
**一、http request 那个方块的地址栏是空的。** 它读的是上一个方块传过来的 msg.url,所以那张表里必须给出 url 这个字段(上面那段已经写好了)。你要是自己重新搭,忘了这一句的话它哪都不会去,而且不报错。
**二、它的「错误处理」开关方向和直觉是反的。** http request 里有一项,勾上的意思是「出错了交给专门的错误节点」—— 那样的话**出错的那一条就不从输出口出来了**,结果就是:探不通的那个服务在页面上**根本不出现**,而其他几行好好的。看着像「只是还没探到」,其实是它被分流走了。要让红色那行出现,这一项得是关着的。
**三、探不通的时候,状态码不是数字。** 连不上时它给的是 ECONNREFUSED 这样的字符串,拿去和 200 比大小永远是 false。上面那段里是先判断了类型再比的,你照抄就行;自己改的时候留意一下。
两个要说清楚的地方
第一,**界面是中英混排的**。左边的页签「设置 / 控制板 / 键盘 / 环境配置」是中文,但右边有几项(Appearance、Theme、Update Notifications 这些)还是英文。不是你装错了,它的中文翻译就是没做完。
第二,**这篇用到的全是它自带的节点**,没有装任何第三方扩展。设置里的「控制板」那一页能装社区做的节点,有六千多个,需要什么再去装 —— 但这张状态页不需要,自带的就够了。
本篇教程结束。