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最省事。
3.4 首次启动与初始化
配置文件写好了,接下来就是见证奇迹的时刻。运行:
docker compose -f thingsboard.yml up -d
这个命令会:
- 拉取PostgreSQL和ThingsBoard的镜像(第一次会慢一点,看网速)
- 创建三个数据卷(postgres-data、tb-data、tb-logs)
- 按顺序启动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的规则链,实现设备数据的自动化处理。到时候见。