version: '3.8' services: # PostgreSQL 数据库(更新为支持 PostGIS) postgres: image: postgis/postgis:16-3.4 container_name: drone-postgres environment: POSTGRES_DB: dronedb POSTGRES_USER: drone POSTGRES_PASSWORD: dronepassword ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data restart: unless-stopped # InfluxDB 时序数据库 influxdb: image: influxdb:2.7 container_name: drone-influxdb environment: DOCKER_INFLUXDB_INIT_MODE: setup DOCKER_INFLUXDB_INIT_USERNAME: admin DOCKER_INFLUXDB_INIT_PASSWORD: influxdb123 DOCKER_INFLUXDB_INIT_ORG: drone_org DOCKER_INFLUXDB_INIT_BUCKET: drone_data DOCKER_INFLUXDB_INIT_ADMIN_TOKEN: my-super-secret-token ports: - "8086:8086" volumes: - influxdb_data:/var/lib/influxdb2 restart: unless-stopped # EMQX 消息代理 emqx: image: emqx/emqx-enterprise:5.8.6 container_name: drone-emqx ports: - "1883:1883" # MQTT - "8083:8083" # MQTT/WS - "8084:8084" # MQTT/WSS - "8883:8883" # MQTT/SSL - "18083:18083" # Dashboard volumes: - emqx_data:/opt/emqx/data - emqx_log:/opt/emqx/log environment: EMQX_NAME: drone-emqx EMQX_DASHBOARD__DEFAULT_USERNAME: admin EMQX_DASHBOARD__DEFAULT_PASSWORD: public restart: unless-stopped # Spring Boot 后端 - 生产模式 backend: build: context: ./backend dockerfile: Dockerfile image: drone-backend:latest container_name: drone-backend depends_on: - postgres - influxdb - emqx ports: - "0.0.0.0:8080:8080" # 绑定到所有接口,允许外部访问 environment: SPRING_PROFILES_ACTIVE: production SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/dronedb SPRING_DATASOURCE_USERNAME: drone SPRING_DATASOURCE_PASSWORD: dronepassword INFLUXDB_URL: http://influxdb:8086 INFLUXDB_TOKEN: my-super-secret-token INFLUXDB_ORG: drone_org INFLUXDB_BUCKET: drone_data MQTT_BROKER_URL: tcp://emqx:1883 MQTT_TOPICS_TELEMETRY: drones/+/telemetry MQTT_TOPICS_COMMANDS: drones/+/commands MQTT_TOPICS_RESPONSES: drones/+/responses # JVM 配置优化 JAVA_OPTS: "-Xms512m -Xmx1024m -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:+UseStringDeduplication" restart: unless-stopped healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8080/actuator/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s volumes: postgres_data: influxdb_data: emqx_data: emqx_log: