ThingsKit开发指南-平台docker镜像(在线)部署

预置条件

打包部署时,需要事先准备好工具和环境。例如:docker镜像库、本地开发环境等。

本地开发环境(必须)

此处为语雀内容卡片,点击链接查看:https://yunteng.yuque.com/avshoi/hlzqwf/ttyhd4v2z5a0z3sg

准备docker镜像库

💡 提示

项目编译打包时,如果开启docker编译发布功能,会在docker镜像库上生成所有服务的镜像文件。

docker镜像库用于存放各服务组件的docker镜像。例如:规则引擎、脚本引擎和MQTT设备接入服务等。镜像库可以自己搭建私有的docker镜像库,也可以使用官方的docker镜像库。

https://hub.docker.com

下面,我们将基于Nexus讲解如何搭建docker镜像库。

云服务器配置

防火墙配置

NEXUS默认端口清单

序号端口端口说明
18081nexus管理页面端口
28082docker镜像库的端口,可自定义。

目录权限配置

当宿主机的磁盘目录映射到nexus的容器时,需要赋予相关的操作权限。

chown  -R 200 /var/_backups/nexus
chown  -R 200 /var/_datas/datas/nexus
chown  -R 200 /var/_logs/nexus

docker安装Nexus

docker-compose配置文件内容上传到服务器后,执行安装命令

docker-compose up -d
docker-compose logs -f                     #查看Nexus启动日志

docker-compose配置文件内容如下。

  nexus3:
    image: sonatype/nexus3:3.41.1
    container_name: nexus3
    restart: always
    volumes:
      - ./conf/nexus.properties:/nexus-data/etc/nexus.properties
      - ${DIR_DATA}/nexus/db:/nexus-data/db    
      - ${DIR_DATA}/nexus/blobs:/nexus-data/blobs
      - ${DIR_LOG}/nexus3:/nexus-data/log
      - ${DIR_BACKUP}/nexus:/nexus-data/etc/logback
    ports:
      - "${NEXUS_PORT}:8081"   
      - "${NEXUS_DOCKER_PUSH_PORT}:8088"  
      - "${NEXUS_DOCKER_PULL_PORT}:5000"      
    env_file:
      - /_dockerCompose/_env_common.env

超级管理员登录

Nexus成功部署后,访问 localhost:8081,点击右上角的登入按钮时,会弹出如下的对话框。

ThingsKit开发指南-平台docker镜像(在线)部署

密码文件/nexus-data/admin.password在安装时自动生成。密码获取方式如下:

docker exec -it nexus3 bash                     #登录nexus容器
cat /nexus-data/admin.password                  #查看默认密码

管理员admin等候后会弹出配置向导,结合实际情况配置即可。

创建自有docker镜像库

ThingsKit开发指南-平台docker镜像(在线)部署

如图3步操作进入仓库创建页面。并选择docker(hosted)类型仓库。

仓库表单信息如下图。

ThingsKit开发指南-平台docker镜像(在线)部署

配置docker库认证器

未配置时,执行docker登录命令会返回如下信息:

Error response from daemon: login attempt to http://localhost:8082/v2/ failed with status: 401 Unauthorized

ThingsKit开发指南-平台docker镜像(在线)部署

Docker镜像构建环境配置

💡 提示

docker镜像的编译打包需要有1台可用的Docker daemon主机。

开启远程API(不推荐)

开启远程访问后,Docker服务器容易被攻击,不推荐使用在线Docker方式。

vi /usr/lib/systemd/system/docker.service


#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock


systemctl daemon-reload

配置镜像库(必须)

配置insecure-registries后docker才能使用http协议发布docker镜像。

tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["http://localhost:8082","https://epp1l9w6.mirror.aliyuncs.com"], 
"insecure-registries": ["localhost:8082"]
}
EOF


 systemctl restart docker    #重启docker,应用配置

打包

1/4:准备业务数据表的初始化脚本

数据传输:克隆数据库

将数据库中的业务数据表(tk_*sys_*qrtz_*)克隆到新库中。

ThingsKit开发指南-平台docker镜像(在线)部署

脏数据清理

删除不需要的测试数据。

  • 业务表sys_areasys_dictsys_dict_itemtk_map_geo_jsonsys_menu等表的数据都需要,无需清除。
  • 业务表sys_rolesys_role_menusys_usersys_user_rolesys_tenanttk_data_view_interfacetk_java_script等表的数据需要选择性清除。

