ThingsKit开发指南-通用docker镜像(离线)部署

预置条件

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

本地开发环境(必须)

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

打包

加密包(推荐)

💡 提示

通用docker镜像的MakeFile文件基于加密包编写的。

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

jar包

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

构建通用Docker镜像

服务器安装docker

docker安装文档参考如下:

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

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

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

基于docker的MakeFile文件构建docker镜像

单体模式镜像构建文件

_monolithDockerFile.zip

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

微服务模式镜像构建文件

microserviceDockerFile.zip

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

命令构建docker镜像

将docker的MakeFile文件内容上传到安装了docker命令的服务器。

cd _image
docker build -f MakeFile文件路径 -t 镜像标签名:镜像标签版本号 .

导出docker镜像(tar文件)

💡 提示

适用于,网络隔离的场景。

docker save 镜像标签名:镜像标签版本号 -o 镜像离线文件名.tar       

部署

💡 提示

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

💡 提示

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

1/4:创建数据库ThingsKit

💡 提示

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

💡 提示

【Docker单体部署】时,镜像内自带所有依赖软件。启动脚本会自动创建数据库并初始化。可跳过当前操作。

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

2/4:编辑配置文件

Docker环境变量

单体部署:二选一

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

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

#***************************************
#******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
SERVER_HOST_DOMAIN=需要被替换的模板变量
SERVER_HOST_IP=localhost
USER_NAME=thingskit
USER_PASSWORD=thingskit

#证书配置
TLS_FILE_PUBLIC=com.thingskit.pem
TLS_FILE_PRIVATE=com.thingskit.key
PROTOCOL_HTTP=http
PROTOCOL_WEBSOCKET=wsexport
MQTT_SSL_ENABLED=false
MQTT_SSL_CREDENTIALS_TYPE=PEM    
MQTT_SSL_PEM_CERT=${TLS_FILE_PUBLIC}
MQTT_SSL_PEM_KEY=${TLS_FILE_PRIVATE}
MQTT_SSL_PEM_KEY_PASSWORD=secret
MQTT_SSL_SKIP_VALIDITY_CHECK_FOR_CLIENT_CERT=false



#数据库配置
PGDATA=/data/db
POSTGRES_PASSWORD=${USER_PASSWORD}



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

#web服务器代理配置
VITE_GLOB_API_URL="http://${SERVER_HOST_DOMAIN}:8080/api"
VITE_GLOB_UPLOAD_URL="http://${SERVER_HOST_DOMAIN}:8080/api/yt/oss/upload"
VITE_GLOB_WEB_SOCKET="ws://${SERVER_HOST_DOMAIN}:8080/api/ws/plugins/telemetry?token="




#物联网平台配置
# monolith or tb-core or tb-rule-engine;tb-transport
TB_SERVICE_TYPE=monolith

# 节点资源监控,例如:prometheus、info
METRICS_ENABLED=true
METRICS_TIMER_PERCENTILES=1
METRICS_ENDPOINTS_EXPOSE=prometheus


TB_QUEUE_CORE_PARTITIONS=10
TB_QUEUE_RE_MAIN_PARTITIONS=10
TB_QUEUE_RE_HP_PARTITIONS=10
TB_QUEUE_RE_SQ_PARTITIONS=10
##【设备状态监控】设备超时时间和状态检测频率##
DEFAULT_INACTIVITY_TIMEOUT=60
DEFAULT_STATE_CHECK_INTERVAL=20

SQL_TTL_TS_ENABLED=true
# 数据留存监测频率,单位毫秒
SQL_TTL_TS_EXECUTION_INTERVAL=86400000
# 数据留存时间,单位秒
SQL_TTL_TS_TS_KEY_VALUE_TTL=0
SQL_TTL_EVENTS_EVENTS_TTL=0
SPRING_DATASOURCE_URL="jdbc:postgresql://${SERVER_HOST_IP}:5432/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时,提升性能
PERSIST_STATE_TO_TELEMETRY=true

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




#缓存存储配置                 # caffeine(单机模式可用) or redis 
CACHE_TYPE=caffeine

#消息中间件配置
# in-memory(单机模式可用) or kafka  or rabbitmq
TB_QUEUE_TYPE=in-memory

#服务中心配置
ZOOKEEPER_ENABLED=false

微服务部署:二选一

环境变量的编辑请参考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}"

日志配置文件(可选)

<?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配置文件(可选)

export JAVA_OPTS="$JAVA_OPTS -Dinstall.data_dir=/thingskit/data"
export JAVA_OPTS="$JAVA_OPTS -Dlogging.config=/thingskit/logback.xml"

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"

3/4:初始化数据库

数据库初始化执行程序.zip

💡 提示

【通用Docker部署】时,需要将上面的数据库初始化执行程序下载并解压后,将里面的文件xjar.goinitDb.xjar上传到/_makeFile/thingskit/_image/web_server/data/sql目录下。上传后data目录如下:

ThingsKit开发指南-通用docker镜像(离线)部署

💡 提示

【Docker部署】时,启动脚本会自动执行数据库初始化程序。

💡 提示

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

ThingsKit开发指南-通用docker镜像(离线)部署

4/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镜像


docker load -i thingskit_v1.0.2.tar

创建容器编排文件

version: '3'
services:

 ########################################################
 ## 单机模式ThingsKit【核心服务】#########################
 ########################################################
  monolith:
#    image: thingskit:monolith
    image: thingskit:company
    restart: always
    ports:
      - "5432:5432"
      - "9527:9527"
#      - "9528:9528"        #配置文件:旧版组态1.1.2
      - "9000:9000"
      - "9001:9001"
      - "8080:8080"
      - "1883:1883"
      - "8088:8088"
      - "8088:8088/udp"
      - "5683:5683/udp"
    volumes:
      - /_makeFile/thingskit/_cert:/tk/cert                                                #证书目录
      - /_makeFile/thingskit/_image/web_ui:/usr/share/nginx/html                          #部署包:管理页面
      - /_makeFile/thingskit/_image/data_view:/usr/share/nginx/dataview                   #部署包:大屏
      - /_makeFile/thingskit/_image/web_server:/thingskit                                 #部署包:服务端

      - /_makeFile/thingskit/_image/scada:/usr/share/nginx/scada                          #部署包:新版组态1.2.0
      - /_makeFile/thingskit/config.scada.js:/usr/share/nginx/dataview/_app.config.js     #配置文件::新版组态1.2.0
#      - /_makeFile/thingskit/_image/tomcat.xml:/usr/share/tomcat9/conf/server.xml        #配置文件:旧版组态1.1.2
#      - /_makeFile/thingskit/_image/scada:/usr/share/tomcat9/webapps                     #部署包:旧版组态1.1.2

      - /_makeFile/thingskit/config.webui.js:/usr/share/nginx/html/_app.config.js        #配置文件:管理页面
      - /_makeFile/thingskit/config.dataview.js:/usr/share/nginx/dataview/_app.config.js  #配置文件:大屏
#      - /_makeFile/thingskit/_image/nginx.conf:/etc/nginx/nginx.conf                       #配置文件:部署管理页面的nginx
#      - /_makeFile/thingskit/_image/java-start.sh:/usr/bin/java-start.sh
      - /var/_datas/pgsql:/data                                                        #运行数据:数据库数据
      - /var/_datas/minio:/opt/minio/datas                                                #运行数据:图片数据
    container_name: monolith
    env_file:
      - /_makeFile/monolith.env

启动

💡 提示

首次部署或升级部署时,需要先删除可执行文件xjar,对应的部署包thingsKit.xjar和xjar.go必须一对一匹配。


docker-compose up -d