Notificaciones
Zenavo envía un correo a tu equipo cuando algo requiere atención, para que no tengas que tener la consola abierta, y puede publicar las mismas alertas en Slack, Discord, Telegram o tu propio webhook.
Eventos
| Evento | Cuándo se envía |
|---|---|
| Deployment failed | Un despliegue o una reversión no terminó. El correo indica si falló al compilar un servicio o al desplegarlo. |
| Server setup failed | La configuración o reinstalación de un servidor no terminó. El correo da el motivo y hasta cuándo se guardan las credenciales SSH para reintentarlo. |
| Service suspended | Un servicio se reinició más veces que su límite de fallos y se detuvo. |
| Server offline | Un servidor no respondió a 3 comprobaciones de estado seguidas (unos 3 minutos). Llega un segundo correo cuando vuelve a responder. |
| Disk or memory almost full | El disco de un servidor supera el 90 %, o su memoria se mantiene por encima del 90 % durante 3 comprobaciones seguidas. Puede volver a avisar cuando el uso baja del 85 %. |
| New SSH login source | Una dirección IP inició sesión por SSH en uno de los servidores del equipo por primera vez. Es normal si acabas de conectarte desde otra red; si no, es una señal de alarma. |
| Usage limit | La transferencia de imágenes del equipo llegó al 80 % o al 100 % de lo que permite el periodo de facturación. Al 100 %, los servidores dejan de descargar imágenes nuevas. |
Cada alerta se envía como mucho una vez por hora para el mismo proyecto, servicio o servidor. Un corte breve de una o dos comprobaciones no envía nada.
Los correos de seguridad sobre tu propia cuenta (inicios de sesión desde dispositivos nuevos, inicios de sesión de la CLI aprobados, claves de API nuevas) se describen en Seguridad. Solo te llegan a ti, están activados por defecto para todos los roles y aparecen en Security en la página de notificaciones.
Quién los recibe
Los correos van a los miembros del equipo propietario del proyecto o del servidor:
- Propietarios y administradores reciben todos los eventos hasta que los desactiven.
- Miembros no reciben nada hasta que activen eventos.
- Viewers nunca reciben notificaciones.
Elige tus eventos en Account settings → Notifications. La elección es por cuenta y se aplica a todos los equipos a los que perteneces.
Qué contiene un correo
El nombre del proyecto, servicio o servidor, la hora (UTC) y un enlace a él en la consola. Los correos nunca contienen valores de variables, secretos, comandos ni texto de registros. Abre la consola para leer los registros.
Canales
Los administradores del equipo también pueden enviar las notificaciones del equipo a aplicaciones de chat y webhooks: Account settings → Notifications → Team channels, para el equipo seleccionado en la barra lateral. Cada canal elige sus eventos; además de los de arriba, los canales pueden recibir Deployment succeeded (que nunca se envía por correo). Los canales reciben las mismas alertas que el correo, con el mismo límite de una por hora, y no dependen de los ajustes de correo de nadie.
| Canal | Qué necesitas |
|---|---|
| Slack | Una URL de webhook entrante del canal (https://hooks.slack.com/services/…). |
| Discord | Un webhook del canal: ajustes del canal → Integraciones → Webhooks (https://discord.com/api/webhooks/…). |
| Telegram | Un token de bot de @BotFather y el ID del chat (un número como -1001234567890, o el @username de un canal público). Añade antes el bot al chat. |
| Webhook | Cualquier URL https://. Zenavo le envía JSON por POST, firmado (ver abajo). |
Test envía un mensaje en el momento y muestra si llegó. Cada canal muestra su última entrega, o por qué falló; las entregas fallidas se reintentan tres veces en unos 13 minutos. Hasta 20 canales por equipo.
Las URL de webhook y los tokens de bot son secretos: se guardan cifrados y la consola solo muestra su host o chat. Zenavo solo envía a hosts cuyas direcciones son todas públicas, y no sigue redirecciones.
Contenido del webhook
{
"type": "deploy_failed",
"team_id": "team_…",
"subject": "Deployment failed: shop",
"text": "The deployment of project \"shop\" failed at 2026-10-19 08:12 UTC.\nIt failed while building service \"web\".\n",
"url": "https://zenavo.app/projects/proj_…/deployments/job_…",
"time": "2026-10-19T08:12:03Z"
}type es uno de deploy_failed, deploy_succeeded, service_suspended, server_offline (también se envía cuando el servidor vuelve), server_resources, usage_limit o test. Cualquier respuesta 2xx cuenta como entregada.
Cada petición lleva X-Zenavo-Event, X-Zenavo-Timestamp (segundos Unix) y X-Zenavo-Signature: v1=<hex>, el HMAC-SHA256 de <timestamp>.<cuerpo sin procesar> con el secreto de firma del canal. El secreto (whsec_…) se muestra una vez al añadir el webhook; Edit no puede volver a mostrarlo, pero puedes rotarlo a través de la API. Verifica la firma sobre los bytes sin procesar y rechaza las marcas de tiempo antiguas:
import crypto from 'node:crypto'
function verify(rawBody, headers, secret) {
const ts = headers['x-zenavo-timestamp']
const expected = 'v1=' + crypto.createHmac('sha256', secret).update(`${ts}.${rawBody}`).digest('hex')
const given = headers['x-zenavo-signature'] ?? ''
const fresh = Math.abs(Date.now() / 1000 - Number(ts)) < 300
const a = Buffer.from(given), b = Buffer.from(expected)
return fresh && a.length === b.length && crypto.timingSafeEqual(a, b)
}