delete from sys_role where id not in ('81818181-8181-8181-8181-818181818181','0644c9e0-0e03-42c5-9a7f-bc2eea2b13dc');
delete from sys_role_menu where role_id not in ('81818181-8181-8181-8181-818181818181','0644c9e0-0e03-42c5-9a7f-bc2eea2b13dc') ;


delete from sys_user where username not in ('sysadmin');
delete from sys_user_role where role_id not in ('81818181-8181-8181-8181-818181818181','0644c9e0-0e03-42c5-9a7f-bc2eea2b13dc') or user_id not in('80808080-8080-8080-8080-808080808080');


delete from sys_tenant where tenant_id not in ('13814000-1dd2-11b2-8080-808080808080');


delete from tk_java_script where tenant_id not in ('13814000-1dd2-11b2-8080-808080808080');

delete from tk_data_view_interface where interface_type!='SYSTEM';
  • 其他表的数据可以全部清除。

测试数据清除后,将业务数据表导出生成SQL文件。将生成的SQL文件的DROP语句用替换功能注释掉并放入项目目录。

还需要删除

2/4:准备业务数据表的升级脚本

表结构同步

使用结构同步工具,对两个版本之间的表结构进行差异化比较并同步。

ThingsKit开发指南-平台docker镜像(在线)部署

表数据同步

💡 提示

进行数据之前必须对旧版本的表结构进行升级。否则生成的数据同步的SQL有缺失。

ThingsKit开发指南-平台docker镜像(在线)部署

SQL脚本检视

  • 升级脚本不能修改用户表(sys_user)的密码(password),例如:"password" =

3/4:配置编译打包信息

启用微服务包

打包时,默认没有执行docker镜像相关的操作。首先需要在根pom.xml文件中编辑模块管理功能如下:

    <modules>
        <module>netty-mqtt</module>
        <module>common</module>
        <module>rule-engine</module>
        <module>dao</module>
        <module>transport</module>
        <module>ui-ngx</module>
        <module>tools</module>
        <module>application</module>
        <module>msa</module>                    #微服务组件的docker镜像
        <module>rest-client</module>
    </modules>

配置docker编译发布插件

maven的编译插件dockerfile-maven-plugin简化了直接操作Docker的复杂度。

./msa/pom.xml文件中修改docker插件的配置信息。关键配置如下:


    <properties>
        <main.dir>${basedir}/..</main.dir>
        <docker.repo>127.0.0.1:8082</docker.repo>            #不包含传输协议
        <dockerfile.skip>false</dockerfile.skip>             #不跳过dockerfile编译
        <blackBoxTests.skip>true</blackBoxTests.skip>
        <dockerfile-maven.version>1.4.13</dockerfile-maven.version>
        <docker.push-arm-amd-image.phase>none</docker.push-arm-amd-image.phase>
    </properties>

4/4:执行编译打包命令

编译打包


mvn clean install -DskipTests=true     #不打包docker镜像
#同时打包docker镜像
mvn clean install -DskipTests=true -P push-docker-image -Ddockerfile.username=仓库用户名 -Ddockerfile.password=仓库用户密码

打包输出

monolith(单机模式)/tb-core(核心组件)/tb-core(规则引擎)部署包

编译打包后在对应服务的target目录下有如下文件清单。

ThingsKit开发指南-平台docker镜像(在线)部署

微服务模式部署包:MQTT设备接入

编译打包后在对应服务的target目录下有如下文件清单。

ThingsKit开发指南-平台docker镜像(在线)部署

微服务模式部署包:TCP/UDP设备接入

编译打包后在对应服务的target目录下有如下文件清单。

ThingsKit开发指南-平台docker镜像(在线)部署

docker镜像

执行docker命令查看镜像会有相应的镜像清单。

ThingsKit开发指南-平台docker镜像(在线)部署

镜像库会有相应的镜像记录。

ThingsKit开发指南-平台docker镜像(在线)部署

部署

💡 提示

部署包所在的文件目录中,不能包含中文。

💡 提示

单体部署、微服务部署都可以,使用不同的镜像即可。本文章使用微服务部署。

1:创建数据库ThingsKit

💡 提示

所有的部署方式都是基于数据库postgresql已经安装完毕且可以访问的前提。

💡 提示

【Docker单体部署】时,启动脚本会自动创建数据库并初始化。可跳过当前操作。

