Docker部署(EMQX模式)
大约 9 分钟deploycode
运行环境要求
- Java: 17
- NodeJs: 18
- Maven: 3.8+
- MySql: 5.7+
- Redis: 5.0+
- TDengine 3.x
- InfluxDB: 1.8.x+
- IoTDB 1.3.x
中间件说明
- 采用Docker部署,无需安装中间件,直接通过
docker compose
一键启动即可。
一、服务构建
1. 数据库构建
- 将开发完成的数据库脚本导出后命名为
init.sql
。 - 将
init.sql
拷贝至BladeX-Links/script/docker/database
目录下,覆盖默认的初始sql脚本。
2. 前端服务构建
- 修改
BladeX-Links-UI
项目的website.js
配置文件,指定publicKey
配置,与后端保持一致。//auth配置 auth: { // 使用后端工程 @org.springblade.test.Sm2KeyGenerator 获取 publicKey: '041452f2112153a757c13a28c79657cxxxxxx435372570194a9d9cdf624b869e20a8f293d7f6fc9147', }
- 修改
website.js
配置文件mqttUrl
,在结尾增加/mqtt
。//物联网配置 links: { // MQTT服务器地址 // 若采用 emqx服务,请增加 /mqtt 地址结尾 mqttUrl: 'ws://localhost:8083/mqtt' }
- 部署时我们一般采用
prod
环境变量,所以需要修改.env.production
配置文件。 - 配置完毕后在项目根目录执行
pnpm run build:prod
命令,打包成功后根目录生成包含完整编译内容的dist
文件夹。 - 将
dist
文件夹下的内容拷贝至BladeX-Links/script/docker/nginx/html
目录下。
3. 边缘网关构建
注意
若没有二开改造,则建议使用bladex提供的node-red-pro镜像,可直接跳过此步骤,镜像地址: 点击访问。
- 将
node-red-pro
工程拷贝至服务器,进入对应目录,执行pnpm install
安装依赖,注意服务器需要先安装nodejs18
的环境。 - 修改
packages/node_modules/node-red/settings.js
数据库连接信息,执行pnpm run build
命令打包工程,生成对应的配置文件。 - 根目录给构建脚本赋予可执行权限
chmod +x docker-build.sh
- 根目录下执行命令
./docker-build.sh
进行构建镜像,构建成功后执行docker images
查看是否构建成功,注意需要先下载nodered/node-red:4.0.2-22
作为基础镜像来构建。⋊> ~/W/p/node-red-pro on dev ./docker-build.sh 22:47:53 Building Docker image bladex/node-red-pro:latest... [+] Building 0.6s (15/15) FINISHED docker:desktop-linux => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 1.79kB 0.0s => [internal] load metadata for docker.io/nodered/node-red:4.0.2-22 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [ 1/10] FROM docker.io/nodered/node-red:4.0.2-22 0.0s => [internal] load build context 0.5s => => transferring context: 1.62MB 0.5s => CACHED [ 2/10] WORKDIR /usr/src/node-red 0.0s => CACHED [ 3/10] COPY ./package.json ./package.json 0.0s => CACHED [ 4/10] COPY ./package-lock.json ./package-lock.json 0.0s => CACHED [ 5/10] COPY ./node_modules ./node_modules 0.0s => CACHED [ 6/10] COPY ./packages ./packages 0.0s => CACHED [ 7/10] COPY ./docker-entrypoint.sh ./entrypoint.sh 0.0s => CACHED [ 8/10] RUN npm config set loglevel=http && npm config set registry https://registry.npmmirror.com && npm config set cache /data/.npm --global 0.0s => CACHED [ 9/10] RUN npm install --unsafe-perm --no-update-notifier --no-audit --no-fund --only=production 0.0s => CACHED [10/10] RUN chown -R node-red:root . && chmod +x entrypoint.sh 0.0s => exporting to image 0.0s => => exporting layers 0.0s => => writing image sha256:104b4ddf3e29bb8d48c8d31b3e2d580136146e4e5c4a7eb3f2615d471bb711c9 0.0s => => naming to docker.io/bladex/node-red-pro:latest 0.0s ⋊> ~/W/p/node-red-pro on dev docker images 22:48:02 REPOSITORY TAG IMAGE ID CREATED SIZE bladex/node-red-pro latest 104b4ddf3e29 About an hour ago 953MB nodered/node-red 4.0.2-22 565a3c5e0aba 2 weeks ago 587MB
4. 后端服务构建
注意
- EMQX集群模式下,需要用到的后端服务为:
blade-emqx
、blade-data
、blade-server
。 - 其中
blade-emqx
为mqtt消息服务,blade-data
为数据处理服务,blade-server
为后台核心服务。 - 其他服务均为时序库、数据库、消息队列等中间件服务,具体可根据需求进行选择。
- 执行
BladeX-Links
项目的Sm2KeyGenerator
和SignKeyGenerator
,执行后将结果配置到/script/docker/.env
文件。同时配置好其他对应的环境变量。BLADE_PROFILES_ACTIVE=prod BLADE_OAUTH2_PUBLIC_KEY=国密公钥需自行填写 BLADE_OAUTH2_PRIVATE_KEY=国密私钥需自行填写 BLADE_TOKEN_SIGN_KEY=令牌密钥需自行填写 HOST_IP=宿主机IP需自行填写 MQTT_IP=宿主机IP需自行填写 MQTT_PORT=MQTT端口需自行填写(默认1883) EMQX_API_KEY=EMQX的API密钥需自行填写 EMQX_SECRET_KEY=EMQX的API密钥需自行填写 MYSQL_ROOT_PASSWORD=MYSQL的ROOT密码需自行填写
- 配置工程根目录的pom.xml,修改docker私有仓库的地址和账号密码。
<properties> <!-- docker --> <docker.registry.url>192.168.0.1</docker.registry.url> <docker.username>admin</docker.username> <docker.password>admin123456</docker.password> <docker.namespace>bladex</docker.namespace> <docker.fabric.skip>false</docker.fabric.skip> <docker.fabric.version>0.42.0</docker.fabric.version> </properties>
- 将源码拷贝至服务器,服务器需要提前安装docker、docker-compose、maven、java17、nodejs18等环境,这里不再赘述。
- 若无需采用docker私有仓库,可以直接忽略,但需要额外执行
docker pull bladex/alpine-java:openjdk17_cn_slim
,docker pull nginx:stable-alpine-perl
命令拉取镜像(否则构建命令会从默认的docker私服地址找镜像,又因为没有配置私服会导致找不到镜像而报错)。 - 配置完毕后在项目根目录执行
mvn clean package -DskipTests docker:build
命令,打包成功后执行docker images
命令查看镜像是否成功构建。⋊> ~/W/p/BladeX-Links on dev ◦ mvn clean package -DskipTests docker:build 11:20:39 [INFO] Scanning for projects... [INFO] ------------------------------------------------------------------------ [INFO] Reactor Build Order: [INFO] [INFO] BladeX-Links [pom] [INFO] blade-core [pom] [INFO] blade-links-core [jar] [INFO] blade-links-base [jar] [INFO] blade-demo [pom] [INFO] device-simulator [jar] [INFO] relay-amqp [jar] [INFO] relay-mqtt [jar] [INFO] blade-broker-core [jar] [INFO] blade-tsdb-api [jar] [INFO] blade-data-core [jar] [INFO] blade-mq-api [jar] [INFO] blade-broker-local [jar] [INFO] blade-broker-cluster [jar] [INFO] blade-tsdb-influxdb [jar] [INFO] blade-tsdb-influxdb2 [jar] [INFO] blade-tsdb-iotdb [jar] [INFO] blade-tsdb-tdengine [jar] [INFO] blade-mq-kafka [jar] [INFO] blade-service [pom] [INFO] blade-broker [jar] [INFO] blade-emqx [jar] [INFO] blade-data [jar] [INFO] blade-server [jar] [INFO] [================================日志过长 此处省略===============================] [INFO] [INFO] --- docker:0.42.0:build (default-cli) @ blade-server --- [INFO] Building tar: /Users/chill/Workspaces/product/BladeX-Links/blade-service/blade-server/target/docker/bladex/blade-server/2.1.0/tmp/docker-build.tar [INFO] DOCKER> [bladex/blade-server:2.1.0] "blade-server": Created docker-build.tar in 825 milliseconds [INFO] DOCKER> [bladex/blade-server:2.1.0] "blade-server": Built image sha256:f56e7 [INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary for BladeX-Links 2.1.0: [INFO] [INFO] BladeX-Links ....................................... SUCCESS [ 0.589 s] [INFO] blade-core ......................................... SUCCESS [ 0.106 s] [INFO] blade-links-core ................................... SUCCESS [ 2.137 s] [INFO] blade-links-base ................................... SUCCESS [ 0.279 s] [INFO] blade-demo ......................................... SUCCESS [ 0.067 s] [INFO] device-simulator ................................... SUCCESS [ 3.356 s] [INFO] relay-amqp ......................................... SUCCESS [ 1.767 s] [INFO] relay-mqtt ......................................... SUCCESS [ 1.697 s] [INFO] blade-broker-core .................................. SUCCESS [ 0.607 s] [INFO] blade-tsdb-api ..................................... SUCCESS [ 0.455 s] [INFO] blade-data-core .................................... SUCCESS [ 0.326 s] [INFO] blade-mq-api ....................................... SUCCESS [ 0.182 s] [INFO] blade-broker-local ................................. SUCCESS [ 0.455 s] [INFO] blade-broker-cluster ............................... SUCCESS [ 0.456 s] [INFO] blade-tsdb-influxdb ................................ SUCCESS [ 0.490 s] [INFO] blade-tsdb-influxdb2 ............................... SUCCESS [ 0.506 s] [INFO] blade-tsdb-iotdb ................................... SUCCESS [ 0.549 s] [INFO] blade-tsdb-tdengine ................................ SUCCESS [ 0.494 s] [INFO] blade-mq-kafka ..................................... SUCCESS [ 0.426 s] [INFO] blade-service ...................................... SUCCESS [ 0.007 s] [INFO] blade-broker ....................................... SUCCESS [ 2.070 s] [INFO] blade-emqx ......................................... SUCCESS [ 2.209 s] [INFO] blade-data ......................................... SUCCESS [ 2.082 s] [INFO] blade-server ....................................... SUCCESS [ 5.571 s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 27.081 s [INFO] Finished at: 2025-05-19T00:14:14+08:00 [INFO] ------------------------------------------------------------------------ ⋊> ~/W/p/BladeX-Links on dev ↑ docker images 00:14:14 REPOSITORY TAG IMAGE ID CREATED SIZE bladex/blade-server 2.1.0 f56e7d2a53cc 2 seconds ago 526MB bladex/blade-data 2.1.0 f303023b76d8 8 seconds ago 429MB bladex/blade-emqx 2.1.0 3e7db48c65f0 10 seconds ago 412MB bladex/blade-broker 2.1.0 54b5da50a63c 12 seconds ago 415MB bladex/relay-mqtt 2.1.0 2389a1d25201 19 seconds ago 411MB bladex/relay-amqp 2.1.0 3cf6c12b2506 21 seconds ago 413MB bladex/device-simulator 2.1.0 9aafaa7cd5d9 22 seconds ago 411MB
- 若需要推送到docker私服,则命令多加一个
docker:push
,执行mvn clean package -DskipTests docker:build docker:push
命令便可
二、 部署准备
1. 预启动emqx
- 进入项目根目录的
/script/docker/docker-compose-emqx.yaml
文件,若采用默认配置则无需修改,有变动的部分均已将配置交给.env
文件托管。 - 在
/script/docker
目录下先执行docker compose -f docker-compose-emqx.yaml up links-emqx -d
命令启动emqx服务用于获取密钥。 - 看到如下日志后便可进入emqx控制台,默认账号密码为 admin/public :http://localhost:18083/。
⋊> ~/W/p/B/s/docker on dev ⨯ docker compose -f docker-compose-emqx.yaml up links-emqx -d 13:33:49 [+] Running 2/2 ✔ Network docker_blade_net Created 0.0s ✔ Container links-emqx Started 0.1s ⋊> ~/W/p/B/s/docker on dev ⨯ docker logs -f links-emqx 13:34:38 WARNING: Default (insecure) Erlang cookie is in use. WARNING: Configure node.cookie in /opt/emqx/etc/emqx.conf or override from environment variable EMQX_NODE__COOKIE WARNING: NOTE: Use the same cookie for all nodes in the cluster. Listener tcp:default on 0.0.0.0:1883 started. Listener ssl:default on 0.0.0.0:8883 started. Listener ws:default on 0.0.0.0:8083 started. Listener wss:default on 0.0.0.0:8084 started. Listener http:dashboard on :18083 started. EMQX 5.8.6 is running now! { "result" : "ok", "name_vsn" : "emqx_links_pro_plugin-1.0.0", "action" : "do_allow_installation" }
2. 配置密钥
进入emqx控制台,点击
系统设置->API密钥
,然后点击创建
按钮,创建一个新的API密钥,注意⚠️:需要将生成的API密钥配置到.env
文件中。系统界面1
三、一键部署
注意
- 新版的docker无需安装docker-compose命令,可直接
docker compose xxx
启动服务。 - 若依旧使用
docker-compose
命令 则需要在docker-compose.yml
顶部增加version: "3"
方可启动。 - 启动全体服务执行命令:
docker compose -f docker-compose-emqx.yaml up -d
- 停止全体服务执行命令:
docker compose -f docker-compose-emqx.yaml down -v
将所需要的配置添加到
.env
文件中,比如如下格式。BLADE_PROFILES_ACTIVE=prod BLADE_OAUTH2_PUBLIC_KEY=041452f2112153a757c13a28c79xxxx311cb82745d15548aae6b7922b9a892f6435372570194a9d9cdf624b869e20a8f293d7f6fc9147 BLADE_OAUTH2_PRIVATE_KEY=722416faffb0xxxd2d21eb2d8cdc114f9d0e3c59127f88062aee11f66 BLADE_TOKEN_SIGN_KEY=IbW0RpmlDlG1MzOdPbxxx6NmNqxMs HOST_IP=192.168.0.1 MQTT_IP=192.168.0.1 MQTT_PORT=1883 EMQX_API_KEY=ee26b0xxxxf7e749 EMQX_SECRET_KEY=0voQMfLchjGQrLQ2NKxxxiMCcLA0x9B5rrNHnNI MYSQL_ROOT_PASSWORD=ZwBeixxxuUSv0tfrrlvULegdl9G
在
/script/docker
目录下执行docker compose -f docker-compose-emqx.yaml up -d
命令即可启动服务。docker compose -f docker-compose-emqx.yaml down -v
命令为停止删除服务。完整操作流程请见下图
系统界面3
四、部署验证
1. 配置emqx插件
下载kafka插件部署包,选择对应的平台架构,地址如下(也可以针对源码自行编译):emqx_links_pro_plugin
进入[管理->插件拓展->插件->安装插件]上传kafka插件安装包并启动插件
系统界面4 一键部署完毕后,控制台启动kafka插件,并在docker查看emqx日志,若打印如下日志则说明插件安装成功
Init emqx kafka BootstrapHosts [{"192.168.0.1",9192}, {"192.168.0.1",9292}, {"192.168.0.1",9392}] kafka_consume started KafkaTopics: [<<"blade_links_msg_down">>, <<"blade_links_kick_out">>, <<"blade_links_acl_clean">>]
2. 配置客户端认证
提示
- 配置emqx认证,具体参数见:配置Emqx的客户端认证与授权
- http接口的地址按照实际情况填写,若emqx使用docker启动,请填成宿主机的ip,否则127.0.0.1只会访问docker内部的ip,无法认证通过

3. 设备模拟器验证
提示
若采用tdengine,需先对物模型进行发布操作才可上报数据

五、部署总结
注意
- 若是服务器部署,需要将服务器的888端口映射到外网,然后通过外网ip:888访问系统。
- 为了让外部连接到mqtt服务器,同时需要将1883、8083端口映射到外网,然后通过外网ip:端口进行连接。
- 工程默认将前端打包放到了
/script/docker/nginx/html
目录,若后续有二开,请在前端工程根目录执行yarn run build
命令,然后将dist目录下的文件拷贝到/script/docker/nginx/html
目录下即可。