Docker部署
大约 7 分钟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一键启动即可。
一、Docker部署
1. 工程打包
- 修改
BladeX-Links
项目的blade-server
和blade-broker
目录的application.yml
文件,publicKey、privateKey、signKey等密钥。 - 修改
BladeX-Links
项目的blade-server
和blade-broker
目录的application-xx.yml
文件,数据库、Redis、InfluxDB等信息。 - 部署时我们一般采用
prod
环境变量,所以需要修改application-prod.yml
配置文件。
注意
- 这一块具体可以参考
application-test.yml
的配置,采用docker-host
方式配置,这样在docker-compose
启动时会自动连接到对应的容器地址。 - Dockerfile默认的test环境变量,若正式部署,需要修改为prod,并且参考
application-test.yml
配置好application-prod.yml
文件。 - 初次部署,可以直接采用默认的环境变量和配置进行部署熟悉流程,成功后再进行修改为prod环境部署。
application-test.yml
的内容如下,几乎无需改动,(最下方的iot地址信息可以直接在docker-compose.yml配置覆盖,这里无需操作)#数据源配置 spring: data: redis: ##redis 单机环境配置 host: iot-redis port: 6379 password: bladexadmin database: 0 ssl: enabled: false datasource: url: jdbc:mysql://iot-db:3306/bladex_iot?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8 username: bladexadmin password: bladexadmin driver-class-name: com.mysql.cj.jdbc.Driver #时序库 influxdb: url: http://iot-influxdb:8086 username: admin password: links database: links enable-batch: false #oss配置 oss: enabled: true name: minio tenant-mode: true #oss服务地址,用于内网上传 endpoint: http://iot-oss:9000 #oss转换服务地址,用于内网上传后将返回地址改为转换的外网地址 transform-endpoint: https://oss.bladex.cn access-key: bladexadmin secret-key: bladexadmin bucket-name: bladex #iot配置 blade: preview: enabled: true iot: # 外网ip或者域名 mqtt-ip: 192.168.0.1 # 外网可用的端口 mqtt-port: 1883 # broker服务ip或域名 broker-ip: blade-broker # broker服务端口 broker-port: 8888
- 配置工程根目录的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>
2. 服务器前端构建
- 修改
BladeX-Links-UI
项目的website.js
配置文件,指定publicKey配置,与后端保持一致。 - 部署时我们一般采用
prod
环境变量,所以需要修改.env.production
配置文件。 - 配置完毕后在项目根目录执行
pnpm run build:prod
命令,打包成功后根目录生成包含完整编译内容的dist
文件夹。 - 将
dist
文件夹下的内容拷贝至BladeX-Links/script/docker/nginx/html
目录下。
3. 服务器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. 服务器后端构建
- 将源码拷贝至服务器,服务器需要提前安装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
命令查看镜像是否成功构建。
4. 若需要推送到docker私服,则命令多加一个docker:push
,执行mvn clean package -DskipTests docker:build docker:push
命令便可
5. 一键部署
注意
执行docker-compose构建后,需要连接mysql服务,并且导入数据库脚本,具体脚本在bladex-links
工程的/doc/sql
目录下。
- 进入项目根目录的
/script/docker/docker-compose.yml
文件,修改mqtt对外网映射的宿主机地址和端口,若不配置外网服务无法连接并上报数据。
version: "3"
networks:
blade_net:
external: false
services:
blade-broker:
image: bladex/blade-broker:1.0.0
container_name: blade-broker
restart: unless-stopped
networks:
- blade_net
ports:
- 8888:8888
- 1883:1883
- 8083:8083
command:
#指定服务运行的环境变量
- --spring.profiles.active=test
#broker-mqtt服务器对外开放的地址信息
- --blade.iot.mqtt-ip=192.168.0.1
- --blade.iot.mqtt-port=1883
depends_on:
- iot-db
- iot-amqp
blade-server:
image: bladex/blade-server:1.0.0
container_name: blade-server
restart: unless-stopped
networks:
- blade_net
ports:
- 8000:80
command:
#指定服务运行的环境变量
- --spring.profiles.active=test
#broker-mqtt服务器对外开放的地址信息
- --blade.iot.mqtt-ip=192.168.0.1
- --blade.iot.mqtt-port=1883
depends_on:
- iot-db
- iot-oss
iot-db:
image: mysql:8.3.0
container_name: iot-db
restart: unless-stopped
security_opt:
- seccomp:unconfined
environment:
- MYSQL_ROOT_PASSWORD=aJd7G081DytxutBZ
- MYSQL_USER=bladexadmin
- MYSQL_PASSWORD=bladexadmin
- MYSQL_DATABASE=bladex_iot
ports:
- 13306:3306
networks:
- blade_net
volumes:
- ./mysql:/var/lib/mysql
iot-influxdb:
image: influxdb:1.8.10
container_name: iot-influxdb
restart: unless-stopped
security_opt:
- seccomp:unconfined
environment:
- INFLUXDB_DB=links
- INFLUXDB_HTTP_AUTH_ENABLED=true
- INFLUXDB_ADMIN_USER=admin
- INFLUXDB_ADMIN_PASSWORD=links
ports:
- 18086:8086
networks:
- blade_net
volumes:
- ./mysql:/var/lib/mysql
iot-redis:
image: redis:7.2.5
container_name: iot-redis
environment:
- TZ=Asia/Shanghai
ports:
- 16379:6379
command: redis-server --appendonly yes --requirepass bladexadmin
privileged: true
restart: always
networks:
- blade_net
volumes:
- ./redis/data:/data
iot-oss:
image: minio/minio:RELEASE.2021-04-22T15-44-28Z.hotfix.56647434e
container_name: iot-oss
restart: unless-stopped
security_opt:
- seccomp:unconfined
environment:
- MINIO_ACCESS_KEY=bladexadmin
- MINIO_SECRET_KEY=bladexadmin
ports:
- 9000:9000
command: server /data --address '0.0.0.0:9000'
networks:
- blade_net
volumes:
- ./minio/data:/data
iot-nginx:
image: nginx:stable-alpine-perl
container_name: iot-nginx
environment:
- TZ=Asia/Shanghai
ports:
- 88:88
volumes:
- ./nginx/html:/usr/share/nginx/html
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
privileged: true
restart: always
networks:
- blade_net
- 修改地址完毕,执行
docker-compose up -d
命令即可启动服务。docker-compose stop
命令为停止服务,docker-compose rm
命令为删除服务。
3. 由于本次文档演示为mac本地开发机进行docker-compose部署,则可以直接通过http://localhost:88
访问系统,若是服务器部署则需要通过服务器ip:88访问系统。
4. 前往设备模拟器模块进行mqtt服务器连接,可以看到连接成功,说明blade-broker
服务也正常启动。
5. 使用命令docker logs -f iot-nginx
可以看到部署的nginx容器日志,可以发现反向代理没有问题,可以正常访问系统。
二、部署总结
注意
- 若是服务器部署,需要将服务器的88端口映射到外网,然后通过外网ip:88访问系统。
- 为了让外部连接到mqtt服务器,同时需要将1883、8083端口映射到外网,然后通过外网ip:端口进行连接。
- 工程默认将前端打包放到了
/script/docker/nginx/html
目录,若后续有二开,请在前端工程根目录执行yarn run build
命令,然后将dist目录下的文件拷贝到/script/docker/nginx/html
目录下即可。