二选一:数据库管理工具(例如:navicat)

此处为语雀内容卡片,点击链接查看:https://yunteng.yuque.com/avshoi/v1xdocs/ymc726m07slmhwfk

2:编辑配置文件

日志配置文件

💡 提示

【平台Docker镜像】使用打包生成的在线Docker镜像时,需要映射相关的配置文件。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration>
<configuration scan="true" scanPeriod="10 seconds">

    <appender name="fileLogAppender"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>thingskit.log</file>
        <rollingPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>thingskit.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>100MB</maxFileSize>
            <maxHistory>30</maxHistory>
            <totalSizeCap>3GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>%d{ISO8601} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <logger name="org.thingsboard.server" level="INFO" />
    <logger name="com.microsoft.azure.servicebus.primitives.CoreMessageReceiver" level="OFF" />

    <root level="INFO">
        <appender-ref ref="fileLogAppender"/>
    </root>

</configuration>

JVM配置文件

💡 提示

【平台Docker镜像】使用打包生成的在线Docker镜像时,需要映射相关的配置文件。

export JAVA_OPTS="$JAVA_OPTS -Dinstall.data_dir=/usr/share/thingsboard/data"

export JAVA_OPTS="$JAVA_OPTS -Xlog:gc*,heap*,age*,safepoint=debug:file=gc.log:time,uptime,level,tags:filecount=10,filesize=10M"
export JAVA_OPTS="$JAVA_OPTS -XX:+IgnoreUnrecognizedVMOptions -XX:+HeapDumpOnOutOfMemoryError"
export JAVA_OPTS="$JAVA_OPTS -XX:-UseBiasedLocking -XX:+UseTLAB -XX:+ResizeTLAB -XX:+PerfDisableSharedMem -XX:+UseCondCardMark"
export JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC -XX:MaxGCPauseMillis=500 -XX:+UseStringDeduplication -XX:+ParallelRefProcEnabled -XX:MaxTenuringThreshold=10"

Docker部署:微服务

环境变量的编辑请参考Docker部署:

此处为语雀内容卡片,点击链接查看:https://yunteng.yuque.com/avshoi/v1xdocs/hbotpubinhfzbrwu#YvRAw

#***************************************
#******Thingskit物联网平台原始配置******
#***************************************
#时区
TZ=Asia/Shanghai

#字符编码,C(只包含严格的ASCII字符)、zh_CN(中文语言环境,字符集是Unicode)、en_US(美式英语语言环境,字符集是Unicode)
LANG=C.UTF-8
LC_ALL=C.UTF-8

TK_DB_VERSION=v1.1.0_Release
TK_APP_VERSIONBASE=v1.1.0_Release
CLUSTER_NODE_ID=1                #集群内当前节点标识,对应节点的IP改为广播地址【0.0.0.0】
CLUSTER_NODE_ONE=集群节点1
CLUSTER_NODE_TWO=集群节点2
CLUSTER_NODE_THREE=集群节点3
ZOOKEEPER_ACCESS_ADRESS=需要被替换的模板变量1
DB_ACCESS_ADRESS=需要被替换的模板变量2
QUEUE_ACCESS_ADRESS=需要被替换的模板变量3
MINIO_ACCESS_ADRESS=需要被替换的模板变量4
CACHE_HOST_DOMAIN=需要被替换的模板变量5
UI_API_HOST_DOMAIN=需要被替换的模板变量7
SCADA_HOST_DOMAIN=需要被替换的模板变量9
#并发量大于2W使用Cassandra
CASSANDRA_ACCESS_ADRESS=需要被替换的模板变量8
SERVER_HOST_DOMAIN=需要被替换的模板变量0    #KAFKA、CASSANDRA
SERVER_HOST_IP=需要被替换的模板变量10
USER_NAME=thingskit
USER_PASSWORD=thingskit

#证书配置
TLS_FILE_PUBLIC=com.thingskit.pem
TLS_FILE_PRIVATE=com.thingskit.key
PROTOCOL_HTTP=http

#*****************************************
#软件:服务中心配置
ALLOW_ANONYMOUS_LOGIN=true
ZOO_MY_ID=${CLUSTER_NODE_ID}        #集群内节点标识,对应节点的IP改为广播地址【0.0.0.0】
#ZOO_SERVERS=server.1=${CLUSTER_NODE_ONE}:2888:3888;2181 server.2=${CLUSTER_NODE_TWO}:2888:3888;2181 server.3=${CLUSTER_NODE_THREE}:2888:3888;2181;  
ZOO_SERVERS=server.1=${CLUSTER_NODE_ONE}:2888:3888;2181
ZOO_CFG_EXTRA="metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider metricsProvider.httpPort=7070" #程序运行状态监控

