# 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 模式**: - 使用 KRaft(Kafka 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 个日志文件 ``` **日志轮转**: 最大日志大小 1GB(100MB × 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. **数据库**: PostgreSQL(SQL 模式) 3. **消息队列**: Kafka(KRaft 模式,单节点) 4. **适用场景**: 小型部署、开发测试 5. **优点**: 简单、易用、资源占用少 6. **缺点**: 无法扩展、单点故障、配置不适合生产 这是一个**开发/测试环境的典型配置**,不适合大规模生产环境使用。