3、单机部署:使用Docker Compose一键部署ThingsBoard

好,咱们进入实战环节了。前面两章我们把ThingsBoard的架构和核心概念捋了一遍,现在该动手了。

我个人习惯,在开发环境或者小规模生产环境里,直接用Docker Compose部署ThingsBoard。为什么?因为快,而且干净。你想想看,要是手动装Java、装PostgreSQL、装Cassandra、再配一堆参数,光环境依赖就能折腾半天。用Docker Compose,一个命令搞定所有。

3.1 准备工作:你得先有这些东西

在开始之前,我假设你的机器上已经装好了:

  • Docker(版本20.10以上,我建议用最新稳定版)
  • Docker Compose(V2版本,也就是docker compose命令,不是docker-compose)
  • 至少4GB空闲内存(ThingsBoard + 数据库,吃内存大户)

我记得有一次帮客户部署,他机器上Docker版本太老,Compose文件里的语法不兼容,折腾了半小时。所以,先检查一下版本:

docker --version
docker compose version

嗯,确认没问题再往下走。

3.2 获取docker-compose.yml文件

ThingsBoard官方其实提供了现成的Compose文件。但我建议你别直接用官方的,因为里面有些配置是给演示环境用的,生产环境得改。我这边给你一个我打磨过的版本,适合单机部署。

创建一个目录,比如叫 tb-deploy,然后进去:

mkdir tb-deploy && cd tb-deploy

新建一个文件,命名为 thingsboard.yml。对,就是这个名字,别问为什么不用docker-compose.yml,我个人习惯用项目名命名,方便区分。

3.3 配置文件详解(thingsboard.yml)

下面这个是我常用的配置,我一行一行给你讲明白:

version: '3.8'

services:
  postgres:
    image: postgres:15
    environment:
      POSTGRES_DB: thingsboard
      POSTGRES_USER: tb_user
      POSTGRES_PASSWORD: tb_password
    volumes:
      - postgres-data:/var/lib/postgresql/data
    restart: always

  thingsboard:
    image: thingsboard/tb-postgres:3.6.4
    depends_on:
      - postgres
    ports:
      - "8080:9090"   # HTTP端口,我把容器内的9090映射到宿主机的8080
      - "1883:1883"   # MQTT端口
      - "5683:5683/udp" # CoAP端口
    environment:
      TB_QUEUE_TYPE: in-memory
      SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/thingsboard
      SPRING_DATASOURCE_USERNAME: tb_user
      SPRING_DATASOURCE_PASSWORD: tb_password
    volumes:
      - tb-data:/data
      - tb-logs:/var/log/thingsboard
    restart: always

volumes:
  postgres-data:
  tb-data:
  tb-logs:

这里有几个关键点,我得重点说一下:

  • 数据库选型:我用了PostgreSQL,没选Cassandra。为什么?单机部署嘛,PostgreSQL完全够用,而且资源消耗小很多。Cassandra是给集群用的,单机用反而性能不好。
  • 端口映射:容器内ThingsBoard默认跑在9090端口,我映射到宿主机的8080。你如果8080被占了,可以改成别的,比如9090:9090。
  • TB_QUEUE_TYPE: in-memory:这个意思是消息队列用内存模式。生产环境我建议用Kafka或RabbitMQ,但单机测试,in-memory最省事。
⚠️ 注意: 这个配置里的密码是明文写死的。生产环境千万别这么干!用Docker Secrets或者环境变量文件来管理密码。

3.4 首次启动与初始化

配置文件写好了,接下来就是见证奇迹的时刻。运行:

docker compose -f thingsboard.yml up -d

这个命令会:

  1. 拉取PostgreSQL和ThingsBoard的镜像(第一次会慢一点,看网速)
  2. 创建三个数据卷(postgres-data、tb-data、tb-logs)
  3. 按顺序启动PostgreSQL,然后启动ThingsBoard

启动过程中,你可以用这个命令看日志:

docker compose -f thingsboard.yml logs -f thingsboard

嗯,这里要注意。第一次启动时,ThingsBoard会做数据库初始化,创建表结构、插入默认数据。这个过程大概需要1-3分钟,看机器性能。你会看到日志里出现类似这样的信息:

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

看到这行日志,就说明启动成功了。

💡 小技巧: 如果你等不及看日志,可以用 docker compose ps 查看容器状态。两个容器状态都是 "Up" 就对了。

3.5 验证部署成功

启动完成后,怎么确认ThingsBoard真的能用了?我一般做三步验证:

3.5.1 Web界面验证

打开浏览器,访问 http://你的服务器IP:8080。你应该能看到ThingsBoard的登录页面。

默认管理员账号:sysadmin@thingsboard.org,密码:sysadmin。登录进去后,你会看到仪表盘、设备管理、规则链等菜单。能正常打开,说明Web服务没问题。

3.5.2 API接口验证

用curl或者Postman调一下API:

curl -X POST http://localhost:8080/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{"username":"sysadmin@thingsboard.org","password":"sysadmin"}'

如果返回一个包含 token 的JSON,说明认证接口正常。

3.5.3 MQTT端口验证

这个步骤可选,但我建议做一下。用MQTT客户端(比如MQTTX)连接 tcp://你的服务器IP:1883,如果能连上,说明MQTT网关也在正常工作。

✅ 验证清单:

  • Web界面能登录(HTTP 200)
  • API能返回token(REST API正常)
  • MQTT端口能连接(设备接入通道正常)
  • 容器状态都是Up(docker compose ps)

我曾经遇到过一次,Web界面能打开,但MQTT端口死活连不上。查了半天,发现是防火墙把1883端口给拦了。所以,如果你在云服务器上部署,记得在安全组里放开1883和5683端口。

3.6 避坑指南

最后,分享几个我踩过的坑:

  • 内存不足:ThingsBoard默认的JVM堆内存是1GB,如果你的服务器只有2GB内存,建议调小一点。在environment里加 JAVA_OPTS: "-Xmx512m -Xms512m"
  • 时区问题:默认是UTC时区,你如果在中国,建议改成Asia/Shanghai。在environment里加 TZ: "Asia/Shanghai"
  • 数据持久化:我上面用了volumes,数据会保存在Docker管理的卷里。如果你想映射到宿主机具体目录,把volumes改成bind mount,比如 ./tb-data:/data。这样备份数据更方便。

好了,单机部署就这些内容。下一章我们会讲怎么配置ThingsBoard的规则链,实现设备数据的自动化处理。到时候见。