3、单机部署回顾:使用Docker Compose快速搭建单机版ThingsBoard

好,咱们进入第三章。在正式搞集群之前,我强烈建议你先把手里的单机版玩透。为什么?因为集群本质上就是多个单机节点的组合,单机踩过的坑,到了集群里会被放大十倍。我自己带团队时,新人来了第一件事就是——先给我用Docker Compose搭一套单机版,跑通了再聊别的。

3.1 为什么选Docker Compose?

你可能会问:直接装个Java包不就行了?嗯,理论上可以。但实际项目中,我见过太多因为环境不一致导致的诡异问题。比如某次客户现场,明明按照文档一步步装,结果数据库连不上,查了半天发现是PostgreSQL版本对不上。

Docker Compose的好处很明显:

  • 环境一致性:你本地能跑,服务器上就能跑,不存在「我机器上好好的啊」这种尴尬
  • 依赖一键搞定:PostgreSQL、Redis、Zookeeper……这些组件不用你一个个装
  • 快速重置:搞坏了?docker-compose down -v 然后重新来,一分钟的事
我的习惯:每个项目我都会保留一份docker-compose.yml模板。新环境部署时,改几个参数就能用,省心。

3.2 准备工作:你需要什么?

说白了,就三样东西:

  1. 一台Linux机器(或者Mac/WSL也行,但我建议用Linux,生产环境99%是Linux)
  2. DockerDocker Compose 已安装
  3. 网络通畅(需要拉取镜像,国内用户记得配镜像加速)

我记得有一次在客户内网部署,没网,只能手动导镜像包,那叫一个痛苦。所以有条件的话,提前把镜像拉好存到本地仓库。

3.3 实战:一步步搭起来

好,咱们开始动手。我会用ThingsBoard 3.6.2版本做演示,你跟着敲就行。

3.3.1 创建项目目录

mkdir -p ~/tb-single && cd ~/tb-single

我个人习惯把每个服务的配置都放在独立目录下,方便管理。

3.3.2 编写docker-compose.yml

这是核心文件。我直接给你一个生产可用的版本:

version: '3.8'
services:
  postgres:
    image: postgres:15
    environment:
      POSTGRES_DB: thingsboard
      POSTGRES_USER: tbuser
      POSTGRES_PASSWORD: tbpass123
    volumes:
      - ./data/postgres:/var/lib/postgresql/data
    restart: always

  redis:
    image: redis:7-alpine
    command: redis-server --requirepass redispass
    volumes:
      - ./data/redis:/data
    restart: always

  tb-node:
    image: thingsboard/tb-node:3.6.2
    depends_on:
      - postgres
      - redis
    environment:
      TB_DATABASE_TYPE: postgres
      TB_DATABASE_HOST: postgres
      TB_DATABASE_PORT: 5432
      TB_DATABASE_NAME: thingsboard
      TB_DATABASE_USER: tbuser
      TB_DATABASE_PASSWORD: tbpass123
      TB_REDIS_HOST: redis
      TB_REDIS_PORT: 6379
      TB_REDIS_PASSWORD: redispass
      TB_QUEUE_TYPE: in-memory
    ports:
      - "8080:8080"
      - "1883:1883"
      - "5683:5683/udp"
    volumes:
      - ./data/tb-node:/data
    restart: always
注意:这里我用了 TB_QUEUE_TYPE: in-memory,单机测试没问题。但生产环境千万别这么干!消息丢了就找不回来了。集群部署时我们会换成Kafka或RabbitMQ。

3.3.3 启动服务

docker-compose up -d

第一次启动会拉镜像,大概等3-5分钟。你可以用 docker-compose logs -f tb-node 看日志。当看到类似这样的输出时,就说明启动成功了:

2024-01-15 10:23:45.123  INFO 1 --- [main] o.t.s.ThingsboardServerApplication : Started ThingsboardServerApplication in 45.789 seconds

3.3.4 验证部署

打开浏览器,访问 http://你的IP:8080。默认账号密码:

角色 用户名 密码
系统管理员 sysadmin@thingsboard.org sysadmin
租户管理员 tenant@thingsboard.org tenant

能登录进去,就说明单机版跑起来了。简单吧?

3.4 避坑指南

这部分是我用血泪换来的经验,你记一下:

  • 端口冲突:8080端口经常被占用。我建议先 netstat -tlnp | grep 8080 检查一下。如果被占用了,把映射端口改成 8081:8080 就行。
  • 数据持久化:上面配置里我把数据挂载到了 ./data/ 目录。如果不挂载,容器删了数据就全没了。我曾经手滑 docker-compose down -v 把测试数据全清了……嗯,从那以后我每次都会检查挂载路径。
  • 内存不足:ThingsBoard默认JVM堆内存是1GB。如果你的机器只有2GB内存,建议限制一下:在 environment 里加 TB_JAVA_OPTS: "-Xmx512m -Xms512m"

核心要点:单机部署是集群的基础。你在这里学会的每一个配置项,到了集群里都会以更复杂的形式出现。所以别急着跳过去,多跑几遍,把每个参数的含义搞清楚。

3.5 下一步做什么?

单机版跑通之后,我建议你做两件事:

  1. 创建几个设备,模拟一些数据上传,熟悉一下ThingsBoard的基本操作
  2. 试试看停掉PostgreSQL再重启,观察ThingsBoard的恢复行为。这能帮你理解高可用为什么重要

下一章,我们就要开始聊集群架构了。你会看到单机版里的每个组件,在集群里是如何被拆解、扩展的。准备好了吗?