#*****************************************
#软件:消息中间件配置
KAFKA_CFG_NODE_ID=${CLUSTER_NODE_ID}                #集群内节点标识,对应节点的IP改为广播地址【0.0.0.0】
KAFKA_BROKER_ID=${CLUSTER_NODE_ID}                  #集群内节点标识,对应节点的IP改为广播地址【0.0.0.0】
KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@${CLUSTER_NODE_ONE}:9093 #,2@${CLUSTER_NODE_TWO}:9093,3@${CLUSTER_NODE_THREE}:9093

#安全策略二选一:允许匿名访问
ALLOW_PLAINTEXT_LISTENER=yes 
KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 
KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://${SERVER_HOST_DOMAIN}:9092   # 公网访问服务的监听,格式【协议://公网IP:端口】

#安全策略二选一:账号密码鉴权
#KAFKA_CFG_LISTENERS=SASL_PLAINTEXT://:9092,CONTROLLER://:9093 
#KAFKA_CFG_ADVERTISED_LISTENERS=SASL_PLAINTEXT://${SERVER_HOST_DOMAIN}:9092   # 公网访问服务的监听,格式【协议://公网IP:端口】
#KAFKA_CFG_INTER_BROKER_LISTENER_NAME=SASL_PLAINTEXT                          #集群内节点间的安全策略
#KAFKA_CFG_SASL_MECHANISM_INTER_BROKER_PROTOCOL=PLAIN                         #集群内节点间鉴权的安全协议,
#KAFKA_CLIENT_USERS=${USER_NAME}                                              #对外提供服务的鉴权账号   9092
#KAFKA_CLIENT_PASSWORDS=${USER_PASSWORD}                                      #对外提供服务的鉴权密码   9092   
#KAFKA_INTER_BROKER_USER=${USER_NAME}                                         #集群内节点间鉴权账号
#KAFKA_INTER_BROKER_PASSWORD=${USER_PASSWORD}                                 #集群内节点间鉴权密码

KAFKA_CFG_PROCESS_ROLES=controller,broker 
KAFKA_KRAFT_CLUSTER_ID=8fkvTDgQRGKnSZ5O0cetCQ   #${KRAFT_CLUSTER_ID}  集群ID值为22位的UUID
KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SASL_PLAINTEXT:SASL_PLAINTEXT,SSL:SSL,SASL_SSL:SASL_SSL
KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER  

#KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1                                                 #高可用:副本数与节点数一致
KAFKA_HEAP_OPTS=-Xmx2g -Xms2g   #性能配置
KAFKA_NUM_NETWORK_THREADS=9
KAFKA_NUM_IO_THREADS=16
KAFKA_SOCKET_SEND_BUFFER_BYTES=1024000
KAFKA_SOCKET_RECEIVE_BUFFER_BYTES=1024000
KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=false
KAFKA_CFG_LOG_RETENTION_BYTES=1073741824
KAFKA_CFG_SEGMENT_BYTES=268435456
KAFKA_CFG_LOG_RETENTION_MS=300000
KAFKA_CFG_LOG_CLEANUP_POLICY=delete

#*****************************************
#软件:多媒体文件存储配置
MINIO_ROOT_USER=${USER_NAME}
MINIO_ROOT_PASSWORD=${USER_PASSWORD}
MINIO_SERVER_URL="${PROTOCOL_HTTP}://${MINIO_ACCESS_ADRESS}"
MINIO_BUCKET_NAME=yunteng-test

#*****************************************
#软件:redis配置
REDIS_MAXCLIENTS=4096                     #redis并发连接数,/proc/sys/net/core/somaxconn

#*****************************************
#软件:postgresql配置
POSTGRES_PASSWORD=${USER_PASSWORD}

#*****************************************
#软件:cassandra配置
CASSANDRA_CLUSTER_NAME=yunteng        #集群内节点一致
CASSANDRA_SEEDS=123.60.37.18   #已在集群内的节点IP       ;新节点上线时通知集群扩展节点。
#CASSANDRA_LISTEN_ADDRESS=${SERVER_HOST_IP}       #当前节点对外服务的监听地址
CASSANDRA_BROADCAST_ADDRESS=${SERVER_HOST_DOMAIN}    #当前节点与集群内其它节点的广播地址 CASSANDRA_BROADCAST_RPC_ADDRESS

