# لایه مانیتورینگ — Prometheus، Grafana، Loki، Alertmanager و صادرکننده‌ها # # توسعه: docker compose -f docker-compose.yml -f docker-compose.monitoring.yml up -d # تولید: سه فایل با هم: base + monitoring + prod (بخش مانیتورینگ README) # # داشبورد: grafana.localhost (توسعه) — رمز از GRAFANA_ADMIN_PASSWORD در .env # هشدارها: Prometheus → Alertmanager → تلگرام (ALERT_TELEGRAM_* در .env) # منابع: مجموعاً حدود ۱ تا ۱.۵ گیگابایت RAM — با حذف هر سرویس، بقیه سرپا می‌مانند. x-default-logging: &default-logging driver: json-file options: max-size: "10m" max-file: "3" services: prometheus: image: prom/prometheus:v2.53.0 restart: unless-stopped logging: *default-logging command: - --config.file=/etc/prometheus/prometheus.yml - --storage.tsdb.path=/prometheus - --storage.tsdb.retention.time=15d - --storage.tsdb.retention.size=2GB volumes: - ./monitoring/prometheus:/etc/prometheus:ro - prometheus_data:/prometheus networks: [monitoring, edge] environment: # پروب عمومی — در تولید SITE_URL در .env تنظیم می‌شود (مثل https://aramesh.example) SITE_URL: ${SITE_URL:-http://frontend/} healthcheck: test: ["CMD", "wget", "-q", "--spider", "http://localhost:9090/-/healthy"] interval: 30s timeout: 5s retries: 5 start_period: 15s deploy: resources: limits: memory: 768M alertmanager: image: prom/alertmanager:v0.27.0 restart: unless-stopped logging: *default-logging command: - --config.file=/etc/alertmanager/alertmanager.rendered.yml - --storage.path=/alertmanager # فایل رندرشدهٔ alertmanager.rendered.yml را scripts/stack.sh از قالب # alertmanager.yml با مقادیر .env (ALERT_BOT_TOKEN/ALERT_CHAT_ID) می‌سازد — # Alertmanager خودش متغیر محیطی را در کانفیگ جایگزین نمی‌کند volumes: - ./monitoring/alertmanager:/etc/alertmanager:ro - alertmanager_data:/alertmanager networks: [monitoring] deploy: resources: limits: memory: 128M # منابع هر کانتینر — روی Linux سرور کامل کار می‌کند؛ روی Docker Desktop ویندوز # ممکن است محدود باشد (حذفش بقیه استک را نمی‌شکند) cadvisor: image: gcr.io/cadvisor/cadvisor:v0.49.1 restart: unless-stopped logging: *default-logging privileged: true volumes: - /:/rootfs:ro - /var/run:/var/run:ro - /sys:/sys:ro - /var/lib/docker/:/var/lib/docker:ro networks: [monitoring] deploy: resources: limits: memory: 192M # منابع میزبان + سنجهٔ تازگی پشتیبان (backups/*.prom نوشتهٔ scripts/backup.sh) node-exporter: image: quay.io/prometheus/node-exporter:v1.8.2 restart: unless-stopped logging: *default-logging command: - --path.rootfs=/host - --collector.textfile.directory=/textfile volumes: - /:/host:ro - ./backups:/textfile:ro networks: [monitoring] deploy: resources: limits: memory: 64M postgres-exporter: image: quay.io/prometheuscommunity/postgres-exporter:v0.16.0 restart: unless-stopped logging: *default-logging environment: DATA_SOURCE_NAME: postgresql://aramesh:${POSTGRES_PASSWORD:?POSTGRES_PASSWORD را در .env تنظیم کنید}@db:5432/arameshplaza?sslmode=disable networks: [internal, monitoring] deploy: resources: limits: memory: 64M blackbox-exporter: image: prom/blackbox-exporter:v0.25.0 restart: unless-stopped logging: *default-logging # edge برای رسیدن به سرویس‌هایی که پروب می‌شوند (frontend/minio/umami/chatbot/backend) networks: [monitoring, edge] deploy: resources: limits: memory: 64M # لاگ همهٔ کانتینرها — جست‌وجو در Grafana؛ خطاهای بک‌اند از همین‌جا دیده می‌شوند loki: image: grafana/loki:3.1.1 restart: unless-stopped logging: *default-logging command: -config.file=/etc/loki/loki-config.yml volumes: - ./monitoring/loki:/etc/loki:ro - loki_data:/loki networks: [monitoring] deploy: resources: limits: memory: 512M promtail: image: grafana/promtail:3.1.1 restart: unless-stopped logging: *default-logging command: -config.file=/etc/promtail/promtail-config.yml volumes: - ./monitoring/promtail:/etc/promtail:ro - /var/run/docker.sock:/var/run/docker.sock:ro - promtail_positions:/positions networks: [monitoring] depends_on: [loki] deploy: resources: limits: memory: 128M grafana: image: grafana/grafana:11.1.0 restart: unless-stopped logging: *default-logging environment: GF_SECURITY_ADMIN_USER: ${GRAFANA_ADMIN_USER:-admin} GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_ADMIN_PASSWORD:?GRAFANA_ADMIN_PASSWORD را در .env تنظیم کنید} GF_USERS_ALLOW_SIGN_UP: "false" volumes: - grafana_data:/var/lib/grafana - ./monitoring/grafana/provisioning:/etc/grafana/provisioning:ro - ./monitoring/grafana/dashboards:/var/lib/grafana/dashboards:ro networks: [monitoring, edge] healthcheck: test: ["CMD-SHELL", "curl -sf http://localhost:3000/api/health || wget -q --spider http://localhost:3000/api/health"] interval: 30s timeout: 5s retries: 5 start_period: 30s labels: - traefik.enable=true - traefik.http.routers.grafana.rule=Host(`grafana.localhost`) - traefik.http.routers.grafana.entrypoints=web - traefik.http.services.grafana.loadbalancer.server.port=3000 deploy: resources: limits: memory: 384M networks: monitoring: volumes: prometheus_data: alertmanager_data: loki_data: grafana_data: promtail_positions: