Files
Universal-IoT-Java/docker/docker-compose.yml
T

189 lines
5.5 KiB
YAML

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}
# 备用外网 MQTT Host(可选)
- MQTT_CFG_HOST_OUT=${MQTT_HOST_OUT:-tcp://127.0.0.1:1883}
# EMQX HTTP鉴权请求头(后端会校验)
- MQTT_CFG_EMQX_HEADER_KEY=${EMQX_HEADER_KEY:-universal-emqx}
- MQTT_CFG_EMQX_HEADER_VALUE=${EMQX_HEADER_VALUE:-d41d8cd98f00b204e9800998ecf8427e}
# 应用配置
- SPRING_PROFILES_ACTIVE=docker
- RUN_MODE=docker
- LOGGING_FILE_PATH=/app/logs/cn-universal2
- LOGGING_FILE_NAME=/app/logs/cn-universal-web.log
- SERVER_PORT=9092
- SERVER_HTTP2_ENABLED=false
- JAVA_TOOL_OPTIONS=-Dio.netty.native.workdir=/app/logs
# 启用数据库与 Redis 自动配置(由环境变量提供连接信息)
# 关闭外部协议模块,避免阻塞启动(Docker 内可按需开启)
- TCP_PROTOCOL_ENABLED=true
- UDP_PROTOCOL_ENABLED=true
- CTAIOT_PROTOCOL_ENABLE=true
- ONENET_PROTOCOL_ENABLED=true
- IMOULIFE_PROTOCOL_ENABLED=true
# 兼容未打包的 local profile 配置
- SHARD_LOG_ENABLE=true
- SPRING_APPLICATION_JSON={"server":{"port":9092},"management":{"endpoints":{"web":{"exposure":{"include":"health,info,metrics,prometheus"},"base-path":"/actuator"}}}},"shard":{"log":{"enable":true,"table":{"number":24},"virtual":{"number":8}},"logMeta":{"enable":true,"table":{"number":24},"virtual":{"number":8}}},"iot":{"register":{"auto":{"unionId":"auto_register","latitude":31.081598,"longitude":81.314141}}}}
depends_on:
- mysql
- redis
- emqx
networks:
- iot-network
volumes:
- ./logs:/app/logs
security_opt:
- no-new-privileges:true
read_only: true
tmpfs:
- /tmp
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
# 前端服务
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
security_opt:
- no-new-privileges:true
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
# MySQL 数据库 (5.8 兼容)
mysql:
image: mysql:8.0
container_name: cn-universal-mysql
restart: unless-stopped
environment:
- MYSQL_ROOT_PASSWORD=${MYSQL_PASSWORD:-Haha@2025}
- MYSQL_DATABASE=${MYSQL_DATABASE:-univ}
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
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
# 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}
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
# 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
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
# 数据库管理工具 (可选)
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
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
volumes:
mysql_data:
redis_data:
emqx_data:
emqx_log:
networks:
iot-network:
driver: bridge