#******************************************
#***Thingskit微服务模式服务组件:公共配置***
#******************************************

# 节点资源监控,例如:prometheus、info
METRICS_ENABLED=true
METRICS_TIMER_PERCENTILES=1
METRICS_ENDPOINTS_EXPOSE=prometheus
#WEB_APPLICATION_ENABLE=true          # 设备接入服务配置
#WEB_APPLICATION_TYPE=servlet         # 设备接入服务配置
#HTTP_BIND_PORT=8081                  # 设备接入服务配置

#缓存存储配置
CACHE_TYPE=redis
REDIS_HOST=${CACHE_HOST_DOMAIN}
REDIS_PORT="6379"
REDIS_PASSWORD=${USER_PASSWORD}

#消息中间件配置  kafka  or rabbitmq
TB_QUEUE_TYPE=kafka
TB_KAFKA_SERVERS=${QUEUE_ACCESS_ADRESS}


#服务中心配置
ZOOKEEPER_ENABLED=true
ZOOKEEPER_URL=${ZOOKEEPER_ACCESS_ADRESS}
ZOOKEEPER_NODES_DIR=/thingsKit

#******************************************


# 脚本解析使用哪里的脚本引擎:local/remote
JS_EVALUATOR=local




#******************************************
#***Thingskit微服务模式服务组件:特有配置***
#******************************************
##【核心服务/规则引擎】##
SPRING_DATASOURCE_URL="jdbc:postgresql://${DB_ACCESS_ADRESS}/thingskit"
SPRING_DATASOURCE_USERNAME=postgres 
SPRING_DATASOURCE_PASSWORD=${POSTGRES_PASSWORD} 
#cassandra, sql, or timescale (for hybrid mode, DATABASE_TS_TYPE value should be cassandra, or timescale)
DATABASE_TS_TYPE=sql
#cassandra, sql, or timescale (for hybrid mode, DATABASE_TS_TYPE value should be cassandra, or timescale)
DATABASE_TS_LATEST_TYPE=sql
CASSANDRA_KEYSPACE_NAME=thingskit
CASSANDRA_URL=${CASSANDRA_ACCESS_ADRESS}
CASSANDRA_USE_CREDENTIALS=true
CASSANDRA_USERNAME=${USER_NAME}
CASSANDRA_PASSWORD=${USER_PASSWORD}


MINIO_NAME=${MINIO_ROOT_USER}
MINIO_PWD=${MINIO_ROOT_PASSWORD} 
MINIO_URL=${MINIO_SERVER_URL}
ACCOUNT_EMAIL_SUFFIX=thingskit.com
ACCOUNT_PASSWORD_FORCE_RESET=true
DEFAULT_PASSWORD=123456
#      WECHAT_APP_ID: 微信小程序APP_ID
#      WECHAT_APP_SECRET: 微信小程序APP_SECRET
FRP_PORT=20637
FRP_SERVER_ADDRESS="PROTOCOL_HTTP://${SERVER_HOST_IP}"

3:初始化数据库

💡 提示

可以使用开发环境对部署环境的数据库进行初始化。

💡 提示

数据库是否初始化成功,需要从数据库的表admin_settings是否存在2条数据。

ThingsKit开发指南-平台docker镜像(在线)部署

4:启动ThingsKit物联网平台

💡 提示

请确保部署环境已安装docker和docker-compose。

据您的操作系统选择

此处为语雀内容卡片,点击链接查看:https://yunteng.yuque.com/avshoi/v1xdocs/pc6mq85nntgusa1b

此处为语雀内容卡片,点击链接查看:https://yunteng.yuque.com/avshoi/v1xdocs/ombfzh3udmssrpoo

此处为语雀内容卡片,点击链接查看:https://yunteng.yuque.com/avshoi/v1xdocs/xl0p1wko115eixcn

修改docker配置

💡 提示

为了从自有的私有库中拉取微服务的镜像,我们需要在配置文件/etc/docker/daemon.json中添加库地址。

vi /etc/docker/daemon.json              #编辑docker配置文件


