ThingsBoard - docker源码打包部署(二)

863 阅读2分钟
1、  Docker-compose 拉取镜像部署

文档地址:juejin.cn/post/745564…

image.png

2、  Dockerfile
# 使用 thingsboard/openjdk17:bookworm-slim 作为基础镜像
FROM thingsboard/openjdk17:bookworm-slim
# 贝尔实验室 Spring 官方推荐镜像 JDK下载地址 https://bell-sw.com/pages/downloads/
# FROM bellsoft/liberica-openjdk-debian:17.0.13-cds

# 添加维护者信息
LABEL maintainer="thingsboard"

# 创建必要的目录
RUN mkdir -p /opt/project/thingsboard/data  /opt/project/thingsboard/conf

# 设置工作目录
WORKDIR /opt/project/thingsboard

# 暴露端口
EXPOSE 18080

# 设置环境变量
ENV TZ=Asia/Shanghai \
    LANG=C.UTF-8 \
    LC_ALL=C.UTF-8 \
    JAVA_OPTS="-Xms2g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=200" \
    LOGGING_CONFIG="/opt/project/thingsboard/conf/logback.xml"

# 定义一个构建时参数
ARG BUILD_VERSION

# 将 JAR 文件复制到容器中
COPY ./thingsboard-${BUILD_VERSION}-boot.jar ./thingsboard.jar

# 容器启动命令 
# -Djava.security.egd=file:/dev/./urandom 这个设置可以加速应用启动,尤其是在 Docker 环境中,减少因随机数生成器初始化
ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom \
    -Dlogging.config=${LOGGING_CONFIG} \
    -Dpkg.logFolder=${LOG_FOLDER} \
    -Dpkg.name=${LOG_FILE_NAME} \
    -jar thingsboard.jar ${JAVA_OPTS}
3、  docker-compose.yml

thingsboard.yml配置说明

www.ithingsboard.com/docs//user-…

version: '3.9.0'

services:
  thingsboard:
    build:
      context: .
      dockerfile: Dockerfile
      args:
        BUILD_VERSION: 3.9.0
    container_name: thingsboard
    image: thingsboard:3.9.0 
    network_mode: "host"
    ports:
      - "18080:18080"
      - "11883:11883"
      - "5683-5688:5683-5688/udp"
    volumes:
      - ./data:/opt/project/thingsboard/data  
      - ./conf:/opt/project/thingsboard/conf
      - ./logs:/opt/project/thingsboard/logs
    environment:
      TZ: Asia/Shanghai
      HTTP_BIND_PORT: 18080
      MQTT_BIND_PORT: 11883
      DEVICE_CONNECTIVITY_HTTP_PORT: 18080
      # 用户 JWT Token 的过期时间(秒)默认 2.5 小时
      JWT_TOKEN_EXPIRATION_TIME: 9000
      # 用户 JWT 刷新令牌的过期时间(秒)默认 1 周
      JWT_REFRESH_TOKEN_EXPIRATION_TIME: 604800 
      SPRING_DATASOURCE_URL: jdbc:postgresql://localhost:5432/thingsboard
      SPRING_DATASOURCE_USERNAME: postgres
      SPRING_DATASOURCE_PASSWORD: Liu971134228!@#
      # 数据库线程池大小,默认 16
      SPRING_DATASOURCE_MAXIMUM_POOL_SIZE: 32
      # cassandra, sql, or timescale (for hybrid mode, DATABASE_TS_TYPE value should be cassandra, or timescale)
      DATABASE_TS_TYPE: cassandra
      CASSANDRA_URL: "127.0.0.1:9042"
      CASSANDRA_USE_CREDENTIALS: true
      CASSANDRA_USERNAME: cassandra
      CASSANDRA_PASSWORD: cassandra
      # 指定时间戳键值存储的分区大小。允许的值为MINUTES、HOURS、DAYS、MONTHS、INDEFINITE,默认:MONTHS
      TS_KV_PARTITIONING: "MONTHS"
      # 必要的性能调整 对于 100k设备,消息速率为10k/秒,系统平均可以处理约 9k/秒。CPU负载为90%,因此我们面临Postgresol性能瓶颈,使用不同的键进行的属性更新太多了。尝试更新从设备收到的条消息的属性"lastActivityTime”。对于 5k 设备,这没有问题,但对于 100k 设备,交易变得更慢。下一步我们将把设备状态写入 Cassandra.性能的巨大改进是使用以下环境变量将设备状态持久保存到 Cassandra 遥测中: 默认 false
      PERSIST_STATE_TO_TELEMETRY: false
      # caffeine or redis(7.2 - latest compatible version)
      CACHE_TYPE: redis
      REDIS_HOST: localhost
      REDIS_PORT: 6379
      REDIS_DB: 10
      # redis密码
      REDIS_PASSWORD: Liu971134228!@#
      # 队列 in-memory or kafka (Apache Kafka) or aws-sqs (AWS SQS) or pubsub (PubSub) or service-bus (Azure Service Bus) or rabbitmq (RabbitMQ)
      TB_QUEUE_TYPE: kafka
      # 如果选择 kafka 则需要配置kafka 地址 
      TB_KAFKA_SERVERS: localhost:9092 
      # Default 16384 batch size. This setting gives the upper bound of the batch size to be sent
      TB_KAFKA_BATCH_SIZE: 65536
      # This variable creates a small amount of artificial delay—that is, rather than immediately sending out a record  default is 1
      TB_KAFKA_LINGER_MS: "5" 
      # 默认 10分钟不活动超时
      DEFAULT_INACTIVITY_TIMEOUT: 600
      # 一分钟扫描一次设备是否在线状态
      DEFAULT_STATE_CHECK_INTERVAL: 60
      # 最大队列数,如果设备很多,数据频繁可以调大一下,默认 1000
      TB_SERVER_WS_DEFAULT_QUEUE_MESSAGES_PER_SESSION: 10000
      # 创建租户会报错Not valid working directory: /opt/project/thingsboard. Please use either root project directory, application module directory or specify valid "install.data_dir" ENV variable to avoid automatic data directory lookup!
      # 在thingsboard.yml最下面增加
      #install:
      #  data_dir: "${INSTALL_DATA_DIR:/opt/project/thingsboard}"
      #  load_demo: "${INSTALL_LOAD_DEMO:true}"
      INSTALL_DATA_DIR: /opt/project/thingsboard/data
      # 设置初始堆内存为2g 设置最大堆内存为 4GB 启用 G1 垃圾回收器,适合大内存的场景 设置 G1 GC 的最大停顿时间为 200 毫秒
      # JAVA_OPTS: "-Xms1g -Xmx2g -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
      JAVA_OPTS: "-Xms512m -Xmx1024m -XX:+UseG1GC -XX:MaxGCPauseMillis=200" 
      # 日志配置文件
      LOGGING_CONFIG: "/opt/project/thingsboard/conf/logback.xml"
      # 日志目录 将${pkg.logFolder}改为${LOG_FOLDER}
      LOG_FOLDER: "/opt/project/thingsboard/logs"
      # 日志文件名称 将${pkg.name}改为${LOG_FILE_NAME}
      LOG_FILE_NAME: "thingsboard"
      # TB_网关_仪表板_同步_存储库_统一资源定位地址 (github会超时,所以通过 gitee 同步 github,然后配置 gitee 即可)
      TB_GATEWAY_DASHBOARD_SYNC_REPOSITORY_URL: https://gitee.com/onionCircle/gateway-management-extensions-dist.git
