使用内网穿透工具NPS,docker容器搭建ThingsBoard服务器
ThingsBoard 是一个开源的物联网(IoT)平台,专注于设备管理、数据收集、处理和可视化,支持多种通信协议如 MQTT、CoAP 和 HTTP。它提供了强大的规则引擎和丰富的可视化工具,帮助用户快速构建智能能源、车队跟踪、智能农业等物联网应用。基于 Java 和 TypeScript 开发,ThingsBoard 拥有活跃的社区和详细的文档,采用 Apache 2.0 开源协议,适合各种规模的物联网项目,帮助用户高效管理和分析设备数据。
一.ThingsBoard服务器部署要求:
1. 服务器要求
- 必须已部署运行ThingsBoard服务器
- 提供两种部署方案:
- 快速体验方案:使用[官方Live Demo服务器](https://demo.thingsboard.io/)
- 本地部署方案:根据操作系统选择安装方式
2. 操作系统适配
- Windows系统:需遵循[Windows专用安装指南](https://thingsboard.io/docs/user-guide/install/windows/)
- Linux系统:推荐使用Docker部署
项目地址
https://github.com/thingsboard/thingsboard?tab=readme-ov-file
文档:ThingsBoard Community Edition | ThingsBoard Community Edition
3.本项目方案
- -选择本地部署方案,Linux系统,使用Docker部署
- -使用内网设备部署ThingsBoard服务,然后利用内网穿透技术,将本地服务利用资源有限的服务器,进行端口转发暴露于公网
-
二.实施步骤
1.Docker部署
1.1实现命令参考链接
Ubuntu 快速安装docker和docker compose
1.2注意事项
目前放开 docker 的下载,脚本安装,文档服务,官网。但是镜像下载肯定还是要用镜像站,通常情况下,要先配置镜像源,再执行拉取镜像的操作。
1.2.1配置镜像源
- 若没有配置镜像源,Docker 会默认从 Docker Hub 拉取镜像,在网络状况不佳时,拉取速度 可能较慢。
- 通过编辑 daemon.json 文件,添加镜像源地址,让 Docker 在后续拉取镜像时能从这些镜像源获取数据,进而加快拉取速度。
- 具体操作步骤
1.配置 Docker 镜像源
如果你想使用这些镜像源,需要先将它们配置到 Docker 的配置文件中。以下是配置步骤:
# 创建或编辑 Docker 配置文件
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <
1.2.2尝试拉取 Thingsboard 镜像
- 配置好镜像源后,你可以尝试从这些镜像源拉取 Thingsboard 镜像。执行以下命令.
docker pull thingsboard/tb-postgres:latest
- 如果镜像存在于配置的镜像源中,Docker 会从其中一个镜像源下载该镜像;如果所有镜像源都没有该镜像,Docker 会尝试从默认的 DockerHub 拉取。
- 拉取成功下载镜像页面
2. 部署运行ThingsBoard服务
2.1Linux+Docker安装流程
- 步骤1:创建数据目录
# 创建数据存储目录
mkdir -p ~/.mytb-data
# 设置目录权限(用户组ID 799是ThingsBoard的默认用户)
sudo chown -R 799:799 ~/.mytb-data
- 步骤2:创建日志目录
# 创建日志存储目录
mkdir -p ~/.mytb-logs
# 设置相同权限
sudo chown -R 799:799 ~/.mytb-logs
- 步骤3:启动Docker容器
docker run -it -p 8080:9090 # Web访问端口映射 -p 7070:7070 # HTTP API端口 -p 1883:1883 # MQTT协议端口 -p 5683-5688:5683-5688/udp # CoAP协议端口范围 -v ~/.mytb-data:/data # 数据持久化挂载 -v ~/.mytb-logs:/var/log/thingsboard # 日志持久化 --name mytb # 容器命名 --restart always # 自动重启策略 thingsboard/tb-postgres # 使用PostgreSQL版本的镜像
3.内网穿透配置
3.1ThingsBoard端口映射关系
| 容器端口 | 宿主机端口 | 协议 | 用途 |
| 9090 | 8080 | TCP | Web界面访问 |
| 7070 | 7070 | TCP | HTTP API调用 |
| 1883 | 1883 | TCP | MQTT协议通信 |
| 5683-5688| 5683-5688 | UDP | CoAP协议通信 |
3.2内网穿透场景下的端口配置策略
3.2.1 端口映射原则
-公网服务器端口:需在公网服务器防火墙开放以下端口
-内网穿透工具:需将公网服务器端口与本地端口建立映射关系
- 说明,端口一致性的技术必要性
MQTT(1883)/CoAP(7070)端口保持穿透一致的核心原因:
- 协议规范要求:IANA分配的默认端口
- 客户端兼容性:避免修改设备端连接配置
- 防火墙策略:降低端口放行复杂度
- 服务发现机制:符合行业标准端口约定
3.2.2端口对照表
说明,HTTP服务无域名配置
| 服务类型 | 内网端口 | 公网端口 | 协议 | 备注 |
| HTTP | 8080 | 18080 | TCP | 公网端口选大数18080,避免与系统服务冲突 |
| MQTT | 1883 | 1883 | TCP | 需确认公网端口未被占用 |
| CoAP | 7070 | 7070 | UDP | 建议配置端口速率限制 |
| LwM2M | 5683-5688| 5683-5688| UDP | 需逐端口创建映射 |
3.2.3在nps的web管理网页创建客户以及穿透隧道
- 参考上篇文章,访问Web管理界面
浏览器访问
http://服务器IP:8080
,使用设置的账号密码登录。
- 创建客户端,点新增,备注可选,记住密钥,后面用来验证客户端
- 下载客户端并且修改客户端配置
编辑 conf/npc.conf
:
server_addr=服务器IP:8024 # 服务端地址和端口
conn_type=tcp # 连接协议
vkey=客户端唯一密钥 # 在Web界面创建客户端时生成
- 创建隧道
按照上面的端口对照表将本地端口(Docker映射)端口映射到公网服务器端口
示例,| HTTP | 8080 | 18080 | TCP | 公网端口选大数18080,避免与系统服务冲突 |
- 其他端口也一样穿透
- 关于| LwM2M | 5683-5688| 需逐端口创建映射 |的解决方案
LwM2M端口组批量创建脚本
#!/bin/bash for port in {5683..5688}; do echo "[lwm2m-$port] mode = udp target_addr = 127.0.0.1:$port server_port = $port rate_limit = 5MB" >> /etc/npc/conf/npc.conf done
-
说明:脚本要解决的核心痛点——通过直接修改 `npc` 的配置文件批量创建端口映射规则,避免在网页管理界面手动逐个添加
4. 服务验证方法:
- Web控制台:浏览器访问 `http://公网IP:80` 或绑定域名
- 关于不绑定域名方案
HTTP服务无域名访问实现
默认演示账户,注意访问该页面需要确保nps客户端在线。
- 用户名: `tenant@thingsboard.org`
- 密码: `tenant`
- 其他演示账户详见[官方账户说明](https://thingsboard.io/docs/getting-started-guide/helloworld/#demo-account)
补充之前配置,不绑定域名方案在NPS中实现方式:端口映射模式
mode = tcp
target_addr = 127.0.0.1:8080
server_port = 18080 # 公网访问端口