version: "3.8" # 天工智能体平台 — 本地开发环境 # 启动: docker compose -f docker-compose.dev.yml up -d # 仅启动中间件(MySQL + Redis),应用层使用本地 npm run dev / uvicorn services: mysql: image: mysql:8.0 container_name: aiagent-dev-mysql restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: dev123 MYSQL_DATABASE: agent_db_dev MYSQL_CHARSET: utf8mb4 MYSQL_COLLATION: utf8mb4_unicode_ci ports: - "3306:3306" volumes: - dev_mysql_data:/var/lib/mysql - ./backend/init.sql:/docker-entrypoint-initdb.d/init.sql:ro healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 10s timeout: 5s retries: 5 redis: image: redis:7-alpine container_name: aiagent-dev-redis restart: unless-stopped command: redis-server --appendonly yes --maxmemory 128mb --maxmemory-policy allkeys-lru ports: - "6379:6379" volumes: - dev_redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 3s retries: 5 # ─── 本地 Prometheus 监控 ──────────────────────────────────────── prometheus: image: prom/prometheus:v2.53.0 container_name: aiagent-dev-prometheus restart: unless-stopped command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--storage.tsdb.retention.time=15d' - '--web.enable-lifecycle' ports: - "9090:9090" volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro - ./prometheus-alert-rules.yml:/etc/prometheus/alert_rules.yml:ro - dev_prometheus_data:/prometheus extra_hosts: - "host.docker.internal:host-gateway" # ─── 本地 Grafana 可视化 ───────────────────────────────────────── grafana: image: grafana/grafana:11.0.0 container_name: aiagent-dev-grafana restart: unless-stopped environment: - GF_SECURITY_ADMIN_USER=admin - GF_SECURITY_ADMIN_PASSWORD=admin123 - GF_USERS_ALLOW_SIGN_UP=false ports: - "3000:3000" volumes: - ./grafana/datasources:/etc/grafana/provisioning/datasources:ro - ./grafana/dashboards:/etc/grafana/provisioning/dashboards:ro - ./grafana/dashboards/tiangong-overview.json:/var/lib/grafana/dashboards/tiangong-overview.json:ro - dev_grafana_data:/var/lib/grafana # ─── ELK 日志聚合 ───────────────────────────────────────────────── elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:8.15.0 container_name: aiagent-dev-elasticsearch restart: unless-stopped environment: - discovery.type=single-node - ES_JAVA_OPTS=-Xms256m -Xmx512m - xpack.security.enabled=false ports: - "9200:9200" volumes: - dev_es_data:/usr/share/elasticsearch/data healthcheck: test: ["CMD-SHELL", "curl -s http://localhost:9200/_cluster/health | grep -q 'green\|yellow'"] interval: 15s timeout: 10s retries: 10 kibana: image: docker.elastic.co/kibana/kibana:8.15.0 container_name: aiagent-dev-kibana restart: unless-stopped environment: - ELASTICSEARCH_HOSTS=http://elasticsearch:9200 ports: - "5601:5601" depends_on: elasticsearch: condition: service_healthy filebeat: image: docker.elastic.co/beats/filebeat:8.15.0 container_name: aiagent-dev-filebeat restart: unless-stopped volumes: - ./filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml:ro - ./backend/logs:/app/logs:ro depends_on: - elasticsearch volumes: dev_mysql_data: driver: local dev_redis_data: driver: local dev_prometheus_data: driver: local dev_grafana_data: driver: local dev_es_data: driver: local dev_logs: driver: local