services: grafana: image: grafana/grafana:latest restart: unless-stopped user: "104" ports: - "3001:3000" volumes: - /mnt/docker-data/configs/grafana:/var/lib/grafana healthcheck: test: ["CMD-SHELL", "wget -q --spider http://localhost:3000/api/health || exit 1"] interval: 30s timeout: 10s retries: 3 start_period: 30s logging: driver: "json-file" options: max-size: "50m" max-file: "3" deploy: mode: replicated replicas: 1 placement: constraints: - node.hostname == hf-pdocker-01 resources: limits: memory: 512M prometheus: image: prom/prometheus:latest restart: unless-stopped ports: - "9095:9090" command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--web.console.libraries=/usr/share/prometheus/console_libraries' - '--web.console.templates=/usr/share/prometheus/consoles' - '--web.enable-lifecycle' volumes: - /mnt/docker-data/configs/prometheus:/etc/prometheus healthcheck: test: ["CMD-SHELL", "wget -q --spider http://localhost:9090/-/healthy || exit 1"] interval: 30s timeout: 10s retries: 3 start_period: 30s logging: driver: "json-file" options: max-size: "50m" max-file: "3" deploy: mode: replicated replicas: 1 placement: constraints: - node.hostname == hf-pdocker-01 resources: limits: memory: 512M alertmanager: image: prom/alertmanager:latest restart: unless-stopped ports: - "9093:9093" command: - '--config.file=/etc/alertmanager/alertmanager.yml' - '--storage.path=/alertmanager' volumes: - /mnt/docker-data/configs/alertmanager:/etc/alertmanager - alertmanager-data:/alertmanager healthcheck: test: ["CMD-SHELL", "wget -q --spider http://localhost:9093/-/healthy || exit 1"] interval: 30s timeout: 10s retries: 3 start_period: 30s logging: driver: "json-file" options: max-size: "50m" max-file: "3" deploy: mode: replicated replicas: 1 placement: constraints: - node.hostname == hf-pdocker-01 resources: limits: memory: 256M node-exporter: image: prom/node-exporter:latest restart: unless-stopped ports: - "9100:9100" volumes: - /proc:/host/proc:ro - /sys:/host/sys:ro - /:/rootfs:ro command: - '--path.procfs=/host/proc' - '--path.rootfs=/rootfs' - '--path.sysfs=/host/sys' logging: driver: "json-file" options: max-size: "50m" max-file: "3" deploy: mode: global resources: limits: memory: 128M influxdb: image: influxdb:1.8-alpine restart: unless-stopped volumes: - /mnt/docker-data/configs/influxdb:/var/lib/influxdb healthcheck: test: ["CMD-SHELL", "wget -q --spider http://localhost:8086/ping || exit 1"] interval: 30s timeout: 10s retries: 3 start_period: 30s logging: driver: "json-file" options: max-size: "50m" max-file: "3" deploy: mode: replicated replicas: 1 placement: constraints: - node.hostname == hf-pdocker-01 resources: limits: memory: 1G matrix-alertmanager-receiver: image: metio/matrix-alertmanager-receiver:2026.2.25 restart: unless-stopped ports: - "9094:9094" volumes: - /mnt/docker-data/configs/alertmanager/matrix-receiver-config.yml:/config/config.yml:ro command: ["--config-path", "/config/config.yml"] # NOTE: No healthcheck - this image is distroless (no shell), so CMD-SHELL healthchecks fail. # The service is verified healthy by Alertmanager successfully POSTing to it. logging: driver: "json-file" options: max-size: "50m" max-file: "3" deploy: mode: replicated replicas: 1 placement: constraints: - node.hostname == hf-pdocker-01 resources: limits: memory: 128M blackbox-exporter: image: prom/blackbox-exporter:latest restart: unless-stopped ports: - "9115:9115" command: - '--config.file=/config/blackbox.yml' volumes: - /mnt/docker-data/configs/blackbox:/config:ro logging: driver: "json-file" options: max-size: "50m" max-file: "3" deploy: mode: replicated replicas: 1 placement: constraints: - node.hostname == hf-pdocker-01 resources: limits: memory: 128M volumes: alertmanager-data: