version: '3.8' services: # MySQL数据库 mysql: image: mysql:8.0 container_name: iot-mysql restart: always environment: MYSQL_ROOT_PASSWORD: IoT.p2026.Xk9Qm MYSQL_DATABASE: iot_platform TZ: Asia/Shanghai ports: - "127.0.0.1:3386:3306" volumes: - mysql-data:/var/lib/mysql - ../backend/sql/init.sql:/docker-entrypoint-initdb.d/init.sql command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci networks: - iot-network # Redis缓存 redis: image: redis:7-alpine container_name: iot-redis restart: always ports: - "6379:6379" volumes: - redis-data:/data command: redis-server --appendonly yes networks: - iot-network # RabbitMQ消息队列 rabbitmq: image: rabbitmq:3.12-management container_name: iot-rabbitmq restart: always environment: RABBITMQ_DEFAULT_USER: guest RABBITMQ_DEFAULT_PASS: guest ports: - "5672:5672" - "15672:15672" volumes: - rabbitmq-data:/var/lib/rabbitmq networks: - iot-network # EMQX MQTT Broker emqx: image: emqx/emqx:5.5 container_name: iot-emqx restart: always ports: - "1883:1883" # MQTT端口 - "8883:8883" # MQTT over SSL - "8084:8084" # WebSocket over SSL - "18083:18083" # Dashboard environment: - EMQX_NAME=emqx - EMQX_HOST=127.0.0.1 - EMQX_DASHBOARD__DEFAULT_PASSWORD=public volumes: - emqx-data:/opt/emqx/data - emqx-log:/opt/emqx/log networks: - iot-network # InfluxDB时序数据库 influxdb: image: influxdb:2.7 container_name: iot-influxdb restart: always environment: DOCKER_INFLUXDB_INIT_MODE: setup DOCKER_INFLUXDB_INIT_USERNAME: admin DOCKER_INFLUXDB_INIT_PASSWORD: admin123456 DOCKER_INFLUXDB_INIT_ORG: iot-platform DOCKER_INFLUXDB_INIT_BUCKET: device-data DOCKER_INFLUXDB_INIT_RETENTION: 30d DOCKER_INFLUXDB_INIT_ADMIN_TOKEN: iot-platform-token-2026 ports: - "8086:8086" volumes: - influxdb-data:/var/lib/influxdb2 - influxdb-config:/etc/influxdb2 networks: - iot-network # XXL-Job调度中心 xxl-job-admin: image: xuxueli/xxl-job-admin:2.4.0 container_name: iot-xxl-job-admin restart: always environment: PARAMS: '--spring.datasource.url=jdbc:mysql://mysql:3306/iot_platform?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai --spring.datasource.username=root --spring.datasource.password=IoT.p2026.Xk9Qm' ports: - "8080:8080" depends_on: - mysql networks: - iot-network # Grafana可视化 grafana: image: grafana/grafana:10.2 container_name: iot-grafana restart: always ports: - "3000:3000" environment: GF_SECURITY_ADMIN_USER: admin GF_SECURITY_ADMIN_PASSWORD: admin GF_INSTALL_PLUGINS: grafana-clock-panel,grafana-simple-json-datasource volumes: - grafana-data:/var/lib/grafana networks: - iot-network volumes: mysql-data: redis-data: rabbitmq-data: emqx-data: emqx-log: influxdb-data: influxdb-config: grafana-data: networks: iot-network: driver: bridge