预置条件
打包部署时,需要事先准备好工具和环境。例如: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镜像
单体模式镜像构建文件
此处为语雀内容卡片,点击链接查看:https://yunteng.yuque.com/avshoi/v1xdocs/fbocvum4in2k950u
微服务模式镜像构建文件
此处为语雀内容卡片,点击链接查看: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:初始化数据库
💡 提示
【通用Docker部署】时,需要将上面的数据库初始化执行程序下载并解压后,将里面的文件xjar.go和initDb.xjar上传到/_makeFile/thingskit/_image/web_server/data/sql目录下。上传后data目录如下:
💡 提示
【Docker部署】时,启动脚本会自动执行数据库初始化程序。
💡 提示
数据库是否初始化成功,需要从数据库的表admin_settings是否存在下图中的2条数据。
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