##############################
######daemon.json配置内容######
##############################
{
"registry-mirrors": ["http://私有库IP或域名:8082","https://epp1l9w6.mirror.aliyuncs.com"], 
"insecure-registries": ["私有库IP或域名:8082"]
}



docker restart                          #重启docker

搭建运行环境

ThingsKit物联网平台以微服务模式运行时,需要服务中心(zookeeper)、关系数据库(pgsql)、缓存管理工具(redis)、消息中间件(kafka)、和负载均衡(haproxy)相关工具。

容器编排文件(docker-compose.yml)


version: "3"
services:
  zookeeper:
    image: zookeeper:3.8
    restart: always
    container_name: zookeeper
    healthcheck:
      test: ["CMD", "zkServer.sh", "version"]
      interval: 6s
      timeout: 10s
      retries: 20
    hostname: zookeeper
    ports:
      - "2182:8080"   #集群管理端口  http://localhost:8080/commands
      - "2181:2181"
    env_file:
      - /_makeFile/miscroservice.env
      
  kafka1:
    image: bitnami/kafka:3.6
    restart: always
    container_name: kafka1
#    user: root
#    volumes:
#      - /var/_datas/msg/kafka1:/bitnami/kafka/data
    ports:
      - "9092:9092"
      - "9093:9093"
    env_file:
      - /_makeFile/miscroservice.env
      
      
  pgsql:
    container_name: pgsql
    image: timescale/timescaledb:2.6.1-pg13
    restart: always
    volumes:
      - /var/_datas/pgsql:/var/lib/postgresql/data
      - /var/_backups/pgsql:/var/_backups
    ports:
      - "5432:5432"
    env_file:
      - /_makeFile/miscroservice.env
      
  redis: #【应用软件】
    container_name: redis
    image: redis:7
    restart: always
    command: redis-server --requirepass thingskit                                                     #单机模式
#    command: redis-server --requirepass thingskit --cluster-enabled yes --cluster-node-timeout 5000   #集群模式 集群配置信息文件(--cluster-config-file /etc/redis/nodes.conf)由Redis自行更新不用手动配置
#    volumes:
#      - /var/_datas/redis/conf:/etc/redis/redis.conf
#      - /var/_datas/redis:/data
    ports:
      - "6379:6379"
    env_file:
      - /_makeFile/miscroservice.env      

  minio: #【应用软件】
    container_name: minio
    image: minio/minio:RELEASE.2023-03-22T06-36-24Z
    restart: always
    command: server --console-address ':9001' /data
    volumes:
#_makeFile      - /_makeFile/_cert/com.thingskit.key:/root/.minio/certs/private.key
#_makeFile      - /_makeFile/_cert/com.thingskit.pem:/root/.minio/certs/public.crt
      - /var/_datas/minio:/data
#      - /var/_datas/minio/config:/root/.minio/
    ports:
      - "9000:9000"
      - "9001:9001"
    env_file:
      - /_makeFile/miscroservice.env
      
      
  haproxy:
    image: haproxy:2.7
    container_name: haproxy
    restart: always
#    healthcheck:
#      test: [ "CMD-SHELL", "curl -sS 'http://localhost:9999' || exit 1"]
#      interval: 1m
#      timeout: 5s
#      retries: 10
    volumes:
      - ./conf/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
      - /_makeFile/_cert:/usr/local/etc/haproxy/certs.d
      - /_makeFile/_cert/com.thingskit.pem:/usr/local/etc/haproxy/default.pem
      - /_makeFile/_cert/com.thingskit.key:/usr/local/etc/haproxy/default.pem.key
#      - ${DIR_LOG}/haproxy:/var/log/haproxy
    ports:
      - "9999:9999" #服务监控端口【/stats】
      - "80:80"
      - "443:443"
      - "8080:8080"
      - "1883:1883"
      - "8088:8088" 
      - "8088:8088/udp" 
    env_file:
      - /_makeFile/miscroservice.env

负载均衡配置文件(haproxy.cfg)

#####################################
#######全局配置:全部节点######
#####################################
global
 ulimit-n 500000
 maxconn 99999
 maxpipes 99999
 tune.maxaccept 500
 
 log 127.0.0.1 local0
 log 127.0.0.1 local1 notice

 ca-base /etc/ssl/certs
 crt-base /etc/ssl/private

 ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
 ssl-default-bind-options no-sslv3





