Phoenix Deploy API: alert webhook, .env.example, Site24x7 and E2E docs
Some checks failed
Deploy to Phoenix / deploy (push) Has been cancelled

- PHOENIX_ALERT_WEBHOOK_URL: POST on alerts when firing
- .env.example: PROXMOX_*, PROMETHEUS_*, webhooks, partner keys
- PHOENIX_SITE24X7_API_KEYS.md: how to issue API keys for Site24x7
- PHOENIX_E2E_PORTAL_API_RAILING.md: E2E test steps and references

Made-with: Cursor
This commit is contained in:
defiQUG
2026-03-11 13:00:53 -07:00
parent 3e9645274a
commit c05aa50e27
4 changed files with 108 additions and 14 deletions

View File

@@ -319,13 +319,27 @@ app.get('/api/v1/health/metrics', async (req, res) => {
/**
* GET /api/v1/health/alerts — Active alerts (stub or Alertmanager; optional PROMETHEUS_ALERTS_URL)
* Optional: POST to PHOENIX_ALERT_WEBHOOK_URL when alerts exist (partner notification).
*/
const PHOENIX_ALERT_WEBHOOK_URL = process.env.PHOENIX_ALERT_WEBHOOK_URL || '';
const PHOENIX_ALERT_WEBHOOK_SECRET = process.env.PHOENIX_ALERT_WEBHOOK_SECRET || '';
app.get('/api/v1/health/alerts', async (req, res) => {
const alertsUrl = process.env.PROMETHEUS_ALERTS_URL || `${PROMETHEUS_URL}/api/v1/alerts`;
try {
const data = await fetch(alertsUrl).then((r) => r.json()).catch(() => ({ data: { alerts: [] } }));
const alerts = data.data?.alerts ?? data.alerts ?? [];
res.json({ alerts: Array.isArray(alerts) ? alerts : [], stub: !process.env.PROMETHEUS_URL });
const payload = { alerts: Array.isArray(alerts) ? alerts : [], stub: !process.env.PROMETHEUS_URL };
res.json(payload);
if (PHOENIX_ALERT_WEBHOOK_URL && payload.alerts.length > 0) {
const body = JSON.stringify({ event: 'alerts.fired', alerts: payload.alerts, at: new Date().toISOString() });
const sig = PHOENIX_ALERT_WEBHOOK_SECRET ? crypto.createHmac('sha256', PHOENIX_ALERT_WEBHOOK_SECRET).update(body).digest('hex') : '';
fetch(PHOENIX_ALERT_WEBHOOK_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json', ...(sig && { 'X-Phoenix-Signature': `sha256=${sig}` }) },
body,
}).catch((e) => console.error('[alert-webhook]', e.message));
}
} catch (err) {
res.json({ alerts: [], stub: true, message: err.message });
}