Grafana — Pinbox24 Operations Dashboard

Dashboard UID: pinbox24-ops File: monitoring/grafana/provisioning/dashboards/pinbox24-operations.json Provisioned: automatically by Grafana on startup (path /etc/grafana/provisioning/dashboards)


What the Dashboard Covers

Single pane of glass for the Pinbox24 production stack across all four OVH Kimsufi bare-metal servers.

SectionPanelsSource
Server health — bms-1CPU %, RAM %, Disk % + bms-1 warningPrometheus node_exporter
Server health — bms-2CPU %, RAM %, Disk %Prometheus node_exporter
Server health — bms-3CPU %, RAM %, Disk %Prometheus node_exporter
Server health — bms-4CPU %, RAM %, Disk %Prometheus node_exporter
Docker w3 groupMemory + CPU timeseries (Pinbox24 v31/v32, nginx-proxy, mailgun, pdf-gen, wkhtml, git-deploy)cAdvisor on bms-4
Docker w4 groupMemory + CPU timeseries (Pinbox24 v41/v42)cAdvisor on bms-4
MongoDB rs0Member states + replication lagmongodb_exporter on bms-4
BackupsSupabase + n8n Cloud backup age, workflow countsbackup-exporter :9220
Credential rotationOverdue count + days overdue per credentialcredential-exporter :9230
Open incidentsTable: title, service, server, created_at, acknowledged_by (live — queries incidents table)Supabase PostgreSQL

Data Sources Required

Data SourceTypeUID in GrafanaNotes
Thanos Query (Prometheus)PrometheusprometheusAlready configured — infra metrics
Supabase PostgreSQLPostgreSQL(future, after #726)dev_r_incidents table

Server Coverage — node_exporter

All four BMS servers have node_exporter scraped by Prometheus at port 9100:

ServerIPPrometheus instance label
bms-1 (Pinbox24 prod)94.23.26.11394.23.26.113:9100
bms-2 (MongoDB PRIMARY)145.239.133.104145.239.133.104:9100
bms-3 (MongoDB SECONDARY + staging)51.68.155.22451.68.155.224:9100
bms-4 (MongoDB arbiter + n8n)54.36.123.11054.36.123.110:9100

Known Gaps

1. cAdvisor on bms-1 and bms-3

cAdvisor is currently only deployed on bms-4 (port 8080). The Pinbox24 w3/w4 containers run on bms-1 and bms-3 — these servers have no cAdvisor. Docker container panels will show No Data for bms-1 and bms-3 until cAdvisor is deployed there.

Follow-up: create an issue to deploy cAdvisor as a Docker container on bms-1 and bms-3, add scrape targets to monitoring/prometheus/prometheus.yml.

2. mongodb_exporter coverage

mongodb_exporter containers run on bms-4 (ports 9216/9217) and scrape bms-2 (PRIMARY) and bms-3 (SECONDARY). The MongoDB rs0 panels use mongodb_rs_members_state and mongodb_rs_members_optimeDate. These metrics are already available — panels should work immediately.

bms-4 (arbiter) is excluded — MongoDB arbiters do not replicate users and prometheus cannot authenticate to an arbiter.

3. Open incidents strip

The open incidents panel queries the incidents table via the Supabase PostgreSQL datasource (uid: supabase). It shows up to 20 open incidents ordered by created_at DESC. Columns: title, service, server, created_at, acknowledged_by.

If the incidents table does not yet exist (before issue #726 is fully deployed), Grafana will show a “relation does not exist” error in this panel only — all other panels are unaffected.

4. bms-1 persistent warnings

bms-1 has a dedicated warning text panel:

  • Ubuntu 20.04.1 LTS is EOL — upgrade required
  • Disk was 100% full (cleaned 2026-06-18) — monitor closely

How to Reload / Deploy

After merging to dev and pulling on vps-i1:

ssh root@217.154.82.162 \
  "cd /opt/p24-infra && git pull && \
   cd monitoring && docker compose restart grafana"

Grafana auto-provisions dashboards from /etc/grafana/provisioning/dashboards (mapped from monitoring/grafana/provisioning/dashboards/) with updateIntervalSeconds: 30, so a full restart is not strictly required after the first load — Grafana polls every 30s.


Thresholds

MetricYellowRed
CPU %70%85%
RAM %70%90%
Disk %70%85%
Backup age25 h49 h
Credential days overdue60 d90 d
MongoDB replication lag30 s120 s