version: '3.8' services: # 主应用服务 app: build: . ports: - "8080:8080" environment: - DB_HOST=postgres - DB_PORT=5432 - DB_USER=postgres - DB_PASSWORD=postgres - DB_NAME=iot_base_station - INFLUXDB_URL=http://influxdb:8086 - INFLUXDB_TOKEN=influxdb-token - INFLUXDB_ORG=iot-org - INFLUXDB_BUCKET=iot-data - REDIS_HOST=host.docker.internal # 使用主机上的Redis - REDIS_PORT=6379 - NATS_URL=nats://nats:4222 - MQTT_BROKER=tcp://mqtt:1883 depends_on: - postgres - influxdb - nats - mqtt volumes: - ./logs:/app/logs - ./uploads:/app/uploads networks: - iot-network extra_hosts: - "host.docker.internal:host-gateway" # 允许访问主机服务 # 数据网关服务 gateway: build: . command: ["go", "run", "cmd/gateway/main.go"] ports: - "8081:8081" environment: - DB_HOST=postgres - DB_PORT=5432 - DB_USER=postgres - DB_PASSWORD=postgres - DB_NAME=iot_base_station - INFLUXDB_URL=http://influxdb:8086 - INFLUXDB_TOKEN=influxdb-token - INFLUXDB_ORG=iot-org - INFLUXDB_BUCKET=iot-data - REDIS_HOST=host.docker.internal # 使用主机上的Redis - REDIS_PORT=6379 - NATS_URL=nats://nats:4222 - MQTT_BROKER=tcp://mqtt:1883 depends_on: - postgres - influxdb - nats - mqtt volumes: - ./logs:/app/logs networks: - iot-network extra_hosts: - "host.docker.internal:host-gateway" # 允许访问主机服务 # 监控服务 monitor: build: . command: ["go", "run", "cmd/monitor/main.go"] ports: - "8082:8082" environment: - DB_HOST=postgres - DB_PORT=5432 - DB_USER=postgres - DB_PASSWORD=postgres - DB_NAME=iot_base_station - INFLUXDB_URL=http://influxdb:8086 - INFLUXDB_TOKEN=influxdb-token - INFLUXDB_ORG=iot-org - INFLUXDB_BUCKET=iot-data - REDIS_HOST=host.docker.internal # 使用主机上的Redis - REDIS_PORT=6379 depends_on: - postgres - influxdb volumes: - ./logs:/app/logs networks: - iot-network extra_hosts: - "host.docker.internal:host-gateway" # 允许访问主机服务 # PostgreSQL数据库 postgres: image: postgres:14 environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres - POSTGRES_DB=iot_base_station ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data - ./scripts/init-postgres.sql:/docker-entrypoint-initdb.d/init-postgres.sql networks: - iot-network # InfluxDB时序数据库 influxdb: image: influxdb:2.0 environment: - DOCKER_INFLUXDB_INIT_MODE=setup - DOCKER_INFLUXDB_INIT_USERNAME=admin - DOCKER_INFLUXDB_INIT_PASSWORD=adminpassword - DOCKER_INFLUXDB_INIT_ORG=iot-org - DOCKER_INFLUXDB_INIT_BUCKET=iot-data - DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=influxdb-token ports: - "8086:8086" volumes: - influxdb_data:/var/lib/influxdb2 networks: - iot-network # NATS消息队列 nats: image: nats:2-alpine ports: - "4222:4222" - "8222:8222" # HTTP监控端口 command: ["-js", "-m", "8222"] # 启用JetStream和监控 networks: - iot-network # MQTT代理 mqtt: image: eclipse-mosquitto:2 ports: - "1883:1883" - "9001:9001" # WebSocket端口 volumes: - ./config/mosquitto.conf:/mosquitto/config/mosquitto.conf - mqtt_data:/mosquitto/data - mqtt_logs:/mosquitto/log networks: - iot-network # Grafana监控面板 grafana: image: grafana/grafana:latest ports: - "3000:3000" environment: - GF_SECURITY_ADMIN_PASSWORD=admin volumes: - grafana_data:/var/lib/grafana - ./config/grafana/dashboards:/etc/grafana/provisioning/dashboards - ./config/grafana/datasources:/etc/grafana/provisioning/datasources depends_on: - influxdb networks: - iot-network # Prometheus监控 prometheus: image: prom/prometheus:latest ports: - "9090:9090" volumes: - ./config/prometheus.yml:/etc/prometheus/prometheus.yml - prometheus_data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--web.console.libraries=/etc/prometheus/console_libraries' - '--web.console.templates=/etc/prometheus/consoles' - '--storage.tsdb.retention.time=200h' - '--web.enable-lifecycle' networks: - iot-network volumes: postgres_data: influxdb_data: mqtt_data: mqtt_logs: grafana_data: prometheus_data: networks: iot-network: driver: bridge