version: '3.8' services: # 后端服务 backend: build: context: ./cn-universal-web dockerfile: Dockerfile container_name: cn-universal-backend restart: unless-stopped ports: - "9092:9092" environment: # 数据库配置 (MySQL 5.8 兼容) - SPRING_DATASOURCE_URL=jdbc:mysql://${MYSQL_HOST:-mysql}:${MYSQL_PORT:-3306}/${MYSQL_DATABASE:-univ}?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true - SPRING_DATASOURCE_USERNAME=${MYSQL_USERNAME:-root} - SPRING_DATASOURCE_PASSWORD=${MYSQL_PASSWORD:-Haha@2025} # Redis 配置 - SPRING_DATA_REDIS_HOST=${REDIS_HOST:-redis} - SPRING_DATA_REDIS_PORT=${REDIS_PORT:-6379} - SPRING_DATA_REDIS_PASSWORD=${REDIS_PASSWORD:-Nexiot2025} - SPRING_DATA_REDIS_DATABASE=${REDIS_DATABASE:-11} # MQTT 配置 - MQTT_CFG_HOST=${MQTT_HOST:-tcp://emqx:1883} - MQTT_CFG_CLIENT_USERNAME=${MQTT_USERNAME:-universal_iot} - MQTT_CFG_CLIENT_PASSWORD=${MQTT_PASSWORD:-Abc@2025} - MQTT_CFG_CLIENT_ID_PREFIX=${MQTT_CLIENT_ID_PREFIX:-univ_iot_docker} # 应用配置 - SPRING_PROFILES_ACTIVE=docker - SERVER_PORT=8080 depends_on: - mysql - redis - emqx networks: - iot-network volumes: - ./logs:/app/logs # 前端服务 frontend: build: context: ./cn-universal-web-ui dockerfile: Dockerfile container_name: cn-universal-frontend restart: unless-stopped ports: - "80:80" depends_on: - backend networks: - iot-network # MySQL 数据库 (5.8 兼容) mysql: image: mysql:5.8 container_name: cn-universal-mysql restart: unless-stopped environment: - MYSQL_ROOT_PASSWORD=${MYSQL_PASSWORD:-Haha@2025} - MYSQL_DATABASE=${MYSQL_DATABASE:-univ} - MYSQL_USER=${MYSQL_USERNAME:-root} ports: - "3306:3306" volumes: - mysql_data:/var/lib/mysql - ./mysql/init:/docker-entrypoint-initdb.d - ./mysql/conf:/etc/mysql/conf.d networks: - iot-network command: --default-authentication-plugin=mysql_native_password --lower_case_table_names=1 --sql_mode=STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO # Redis 缓存 redis: image: redis:7-alpine container_name: cn-universal-redis restart: unless-stopped environment: - REDIS_PASSWORD=${REDIS_PASSWORD:-Nexiot2025} ports: - "6379:6379" volumes: - redis_data:/data networks: - iot-network command: redis-server --requirepass ${REDIS_PASSWORD:-Nexiot2025} # EMQX MQTT Broker emqx: image: emqx/emqx:5.3 container_name: cn-universal-emqx restart: unless-stopped environment: - EMQX_NAME=emqx - EMQX_HOST=localhost ports: - "1883:1883" - "8083:8083" - "8084:8084" - "18083:18083" volumes: - emqx_data:/opt/emqx/data - emqx_log:/opt/emqx/log networks: - iot-network # 数据库管理工具 (可选) adminer: image: adminer container_name: cn-universal-adminer restart: unless-stopped ports: - "8081:8080" environment: - ADMINER_DEFAULT_SERVER=mysql depends_on: - mysql networks: - iot-network volumes: mysql_data: redis_data: emqx_data: emqx_log: networks: iot-network: driver: bridge