预置条件
打包部署时,需要事先准备好工具和环境。例如:docker镜像库、本地开发环境等。
本地开发环境(必须)
此处为语雀内容卡片,点击链接查看:https://yunteng.yuque.com/avshoi/hlzqwf/ttyhd4v2z5a0z3sg
准备docker镜像库
💡 提示
项目编译打包时,如果开启docker编译发布功能,会在docker镜像库上生成所有服务的镜像文件。
docker镜像库用于存放各服务组件的docker镜像。例如:规则引擎、脚本引擎和MQTT设备接入服务等。镜像库可以自己搭建私有的docker镜像库,也可以使用官方的docker镜像库。
下面,我们将基于Nexus讲解如何搭建docker镜像库。
云服务器配置
防火墙配置
NEXUS默认端口清单
序号 | 端口 | 端口说明 |
1 | 8081 | nexus管理页面端口 |
2 | 8082 | docker镜像库的端口,可自定义。 |
目录权限配置
当宿主机的磁盘目录映射到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,点击右上角的登入按钮时,会弹出如下的对话框。
密码文件/nexus-data/admin.password
在安装时自动生成。密码获取方式如下:
docker exec -it nexus3 bash #登录nexus容器
cat /nexus-data/admin.password #查看默认密码
管理员admin
等候后会弹出配置向导,结合实际情况配置即可。
创建自有docker镜像库
如图3步操作进入仓库创建页面。并选择docker(hosted)
类型仓库。
仓库表单信息如下图。
配置docker库认证器
未配置时,执行docker登录命令会返回如下信息:
Error response from daemon: login attempt to http://localhost:8082/v2/ failed with status: 401 Unauthorized
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_*
)克隆到新库中。
脏数据清理
删除不需要的测试数据。
- 业务表
sys_area
、sys_dict
、sys_dict_item
、tk_map_geo_json
和sys_menu
等表的数据都需要,无需清除。 - 业务表
sys_role
、sys_role_menu
、sys_user
、sys_user_role
、sys_tenant
、tk_data_view_interface
和tk_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:准备业务数据表的升级脚本
表结构同步
使用结构同步
工具,对两个版本之间的表结构进行差异化比较并同步。
表数据同步
💡 提示
进行数据之前必须对旧版本的表结构进行升级。否则生成的数据同步的SQL有缺失。
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目录下有如下文件清单。
微服务模式部署包:MQTT设备接入
编译打包后在对应服务的target目录下有如下文件清单。
微服务模式部署包:TCP/UDP设备接入
编译打包后在对应服务的target目录下有如下文件清单。
docker镜像
执行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条数据。
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