Contexto
El Máster de CreaRack (sesión 94) destapó 6 GAPS de severidad ALTA en la arquitectura de PROD. Hito A ataca el GAP #3: observabilidad de PROD endeble.
Hasta esta decisión, la única alarma real era UptimeRobot externo (GET /health). Una app que se degrada por dentro (lentitud, errores 5xx, memoria alta, errores de DB) pero sigue respondiendo “ok” a la salud no disparaba nada.
Hallazgo clave
Se descubrió que las 5 reglas de alerta en observability/victoriametrics/alerts.yml dependen de métricas (up, django_http_*, process_*) que solo existen vía scrape de /metrics. En PROD, la VM de VictoriaMetrics corre sin scrape configurado:
- Solo recibe push de
MetricsWriter(ping/SNMP/HTTP de targets de clientes). - Ninguna métrica de salud de la app Django (CPU, memoria, errores, latencia).
- Por tanto, las reglas de alerta no tienen qué evaluar.
Decisión
Activar el alerting interno de PROD mediante 3 piezas:
- Scrape de
/metricsen la VM de VictoriaMetrics (compose.prod.yml). - Servicio vmalert: evalúa las 5 reglas contra las métricas cada 30s.
- Servicio Alertmanager: entrega avisos por email a
logcrearack@esfericlabs.comvía Resend SMTP.
Esto no es “descomentar vmalert” — cada pieza es necesaria.
Implementación
- ✅
compose.prod.yml— añadido scrape (scrape.yml), servicios vmalert y alertmanager. - ✅
compose.observability.yml— reescrito bloque vmalert (estaba comentado con paths erróneos), añadido alertmanager para parity local. - ✅
observability/alertmanager/alertmanager.yml(nuevo) — router SMTP a Resend, remitente verificado en crearack.com, destinatario infra. - ✅
.gitignore— excluida la clave API de Resend (smtp_password). - ✅
observability/victoriametrics/alerts.yml— ajustado umbral HighMemoryUsage: 1GB → 3GB (PROD es 16GB, Daphne bajo carga legítimamente usa >1GB).
Validación smoke (local E2E)
- vmalert carga las 5 reglas desde
/etc/alerts/alerts.yml. - Con
up==0, disparaCreaRackDowninmediatamente. - El estado de la alerta llega a Alertmanager (
state=active). - Alertmanager intenta conectar al SMTP de Resend, responde
535(auth fallida por key dummy → cableado OK).
Solo falta la key real de Resend para que el email salga en STAGE/PROD.
Despliegue (acción operacional)
Antes de activar en STAGE y PROD:
- Crear el fichero
files/smtp_passworden cada Dokploy (STAGE y PROD) con la clave de Resend en una línea. - Montar en el contenedor alertmanager como volumen read-only en
/etc/alertmanager/smtp_password. - Confirmar que:
- El dominio
crearack.comestá verificado en Resend. - El remitente
noreply@crearack.comes válido. - El destinatario
logcrearack@esfericlabs.comexiste.
- El dominio
Sin esto, Alertmanager no enviará.
Roadmap del Plan Hardening (visión global)
| Hito | Gap | Qué | Riesgo | Estado |
|---|---|---|---|---|
| A | #3 | Alerting de PROD: scrape + vmalert + notificador | Bajo | ✅ Completo |
| B | #6 | Honestidad Signage: vendors sin push real | Bajo | ⬜ |
| C | #4 | Portero global: auth= global + públicos explícitos | Medio | ⬜ |
| D | #1 | RLS de escritura: WITH CHECK en 33 políticas | Medio | ⬜ |
| E | #2 | Cifrado: key dedicada + re-cifrado | Alto | ⬜ |
| F | #5 | Auto-Plan: validación de “100%” | Depende | ⬜ |
Regla: cada hito cierra ENTERO en su sesión (código + tests + smoke STAGE + doc). Nada a medias. Edu aplica deploys/migraciones.
Véase también
- [[feature—observability—alerting-prod-s95]]
- [[entity—observability—service—vmalert]]
- [[entity—observability—service—alertmanager]]
- [[concept—saas—observability]]
- [[runbook—observability—alerting-setup]]
Referenciado desde
- Entidad: Alertmanager — enrutador y notificador de alertas por email
- Entidad: vmalert — evaluador de reglas de alerta en tiempo real
- Feature: Alerting de PROD — avisos cuando algo va mal por dentro
- Grounding gate + triage reforzado en el archivero (PR1/4 hardening escritas)
- Runbook: Setup de Alerting en Dokploy (STAGE y PROD)