thingsboard/summary/11-Docker-Compose部署配置分析.md

357 lines
9.3 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Docker Compose 部署配置分析
## 1. 配置概述
这是一个 **ThingsBoard CE社区版的单体部署配置**,使用 Docker Compose 编排三个核心服务:
- PostgreSQL数据库
- Kafka消息队列
- ThingsBoard CE应用服务
## 2. 部署模式分析
### 2.1 部署架构
```
┌─────────────────────────────────────────┐
│ Docker Compose 网络 │
│ │
│ ┌──────────────┐ │
│ │ PostgreSQL │ │
│ │ Port: 5432 │ │
│ └──────┬───────┘ │
│ │ │
│ ┌──────▼───────┐ │
│ │ Kafka │ │
│ │ Port: 9092 │ │
│ └──────┬───────┘ │
│ │ │
│ ┌──────▼──────────────┐ │
│ │ ThingsBoard CE │ │
│ │ Ports: │ │
│ │ - 8080 (HTTP) │ │
│ │ - 7070 (Edge RPC) │ │
│ │ - 1883 (MQTT) │ │
│ │ - 8883 (MQTTS) │ │
│ │ - 5683-5688 (CoAP) │ │
│ └─────────────────────┘ │
└─────────────────────────────────────────┘
```
### 2.2 部署模式单体模式Monolith
**特点**
- ✅ 单一 ThingsBoard 实例
- ✅ 所有功能在一个容器中运行
- ✅ 配置简单,易于部署
- ❌ 不支持水平扩展
- ❌ 单个故障点
**适用场景**
- 小型到中型部署
- 开发和测试环境
- 设备数量 < 10,000
## 3. 服务详细分析
### 3.1 PostgreSQL 服务
```yaml
postgres:
restart: always
image: "postgres:16"
ports:
- "5432" # 内部端口,不映射到宿主机
environment:
POSTGRES_DB: thingsboard
POSTGRES_PASSWORD: postgres
volumes:
- postgres-data:/var/lib/postgresql/data
```
#### 配置说明
1. **数据库版本**: PostgreSQL 16
2. **端口配置**:
- 端口 `5432` 只在 Docker 网络内可用
- 不映射到宿主机只能容器间访问安全
3. **数据持久化**:
- 使用命名卷 `postgres-data`
- 数据存储在 `/var/lib/postgresql/data`
4. **数据库名称**: `thingsboard`
5. **认证**: 用户名 `postgres`密码 `postgres`生产环境需修改
#### 存储的数据
- **实体数据**: 租户用户设备资产等
- **配置数据**: 规则链仪表板等
- **时序数据**: 如果使用 SQL 模式`DATABASE_TS_TYPE=sql`
### 3.2 Kafka 服务
```yaml
kafka:
restart: always
image: bitnamilegacy/kafka:4.0
ports:
- 9092:9092 # 映射到宿主机(用于外部访问)
- 9093 # KRaft 控制器端口(仅内部)
environment:
ALLOW_PLAINTEXT_LISTENER: "yes"
KAFKA_CFG_LISTENERS: "PLAINTEXT://:9092,CONTROLLER://:9093"
KAFKA_CFG_ADVERTISED_LISTENERS: "PLAINTEXT://:9092"
# ... 其他配置
```
#### 配置说明
1. **Kafka 版本**: 4.0使用 legacy 镜像
2. **KRaft 模式**:
- 使用 KRaftKafka Raft模式不需要 ZooKeeper
- `KAFKA_CFG_PROCESS_ROLES: "controller,broker"` - 同时充当控制器和代理
- `KAFKA_CFG_NODE_ID: "0"` - 节点 ID
3. **端口配置**:
- `9092`: 客户端连接端口映射到宿主机
- `9093`: KRaft 控制器端口仅内部
4. **安全配置**:
- `ALLOW_PLAINTEXT_LISTENER: "yes"` - 允许明文连接生产环境应使用 SSL
5. **Topic 配置**:
- `KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE: "false"` - 禁用自动创建主题
- `KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: "1"` - 单节点副本因子
6. **日志保留**:
- `KAFKA_CFG_LOG_RETENTION_MS: "300000"` - 5 分钟非常短测试用
- `KAFKA_CFG_SEGMENT_BYTES: "26214400"` - 25MB 段大小
#### 注意事项
**生产环境警告**:
- 单节点 Kafka无副本
- 日志保留时间仅 5 分钟测试配置
- 使用明文连接不安全
- 不支持高可用
### 3.3 ThingsBoard CE 服务
```yaml
thingsboard-ce:
restart: always
image: "thingsboard/tb-node:4.2.1"
ports:
- "8080:8080" # HTTP API
- "7070:7070" # Edge RPC
- "1883:1883" # MQTT
- "8883:8883" # MQTT over SSL
- "5683-5688:5683-5688/udp" # CoAP (包含 LWM2M)
environment:
TB_SERVICE_ID: tb-ce-node
SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/thingsboard
TB_QUEUE_TYPE: kafka
TB_KAFKA_SERVERS: kafka:9092
```
#### 配置说明
1. **镜像**: `thingsboard/tb-node:4.2.1` - ThingsBoard 节点镜像
2. **服务类型**:
- `TB_SERVICE_ID: tb-ce-node` - 单体模式节点
- 默认 `TB_SERVICE_TYPE: tb-core`未指定使用默认值
3. **端口映射**:
- **8080**: HTTP REST API Web UI
- **7070**: Edge 设备 RPC 通信
- **1883**: MQTT 协议非加密
- **8883**: MQTT over SSL/TLS
- **5683-5688**: CoAP 协议UDP
- 5683: CoAP
- 5685: LWM2M非加密
- 5686: LWM2M over DTLS
4. **数据库连接**:
- `SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/thingsboard`
- 通过 Docker 网络连接到 PostgreSQL
5. **消息队列**:
- `TB_QUEUE_TYPE: kafka`
- `TB_KAFKA_SERVERS: kafka:9092`
- 使用 Kafka 作为消息队列
#### 日志配置
```yaml
logging:
driver: "json-file"
options:
max-size: "100m" # 单个日志文件最大 100MB
max-file: "10" # 保留 10 个日志文件
```
**日志轮转**: 最大日志大小 1GB100MB × 10
## 4. 数据存储模式
### 4.1 数据库配置
**未指定 `DATABASE_TS_TYPE`**使用默认值
- **默认**: SQL 模式PostgreSQL
- **时序数据**: 存储在 PostgreSQL
### 4.2 数据持久化
```yaml
volumes:
postgres-data:
name: tb-postgres-data
driver: local
kafka-data:
name: tb-ce-kafka-data
driver: local
```
- **PostgreSQL 数据**: 持久化到 `tb-postgres-data`
- **Kafka 数据**: 持久化到 `tb-ce-kafka-data`
## 5. 网络配置
### 5.1 Docker 网络
所有服务在同一个 Docker Compose 网络中
- 服务间通过服务名访问`postgres`, `kafka`, `thingsboard-ce`
- 不需要额外的网络配置
### 5.2 服务发现
- ThingsBoard PostgreSQL: `postgres:5432`
- ThingsBoard Kafka: `kafka:9092`
## 6. 启动顺序
```yaml
depends_on:
- postgres
- kafka
```
ThingsBoard 会在 PostgreSQL Kafka 启动后启动
## 7. 优缺点分析
### 7.1 优点
**简单易用**:
- 三个服务配置简单
- 一键启动`docker-compose up -d`
**资源占用少**:
- 适合小型部署
- 单机即可运行
**易于维护**:
- 日志集中管理
- 配置统一
**开发友好**:
- 适合本地开发
- 快速启动
### 7.2 缺点
**单点故障**:
- 单个 ThingsBoard 实例
- 故障影响整个系统
**无法扩展**:
- 不支持水平扩展
- 性能受限于单机
**Kafka 配置不适合生产**:
- 单节点无副本
- 日志保留时间太短
**安全配置不足**:
- 明文密码
- 明文 MQTT/Kafka 连接
## 8. 改进建议
### 8.1 生产环境改进
1. **Kafka 配置**:
```yaml
KAFKA_CFG_LOG_RETENTION_MS: "2592000000" # 30 天
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: "3" # 多副本
```
2. **安全配置**:
```yaml
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} # 使用环境变量
ALLOW_PLAINTEXT_LISTENER: "no" # 禁用明文
```
3. **高可用部署**:
- 使用微服务模式
- 多个 ThingsBoard 实例
- Kafka 集群
### 8.2 数据库选择
如需更好的时序数据性能可以使用混合模式
```yaml
environment:
DATABASE_TS_TYPE: cassandra
CASSANDRA_URL: cassandra:9042
```
需要添加 Cassandra 服务
## 9. 使用场景
### 9.1 适合的场景
- 小型 IoT 项目< 1,000 设备
- 开发和测试环境
- 概念验证PoC
- 个人学习项目
### 9.2 不适合的场景
- 大规模生产环境> 10,000 设备)
- ❌ 高可用性要求
- ❌ 需要水平扩展
- ❌ 高性能要求
## 10. 启动命令
```bash
# 启动所有服务
docker-compose up -d
# 查看日志
docker-compose logs -f thingsboard-ce
# 停止服务
docker-compose down
# 停止并删除数据卷(谨慎使用)
docker-compose down -v
```
## 11. 访问地址
启动后可以通过以下地址访问:
- **Web UI**: http://localhost:8080
- **MQTT**: mqtt://localhost:1883
- **MQTT over SSL**: mqtts://localhost:8883
- **CoAP**: coap://localhost:5683
## 12. 总结
这是一个 **ThingsBoard CE 单体部署配置**,特点:
1. **部署模式**: 单体模式Monolith
2. **数据库**: PostgreSQLSQL 模式)
3. **消息队列**: KafkaKRaft 模式,单节点)
4. **适用场景**: 小型部署、开发测试
5. **优点**: 简单、易用、资源占用少
6. **缺点**: 无法扩展、单点故障、配置不适合生产
这是一个**开发/测试环境的典型配置**,不适合大规模生产环境使用。