Alertas Push — ntfy.sh
Canal de alertas push para equipe técnica/admin via ntfy.sh
1. Visão Geral
O sistema utiliza ntfy.sh como canal complementar de alertas push para a equipe técnica. Não substitui WhatsApp (que continua para alertas a gestores de escola).
Características:
- Zero dependências (puro HTTP fetch)
- Sem infra própria (SaaS gratuito)
- Sem autenticação por token (segurança via tópico secreto)
- Graceful degradation: se
NTFY_TOPICnão configurado, alertas são ignorados silenciosamente
2. Setup
2.1 Instalar o app ntfy
- Android: Google Play ou F-Droid
- iOS: App Store
- Desktop: Web app
2.2 Gerar tópico secreto
bash
# Gerar hash de alta entropia (32 caracteres hex)
openssl rand -hex 16
# Exemplo: a7f3b2c9e1d4f6a8b3c5d7e9f1a2b4c62.3 Configurar secret no Supabase
Adicionar NTFY_TOPIC nos secrets do Supabase com o hash gerado acima.
2.4 Inscrever no tópico
No app ntfy, inscrever-se no tópico usando o mesmo hash:
- Abrir o app
- Tocar em "+" (adicionar assinatura)
- Colar o hash como nome do tópico
- Salvar
3. Gatilhos de Alerta
| Evento | Prioridade | Tags | Origem | Cooldown |
|---|---|---|---|---|
| CRON Faturamento falha crítica (3x) | urgent | ⚠️💀 | faturamento-cron | N/A |
| CRON Manutenção falha crítica (3x) | urgent | ⚠️💀 | maintenance-cron | N/A |
| Sessão WhatsApp desconectada | urgent | 💸⚠️ | maintenance-cron | 24h |
| Token revogado reutilizado (não-logout) | high | 🚔⚠️ | auth-helpers.ts | N/A |
| Lockout Tier 2 (6+ falhas, 10min) | high | ⚠️🔒 | portal-escola | 5min |
| Lockout Tier 3 (10+ falhas, 60min) | urgent | 🚨💀 | portal-escola | 5min |
| Burst bloqueado (150 req/5s) | urgent | 🔥🤖 | portal-escola | 5min |
| Rate limit escola 100% | high | ⛔🏫 | portal-escola | 15min |
| Rate limit escola 70% (pico) | high | ⚠️📈 | portal-escola | 15min |
| Rate limit OTP aluno esgotado | high | ⚠️💸 | portal-escola | 15min |
| Rate limit OTP responsável esgotado | high | ⚠️💸 | portal-escola | 15min |
4. Helper: _shared/ntfy-helper.ts
typescript
import { enviarAlertaPush } from '../_shared/ntfy-helper.ts';
await enviarAlertaPush({
titulo: 'Título do Alerta',
mensagem: 'Descrição detalhada do que aconteceu.',
prioridade: 'high', // min | low | default | high | urgent
tags: ['warning'], // emojis ntfy
});Regras de uso
- SEMPRE usar
await— Deno Deploy pode podar a execução se fire-and-forget - NUNCA propagar exceções — O helper já tem try/catch interno
- Não usar como substituto de SMS — Canal complementar para equipe técnica
- Títulos DEVEM ser ASCII puro — Emojis/unicode no campo
titulocausamTypeError: not a valid ByteStringno Deno. O helper aplicasanitizeForHeader()automaticamente como defesa em profundidade, mas prefira usar texto ASCII e representar emojis viatags(ex:['rotating_light', 'warning'])
5. Segurança
- O tópico ntfy funciona como "senha" — quem não sabe o nome não recebe
- Usar hash de alta entropia (
openssl rand -hex 16) - Não expor o tópico em logs, código-fonte ou documentação pública
- Futuro: adicionar
NTFY_TOKENpara ACL se necessário
6. Prioridades ntfy
| Prioridade | Comportamento no celular |
|---|---|
min | Sem som, sem vibração |
low | Sem som |
default | Som padrão |
high | Som alto, vibração longa |
urgent | Som persistente, vibração contínua, bypassa Não Perturbe |
Referências
supabase/functions/_shared/ntfy-helper.ts— Helper centralizado- ntfy.sh docs — Documentação oficial
- ntfy.sh security — Controle de acesso