# Monitoring profile (H2 production-readiness): Prometheus collectors + # Grafana dashboard + alert rules for the private self-hosted deployment. # Optional overlay: docker compose -f docker-compose.yml -f docker-compose.monitoring.yml up -d # Requires GRAFANA_ADMIN_PASSWORD in the environment. Add docker-compose.alerting.yml # for optional operator notifications; see docs/OPERATIONS.md. services: prometheus: image: prom/prometheus:v3.15.0@sha256:efd719c99d83b060d9daefdcf00360461adf279f45ef5391f8d111892118753e container_name: ${CONTAINER_PREFIX:-novel}-prometheus volumes: - ./infra/monitoring/prometheus.yml:/etc/prometheus/prometheus.yml:ro - ./infra/monitoring/alerts.yml:/etc/prometheus/alerts.yml:ro networks: - novel-net restart: unless-stopped logging: driver: local healthcheck: test: [CMD, wget, -q, --spider, http://127.0.0.1:9090/-/healthy] interval: 5s timeout: 3s retries: 10 grafana: image: grafana/grafana:13.2.2-ubuntu@sha256:9a68a82ec38931e1baacee5d471cf74aa42565eb49554caa5290663529de6941 container_name: ${CONTAINER_PREFIX:-novel}-grafana environment: GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_ADMIN_PASSWORD:?GRAFANA_ADMIN_PASSWORD must be set for the monitoring profile} GF_AUTH_ANONYMOUS_ENABLED: "false" ports: - "${GRAFANA_HTTP_PORT:-127.0.0.1:13000}:3000" volumes: - ./infra/monitoring/grafana/provisioning:/etc/grafana/provisioning:ro - ./infra/monitoring/grafana/dashboards:/var/lib/grafana/dashboards:ro networks: - novel-net restart: unless-stopped logging: driver: local