###############################################
###### 默认配置=frontend+backend+listen########
###############################################
defaults
 log global
 mode http

 timeout connect 5000ms
 timeout client 50000ms
 timeout server 50000ms
 timeout tunnel  1h    # timeout to use with WebSocket and CONNECT

 default-server init-addr none

#enable resolving throught docker dns and avoid crashing if service is down while proxy is starting
resolvers docker_resolver
  nameserver dns 127.0.0.11:53



#####################################
###### 统计功能配置 ##################
#####################################
listen stats
 bind *:9999
 stats enable
 stats hide-version
 stats uri /stats
 stats auth "${USER_NAME}:${USER_PASSWORD}"


#####################################
###### 设备接入服务 ##################
#####################################
listen device-mqtt
 bind *:1883
 mode tcp
 option clitcpka # For TCP keep-alive
 timeout client 3h
 timeout server 3h
 option tcplog
 balance leastconn
#设备接入协议MQTT负载均衡节点
# server 节点别名1 访问服务的IP或域名:端口 check inter 5s resolvers docker_resolver resolve-prefer ipv4


listen device-tpc
 bind *:8088
 mode tcp
 option clitcpka # For TCP keep-alive
 timeout client 3h
 timeout server 3h
 option tcplog
 balance leastconn
#设备接入协议TCP负载均衡节点
# server 节点别名1 访问服务的IP或域名:端口 check inter 5s resolvers docker_resolver resolve-prefer ipv4





frontend http-in
  bind *:80 alpn h2,http/1.1

  option forwardfor

  http-request add-header "X-Forwarded-Proto" "http"

  acl transport_http_acl path_beg /api/v1/
  acl letsencrypt_http_acl path_beg /.well-known/acme-challenge/
  acl core_api_acl path_beg /api/ /swagger /webjars /v2/ /v3/ /static/rulenode/ /oauth2/ /login/oauth2/ /static/widgets/

  redirect scheme https if !letsencrypt_http_acl !transport_http_acl { env(FORCE_HTTPS_REDIRECT) -m str true }

  use_backend letsencrypt_http if letsencrypt_http_acl
  use_backend device-http-backend if transport_http_acl
  use_backend core-api-backend if core_api_acl

  default_backend ui-backend

frontend https_in
  bind *:443 ssl crt /usr/local/etc/haproxy/default.pem ciphers ECDHE-RSA-AES256-SHA:RC4-SHA:RC4:HIGH:!MD5:!aNULL:!EDH:!AESGCM alpn h2,http/1.1

  option forwardfor

  http-request add-header "X-Forwarded-Proto" "https"

  acl transport_http_acl path_beg /api/v1/
  acl core_api_acl path_beg /api/ /swagger /webjars /v2/ /v3/ /static/rulenode/ /oauth2/ /login/oauth2/ /static/widgets/

  use_backend device-http-backend if transport_http_acl
  use_backend core-api-backend if core_api_acl

  default_backend ui-backend

backend letsencrypt_http
  server letsencrypt_http_srv 127.0.0.1:8080

backend ui-backend
  balance leastconn
  option tcp-check
  option log-health-checks
#可视化界面的负载均衡节点
#  server 节点别名1 访问服务的IP或域名:9527 check inter 5s resolvers docker_resolver resolve-prefer ipv4
  http-request set-header X-Forwarded-Port %[dst_port]

backend device-http-backend
  balance leastconn
  option tcp-check
  option log-health-checks
#设备接入协议HTTP的负载均衡节点
#  server 节点别名1 访问服务的IP或域名:8081 check inter 5s resolvers docker_resolver resolve-prefer ipv4
  
backend core-api-backend
  balance source
  option tcp-check
  option log-health-checks
#核心服务的负载均衡节点
#  server 节点别名1 访问服务的IP或域名:8080 check inter 5s resolvers docker_resolver resolve-prefer ipv4
  http-request set-header X-Forwarded-Port %[dst_port]

启用微服务组件

核心服务

version: '3'
services:
 ########################################################
 ######### 微服务模式ThingsKit【核心服务】#########
 ########################################################
  服务名:
    image: thingskit:company                               #离线镜像地址
    #image: 127.0.0.1:8081/thinskit/tb-node:3.3.4-SNAPSHOT #在线镜像地址
    restart: always
    ports:
      - "8080:8080"
    volumes:
      - /_makeFile/services/_image/_workspace/_logback.xml:/config/logback.xml
      
      #在线镜像需要映射如下目录
      #- /_makeFile/services/_image/_workspace/_thingsboard.conf:/config/thingsboard.conf
      
      #离线镜像需要映射如下目录
      - /_makeFile/services/_image/_workspace/core_rule/data:/thingskit/core_rule/data
      - /_makeFile/services/_image/_workspace/core_rule/thingsKit.xjar:/thingskit/core_rule/thingsKit.xjar
      - /_makeFile/services/_image/_workspace/core_rule/xjar.go:/thingskit/core_rule/xjar.go
