# ======================================== # DOCKER COMPOSE - MONITORING STACK # Prometheus + Grafana + Exporters # ======================================== version: '3.9' services: # ======================================== # Prometheus # ======================================== prometheus: image: prom/prometheus:latest container_name: math-prometheus volumes: - ./monitoring/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro - ./monitoring/prometheus/rules:/etc/prometheus/rules:ro - prometheus_data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--storage.tsdb.retention.time=15d' - '--web.console.libraries=/usr/share/prometheus/console_libraries' - '--web.console.templates=/usr/share/prometheus/consoles' - '--web.enable-lifecycle' ports: - "127.0.0.1:9090:9090" networks: - monitoring restart: unless-stopped logging: driver: "json-file" options: max-size: "50m" max-file: "3" # ======================================== # Grafana # ======================================== grafana: image: grafana/grafana:latest container_name: math-grafana volumes: - grafana_data:/var/lib/grafana - ./monitoring/grafana/datasources:/etc/grafana/provisioning/datasources:ro - ./monitoring/grafana/dashboards:/etc/grafana/provisioning/dashboards:ro environment: - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD:-admin} - GF_USERS_ALLOW_SIGN_UP=false - GF_SERVER_ROOT_URL=${GRAFANA_URL:-http://localhost:3001} - GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-simple-json-datasource ports: - "127.0.0.1:3001:3000" depends_on: - prometheus networks: - monitoring restart: unless-stopped logging: driver: "json-file" options: max-size: "50m" max-file: "3" # ======================================== # PostgreSQL Exporter # ======================================== postgres-exporter: image: prometheuscommunity/postgres-exporter:latest container_name: math-postgres-exporter environment: DATA_SOURCE_NAME: "postgresql://${DB_USER:-mathuser}:${DB_PASSWORD}@postgres:5432/${DB_NAME:-mathdb}?sslmode=disable" ports: - "127.0.0.1:9187:9187" networks: - monitoring - backend restart: unless-stopped # ======================================== # Redis Exporter # ======================================== redis-exporter: image: oliver006/redis_exporter:latest container_name: math-redis-exporter environment: REDIS_ADDR: "redis://redis:6379" REDIS_PASSWORD: ${REDIS_PASSWORD} ports: - "127.0.0.1:9121:9121" networks: - monitoring - backend restart: unless-stopped # ======================================== # Node Exporter # ======================================== node-exporter: image: prom/node-exporter:latest container_name: math-node-exporter volumes: - /proc:/host/proc:ro - /sys:/host/sys:ro - /:/rootfs:ro command: - '--path.procfs=/host/proc' - '--path.rootfs=/rootfs' - '--path.sysfs=/host/sys' - '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)' ports: - "127.0.0.1:9100:9100" networks: - monitoring restart: unless-stopped # ======================================== # Nginx Exporter # ======================================== nginx-exporter: image: nginx/nginx-prometheus-exporter:latest container_name: math-nginx-exporter command: - '-nginx.scrape-uri=http://nginx:80/stub_status' ports: - "127.0.0.1:9113:9113" networks: - monitoring - frontend restart: unless-stopped # ======================================== # Alertmanager # ======================================== alertmanager: image: prom/alertmanager:latest container_name: math-alertmanager volumes: - ./monitoring/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml:ro - alertmanager_data:/alertmanager command: - '--config.file=/etc/alertmanager/alertmanager.yml' - '--storage.path=/alertmanager' ports: - "127.0.0.1:9093:9093" networks: - monitoring restart: unless-stopped # ======================================== # cAdvisor (Container Advisor) # ======================================== cadvisor: image: gcr.io/cadvisor/cadvisor:latest container_name: math-cadvisor privileged: true devices: - /dev/kmsg:/dev/kmsg volumes: - /:/rootfs:ro - /var/run:/var/run:ro - /sys:/sys:ro - /var/lib/docker:/var/lib/docker:ro - /cgroup:/cgroup:ro ports: - "127.0.0.1:8080:8080" networks: - monitoring restart: unless-stopped volumes: prometheus_data: driver: local grafana_data: driver: local alertmanager_data: driver: local networks: monitoring: driver: bridge backend: external: true frontend: external: true