Volver al inicio

Servidor de Alertas Pusk 16 MB en Go

Pusk — servidor de alertas autoalojado compacto en Go de 16 MB. Soporta migración de bot de Telegram, ACK con silencio en Alertmanager, WebSocket para NAT. Funciona sin DBs externas, con PWA y notificaciones push.

Pusk: servidor de alertas de 16 MB sin dependencias
Advertisement 728x90

Pusk: Un Servidor de Alertas Autohospedado de 16 MB Construido en Go

Pusk es una solución autohospedada que elimina la dependencia de plataformas de mensajería externas para la monitorización. Un único ejecutable de 16 MB soporta 13 métodos de la API de Bot de Telegram, WebSocket, Web Push y un cliente PWA. Funciona sin PostgreSQL ni otras bases de datos—solo SQLite en Go puro. Diseñado para escenarios donde las APIs externas no están disponibles debido a límites, bloqueos o aislamiento.

La arquitectura excluye servicios externos. Se eligió Go por sus compilaciones rápidas (7 segundos) y su net/http integrado. La base de datos utiliza modernc.org/sqlite sin CGO, con un RSS de ~4 MB al inicio. El registro se maneja mediante slog en formato JSON o texto.

¿Por Qué No Mensajeros Estándar?

Las alternativas requieren migraciones, bases de datos y recursos significativos:

Google AdInline article slot

| Plataforma | Dependencias | Compatibilidad con Bots | ACK | RAM |

|-----------|-------------|---------------------|-----|-----|

| Mattermost | PostgreSQL, SMTP | Requiere reescritura | Plugin | 500+ MB |

Google AdInline article slot

| Matrix | Synapse, PostgreSQL | Requiere reescritura | No | 500+ MB |

| Telegram | Nube | — | No | — |

Gotify/ntfy ofrecen solo notificaciones push sin chat o ACK. Usar una VPN para Telegram añade puntos de fallo. Pusk emula la API de Bot: cambia la base_url en tu bot, y funciona con tu infraestructura.

Google AdInline article slot

Estructura del Binario

pusk (16 MB, ~6600 líneas de Go, 110 tests)
├── Bot API    — /bot/<token>/<method>  (13 de 80+ métodos de la API de Bot de Telegram)
├── Client API — /api/*                 (backend PWA)
├── WebSocket  — /api/ws                (estados en tiempo real, escritura)
├── Web Push   — FCM / Mozilla          (notificaciones sin sondeo)
├── Archivos   — /file/<id>             (multimedia)
├── PWA        — /                      (cliente web)
└── SQLite     — data/orgs/*/pusk.db    (DB separada para cada organización)

Métodos soportados: sendMessage, editMessageText, deleteMessage, answerCallbackQuery, sendPhoto, sendDocument, sendVoice, sendVideo, setWebhook, deleteWebhook, getWebhookInfo, getMe, getUpdates.

Middleware para compatibilidad:

func TelegramCompat(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        p := r.URL.Path
        if strings.HasPrefix(p, "/bot") && !strings.HasPrefix(p, "/bot/") {
            r.URL.Path = "/bot/" + p[4:]
        }
        next.ServeHTTP(w, r)
    })
}

Migrando desde python-telegram-bot:

# Antes:
app = ApplicationBuilder().token(TOKEN).build()

# Después:
app = ApplicationBuilder().token(TOKEN).base_url("https://pusk.internal/bot").build()

Long Polling y Entrega de Actualizaciones

/getUpdates mantiene una conexión durante segundos de timeout, considera el offset, con una cola en memoria (100 actualizaciones/bot). Al reiniciar, el bot recibe alertas posteriores sin persistencia.

Para bots detrás de NAT—relé WebSocket:

import websockets, json, asyncio

async def relay():
    async with websockets.connect("wss://pusk.internal/bot/TOKEN/relay") as ws:
        async for msg in ws:
            update = json.loads(msg)
            print(update["message"]["text"])

asyncio.run(relay())

Selección automática: webhook (con protección SSRF), relé (limitado a 30 msg/min), o getUpdates.

SQLite por Organización y Copia de Seguridad en Caliente

Cada organización tiene un pusk.db separado en modo WAL. No bloquea lectores durante escrituras. Copia de seguridad: sqlite3 pusk.db ".backup backup.db". Adecuado para decenas de mensajes/min sin JOINs de PostgreSQL.

Flujo de Trabajo

  • El administrador inicia el servidor (docker run o binario), crea una organización—genera #general y un bot del sistema.
  • Invitación mediante enlace (7 días, hasta 50 personas), notificación automática en el chat.
  • Crear #alertas, webhook desde Zabbix/Grafana/Alertmanager (?format=alertmanager).
  • Guardia: push/WebSocket, botón ACK, todo el equipo ve el estado.

Roles:

  • Administrador: Derechos completos + gestión de usuarios/canales.
  • Miembro: Chat, ACK, archivos, @mención.

Mejoras para Alertas

  • ACK → Silencio: POST /api/v2/silences a Alertmanager mediante PUSK_ALERTMANAGER_URL.
  • Colores: Franja roja/verde para activas/resueltas.
  • Optimización de push: Si WebSocket está activo y el canal abierto, omitir push.
  • Aislamiento: Frontend integrado, sin CDN. Web Push requiere FCM/Mozilla.

Características Clave

  • Binario único de 16 MB sin dependencias externas, SQLite en Go.
  • Emulación parcial de la API de Bot de Telegram para migración sin reescritura.
  • ACK con silenciamiento automático para Alertmanager, indicadores de estado codificados por color.
  • Relé WebSocket para NAT, límites de tasa, protección SSRF.
  • PWA con push, roles administrador/miembro, aislamiento por org.db.

— Editorial Team

Advertisement 728x90

Leer después