#      - /_makeFile/services/_image/java-start.sh:/usr/bin/java-start.sh
    container_name: 服务名
    environment:
      TB_SERVICE_TYPE: tb-core
      TB_SERVICE_DIR: core_rule
      JAVA_OPTS: -Xmx2g -Xms2g 
    env_file:
      - /_makeFile/miscroservice.env

规则引擎

version: '3'
services:
 ########################################################
 ######### 微服务模式ThingsKit【规则引擎】#########
 ########################################################
  服务名:
    image: thingskit:company                               #离线镜像地址
    #image: 127.0.0.1:8081/thinskit/tb-node:3.3.4-SNAPSHOT #在线镜像地址
    restart: always
    ports:
      - "8091:8091"
    volumes:
      - /_makeFile/services/_image/_workspace/_logback.xml:/config/logback.xml
      
      #在线镜像需要映射如下目录
      #- /_makeFile/services/_image/_workspace/_thingsboard.conf:/config/thingsboard.conf

      #离线镜像需要映射如下目录
      - /_makeFile/services/_image/_workspace/core_rule/data:/thingskit/core_rule/data
      - /_makeFile/services/_image/_workspace/core_rule/thingsKit.xjar:/thingskit/core_rule/thingsKit.xjar
      - /_makeFile/services/_image/_workspace/core_rule/xjar.go:/thingskit/core_rule/xjar.go
#      - /_makeFile/services/_image/java-start.sh:/usr/bin/java-start.sh
    container_name: 服务名
    environment:
      TB_SERVICE_TYPE: tb-rule-engine
      TB_SERVICE_DIR: core_rule
      JAVA_OPTS: -Xmx2g -Xms2g 
      HTTP_BIND_PORT: 8091                  # prometheus状态监控端口
    env_file:
      - /_makeFile/miscroservice.env

设备接入服务

version: '3'
services:
 ########################################################
 ######### 微服务模式ThingsKit【设备接入服务】#########
 ########################################################
  服务名:
    image: thingskit:company
    restart: always
    ports:
      - "8081:8081"     #服务端口
      - "1883:1883"     #设备通信协议端口,例如:mqtt(1883)、coap(5683/udp)、lwm2m(5685)、http(?)、snmp(?)
      - "1883:1883/udp"
    volumes:
      - /_makeFile/services/_image/_workspace/_logback.xml:/config/logback.xml
      
      #在线镜像需要映射如下目录
      #- /_makeFile/services/_image/_workspace/_thingsboard.conf:/config/thingsboard.conf
      
      #离线镜像需要映射如下目录
      - /_makeFile/services/_image/_workspace/组件目录值:/thingskit/组件目录值
#      - /_makeFile/services/_image/java-start.sh:/usr/bin/java-start.sh

    container_name: 服务名
    env_file:
      - /_makeFile/miscroservice.env
    environment:
      TB_SERVICE_TYPE: tb-transport
      TB_SERVICE_DIR: 组件目录值
      JAVA_OPTS: -Xmx2g -Xms2g 
      WEB_APPLICATION_ENABLE: true          # 设备接入服务配置:mqtt、tcp
      WEB_APPLICATION_TYPE: servlet         # 设备接入服务配置:mqtt、tcp
      HTTP_BIND_PORT: 8081                 # 设备接入服务配置:mqtt、tcp

脚本解析引擎

version: '3'
services:
#用户ID 799   官方镜像配置文件加载路径为【/config】实际路径为【/usr/share/服务模块模块名/conf】
  executor:   #脚本引擎   JS-EXECUTOR
    image: 81.70.18.153:8082/tb-js-executor:3.3.4-SNAPSHOT
    container_name: executor
    restart: always
    ports:
      - "8888:8888"         #服务端口
#    volumes:
#      - /var/_workspace/iot:/app
#      - /var/_logs/thingskit:/var/log/thingsboard
    env_file:
      - /_makeFile/miscroservice.env