4、  ThingsBoard 在不同 AWS 实例上的性能

官方地址:www.ithingsboard.com/docs/refere… image.png image.png image.png

SELECT
	nspname || '.' || relname AS "relation",
	pg_size_pretty ( pg_relation_size ( C.OID ) ) AS "size" 
FROM
	pg_class
	C LEFT JOIN pg_namespace N ON ( N.OID = C.relnamespace ) 
WHERE
	nspname NOT IN ( 'pg_catalog', 'information_schema' ) 
ORDER BY
	pg_relation_size ( C.OID ) DESC 
	LIMIT 20;

image.png

5、使用cassandra存储设备实时数据

性能截图对比

image.png

  # cassandra, sql, or timescale (for hybrid mode, DATABASE_TS_TYPE value should be cassandra, or timescale)
      DATABASE_TS_TYPE: cassandra
      CASSANDRA_URL: "127.0.0.1:9042"
      CASSANDRA_USE_CREDENTIALS: true
      CASSANDRA_USERNAME: cassandra
      CASSANDRA_PASSWORD: cassandra
6、重新初始化数据库

初始化数据库参考文档

juejin.cn/post/745568…

1、将docker-compose.yml下面的environment参数复制到thingsboard.yml中,因为我们要初始化cassandra数据库
 
2、执行初始化数据库
java -classpath thingsboard-3.9.0-boot.jar -Dspring.config.location=/opt/project/thingsboard/conf/thingsboard.yml -Dloader.main=org.thingsboard.server.ThingsboardInstallApplication -Dinstall.data_dir=/opt/project/thingsboard/data org.springframework.boot.loader.launch.PropertiesLauncher 
7、  kafdrop安装部署

官方地址:github.com/obsidiandyn…

启动项目
java --add-opens=java.base/sun.nio.ch=ALL-UNNAMED -jar kafdrop-4.1.0.jar --kafka.brokerConnect=106.119.162.97:9092 --server.port=9999

可以看到队列都初始化到了 kafka,而不是内存

image.png

8、运行镜像
构建镜像
docker-compose build

运行镜像
 docker-compose up -d
 
访问 ip + 18080登录
账号:sysadmin@thingsboard.org
密码:sysadmin
9、 视频地址

t.bilibili.com/10187957834…