services: prometheus: image: prom/prometheus:v3.7.1@sha256:ff7e389acbe064a4823212a500393d40a28a8f362e4b05cbf6742a9a3ef736b2 profiles: ["observability"] entrypoint: ["/bin/sh", "-ec"] command: - >- sed "s|__METRICS_BEARER_TOKEN__|$${METRICS_BEARER_TOKEN}|g" /etc/prometheus/template.yml > /tmp/prometheus.yml && exec /bin/prometheus --config.file=/tmp/prometheus.yml --storage.tsdb.retention.time=30d --web.enable-lifecycle environment: METRICS_BEARER_TOKEN: ${METRICS_BEARER_TOKEN:?Set the private metrics bearer token} volumes: - ./deploy/observability/prometheus.yml:/etc/prometheus/template.yml:ro - ./deploy/observability/alerts.yml:/etc/prometheus/alerts.yml:ro - mobilityops-prometheus:/prometheus ports: - "127.0.0.1:19090:9090" healthcheck: test: ["CMD", "wget", "-q", "-O", "/dev/null", "http://127.0.0.1:9090/-/ready"] interval: 15s timeout: 5s retries: 10 restart: unless-stopped networks: [mobilityops] alertmanager: image: prom/alertmanager:v0.33.1@sha256:9e082985f56f4c8c9f724e18f2288c6708f472e56a5286b8863d080434ea065d profiles: ["observability"] entrypoint: ["/bin/sh", "-ec"] command: - >- sed -e "s|__WEBHOOK_URL__|$${ALERTMANAGER_WEBHOOK_URL}|g" -e "s|__WEBHOOK_TOKEN__|$${MOBILITYOPS_WEBHOOK_TRIGGER_TOKEN}|g" /etc/alertmanager/template.yml > /tmp/alertmanager.yml && exec /bin/alertmanager --config.file=/tmp/alertmanager.yml --storage.path=/alertmanager environment: ALERTMANAGER_WEBHOOK_URL: ${ALERTMANAGER_WEBHOOK_URL:-https://n8n.itworx.tech/webhook/mobilityops-alerts} MOBILITYOPS_WEBHOOK_TRIGGER_TOKEN: ${MOBILITYOPS_WEBHOOK_TRIGGER_TOKEN:?Set the n8n webhook trigger token} volumes: - ./deploy/observability/alertmanager.yml:/etc/alertmanager/template.yml:ro - mobilityops-alertmanager:/alertmanager ports: - "127.0.0.1:19093:9093" healthcheck: test: ["CMD", "wget", "-q", "-O", "/dev/null", "http://127.0.0.1:9093/-/ready"] interval: 15s timeout: 5s retries: 10 restart: unless-stopped networks: [mobilityops] grafana: image: grafana/grafana:12.2.0@sha256:74144189b38447facf737dfd0f3906e42e0776212bf575dc3334c3609183adf7 profiles: ["observability"] environment: GF_SECURITY_ADMIN_USER: ${GRAFANA_ADMIN_USER:-admin} GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_ADMIN_PASSWORD:-change-me-before-start} GF_USERS_ALLOW_SIGN_UP: "false" GF_AUTH_ANONYMOUS_ENABLED: "false" volumes: - ./deploy/observability/grafana/provisioning:/etc/grafana/provisioning:ro - ./deploy/observability/grafana/dashboards:/var/lib/grafana/dashboards:ro - mobilityops-grafana:/var/lib/grafana ports: - "127.0.0.1:13000:3000" healthcheck: test: ["CMD-SHELL", "wget -q -O - http://127.0.0.1:3000/api/health | grep -Eq '\"database\"[[:space:]]*:[[:space:]]*\"ok\"'"] interval: 15s timeout: 5s retries: 20 depends_on: [prometheus, alertmanager] restart: unless-stopped networks: [mobilityops] volumes: mobilityops-prometheus: mobilityops-grafana: mobilityops-alertmanager: