ThingsKit开发指南-加密包(xjar)部署

预置条件

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

本地开发环境(必须)

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

打包

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

数据传输:克隆数据库

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

ThingsKit开发指南-加密包(xjar)部署

脏数据清理

删除不需要的测试数据。

  • 业务表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/5:准备业务数据表的升级脚本

表结构同步

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

ThingsKit开发指南-加密包(xjar)部署

表数据同步

💡 提示

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

ThingsKit开发指南-加密包(xjar)部署

SQL脚本检视

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

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

启动加密模式

💡 提示

加密插件Xjarspring-boot-maven-plugin 的 配置executable = trueembeddedLaunchScript存在兼容问题。

需要修改根pom.xml文件中相关插件的配置。

ThingsKit开发指南-加密包(xjar)部署

启用微服务包(可选)

打包时,默认没有执行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>

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

编译打包


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开发指南-加密包(xjar)部署

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

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

ThingsKit开发指南-加密包(xjar)部署

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

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

ThingsKit开发指南-加密包(xjar)部署

5/5:jar包加密(可选)

1/4:创建maven管理的java项目

2/4:引入xjar依赖配置

<project>
    <!-- 设置 jitpack.io 仓库 -->
    <repositories>
        <repository>
            <id>jitpack.io</id>
            <url>https://jitpack.io</url>
        </repository>
    </repositories>
    <!-- 添加 XJar 依赖 -->
    <dependencies>
        <dependency>
            <groupId>com.github.core-lib</groupId>
            <artifactId>xjar</artifactId>
            <version>4.0.2</version>
            <!-- <scope>test</scope> -->
        </dependency>
    </dependencies>
</project>

3/4:创建并配置加密类

public class XjarApplication {
    public static void main(String[] args) throws Exception {
        XCryptos.encryption()
                .from("./application/target/thingsboard-3.3.4-SNAPSHOT-boot.jar")//被加密的jar包
                .use("加密密码")
                .include("/org/thingsboard/server/**/*.class")
                .to("xjar/输出包名.xjar");
    }
}

4/4:执行程序XjarApplication的main方法对jar包进行加密

💡 提示

xjar加密输出的文件**.xjarxjar.go是配套的,不能交叉使用。

部署

💡 提示

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

1/4:创建数据库ThingsKit

💡 提示

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

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

2/4:编辑配置文件

日志配置文件(可选)

<?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部署】部署包的运行环境,可以通过该文件内声明的环境变量修改,

例如:export DATABASE_TS_TYPE=sql。

#物联网平台重要配置
# monolith or tb-core or tb-rule-engine;tb-transport
export TB_SERVICE_TYPE=monolith
export SPRING_DATASOURCE_URL="jdbc:postgresql://${SERVER_HOST_IP}:5432/thingskit"
export SPRING_DATASOURCE_USERNAME=postgres 
export SPRING_DATASOURCE_PASSWORD=thingskit
#cassandra, sql, or timescale (for hybrid mode, DATABASE_TS_TYPE value should be cassandra, or timescale)
export DATABASE_TS_TYPE=sql
#cassandra, sql, or timescale (for hybrid mode, DATABASE_TS_TYPE value should be cassandra, or timescale)
export DATABASE_TS_LATEST_TYPE=sql
export MINIO_URL=http://localhost:9000
export MINIO_BUCKET_NAME=yunteng-test
export ACCOUNT_EMAIL_SUFFIX=thingskit.com
export MINIO_NAME=thingskit
export MINIO_PWD=thingskit
export ACCOUNT_PASSWORD_FORCE_RESET=true
export DEFAULT_PASSWORD=123456
#      WECHAT_APP_ID: 微信小程序APP_ID
#      WECHAT_APP_SECRET: 微信小程序APP_SECRET
export JAVA_OPTS="$JAVA_OPTS -Dinstall.data_dir=data"
export JAVA_OPTS="$JAVA_OPTS -Dlogging.config=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:初始化数据库

部署包初始化相关的【数据目录】如图:

ThingsKit开发指南-加密包(xjar)部署

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

💡 提示

需要将上面的数据库初始化执行程序下载并解压后,将里面的文件xjar.goinitDb.xjar上传到【数据目录】中的sql目录下。上传后data目录如下:

ThingsKit开发指南-加密包(xjar)部署

💡 提示

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

💡 提示

数据库的初始化必须基于部署包的运行参数,例如:DATABASE_TS_TYPEDATABASE_TS_LATEST_TYPE


##########################
########初始化数据库########
##########################
cd /thingskit/data/sql
go build xjar.go
./xjar java -jar  -Dinstall.data_dir=/thingskit/data -Dfile.encoding=UTF-8 --add-opens java.base/jdk.internal.loader=ALL-UNNAMED ./initDb.xjar

💡 提示

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

ThingsKit开发指南-加密包(xjar)部署

4/4:启动ThingsKit物联网平台

💡 提示

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


#########################
#########编译加载器#########
#########################
go build xjar.go

./xjar java -Dfile.encoding=UTF-8 -Djava.security.egd=file:/dev/./urandom \
--add-opens java.base/jdk.internal.loader=ALL-UNNAMED \
-Dinstall.data_dir=/thingskit/data -jar ./thingsKit.xjar