Webhook Alerts
Native webhook delivery for alerts - Slack, Discord, Microsoft Teams, ntfy, or a generic JSON endpoint. Sits parallel to the existing Email / Apprise / Ntfy integrations: pick whichever fits the team's incident workflow.
Supported Targets
Slack
Posts to an Incoming Webhook URL. Severity-styled attachments (red / orange / yellow / green), markdown formatting, deep-links back to the affected resource in PegaProx.
Discord
Discord webhooks/{id}/{token}. Embed-style payload with color sidebar matching severity, alert title, fields for cluster / node / VMID, footer with timestamp.
Microsoft Teams
Office 365 connector / Adaptive Card payload. Compatible with the new Teams Workflows webhook URLs (the old outlook.office.com/webhook/... endpoint and the new prod-XX.westeurope.logic.azure.com URLs).
ntfy
Posts to https://ntfy.sh/<topic> or self-hosted. Supports priority headers, click action, attachment URL.
Generic JSON
POSTs a flat JSON body to any URL. Useful for in-house bots, PagerDuty events v2, OpsGenie, or a webhook receiver in n8n / Make / Zapier.
Payload Shape (Generic JSON)
{
"alert_id": "evt_2026042619_aa12",
"severity": "critical",
"title": "Node pve3 unreachable",
"message": "SSH probe to 10.10.0.13:22 timed out for 3 consecutive checks.",
"cluster_id": "homelab",
"cluster_name": "HomeLab",
"node": "pve3",
"vmid": null,
"timestamp": "2026-04-26T19:42:11Z",
"deep_link": "https://pegaprox.local/#/clusters/homelab/nodes/pve3",
"labels": { "rack": "A1", "site": "FRA" },
"source": "PegaProx",
"version": "0.9.8"
}
Reliability
- Timeout: 6 s per POST - keeps a slow webhook from stalling the alert pipeline.
- Isolation: each channel is sent in its own try/except, so one dead webhook cannot block the others.
- SSRF protection: the URL is checked: loopback, link-local and private addresses (10.x, 172.16-31.x, 192.168.x and, from 1.4.0, 100.64.0.0/10) are refused. There is no switch for an internal webhook target yet. See Outbound Requests and Private Addresses.
- Secret redaction: webhook URLs whose path embeds a secret (Slack
services/…, Discordapi/webhooks/…, Teams, Splunk HEC) are redacted from log output. From 1.3 an ntfy topic is masked too, in the channel list and in the log.
Access
- Channels are installation-wide, so creating, changing and deleting them needs
admin.settings. Reading the masked list stays onalert.manage. - From 1.3, sending a test message to a channel needs
admin.settingsas well.
Which events raise alerts (thresholds and, from 1.3, failed tasks, Ceph, replication, ZFS, old snapshots, guests without backup, rolling updates) is described under Automation & Scheduling.