version: '3.8' services: app: build: context: .. dockerfile: deployment/Dockerfile ports: - "8111:8000" environment: - APP_ENV=development - LOG_LEVEL=INFO - METRICS_ENABLED=true # Redis 指标存储配置 - REDIS_HOST=redis - REDIS_PORT=6379 - REDIS_DB=0 # 指标配置文件路径 - METRICS_CONFIG_PATH=config/metrics.yaml # 日志文件配置 - LOG_FILE_ENABLED=false - LOG_FILE_PATH=/var/log/app/app.log volumes: - ../src:/app/src - ../config:/app/config - app_logs:/var/log/app labels: logging: "promtail" logging_jobname: "functional-scaffold-app" restart: unless-stopped depends_on: redis: condition: service_healthy healthcheck: test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/healthz')"] interval: 30s timeout: 3s retries: 3 start_period: 5s # Redis - 用于集中式指标存储 redis: image: redis:7-alpine ports: - "6380:6379" volumes: - redis_data:/data command: redis-server --appendonly yes restart: unless-stopped healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 3s retries: 3 prometheus: image: prom/prometheus:latest ports: - "9090:9090" volumes: - ../monitoring/prometheus.yml:/etc/prometheus/prometheus.yml - ../monitoring/alerts:/etc/prometheus/rules - prometheus_data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' restart: unless-stopped depends_on: - app grafana: image: grafana/grafana:latest ports: - "3000:3000" environment: - GF_SECURITY_ADMIN_PASSWORD=admin volumes: - grafana_data:/var/lib/grafana - ../monitoring/grafana/datasources:/etc/grafana/provisioning/datasources - ../monitoring/grafana/dashboards:/etc/grafana/provisioning/dashboards restart: unless-stopped depends_on: - prometheus - loki loki: image: grafana/loki:2.9.3 ports: - "3100:3100" volumes: - ../monitoring/loki.yaml:/etc/loki/local-config.yaml - loki_data:/loki command: -config.file=/etc/loki/local-config.yaml restart: unless-stopped healthcheck: test: ["CMD", "wget", "--spider", "-q", "http://localhost:3100/ready"] interval: 10s timeout: 3s retries: 3 promtail: ports: - "9080:9080" image: grafana/promtail:3.0.0 volumes: - ../monitoring/promtail.yaml:/etc/promtail/config.yml # Docker stdio 收集 - /var/lib/docker/containers:/var/lib/docker/containers:ro - /var/run/docker.sock:/var/run/docker.sock:ro # Log 文件收集(备用) - app_logs:/var/log/app:ro command: -config.file=/etc/promtail/config.yml restart: unless-stopped depends_on: - loki volumes: prometheus_data: grafana_data: redis_data: loki_data: app_logs: