Retour à l'accueil

Serveur d'alertes Pusk 16 MB sur Go

Pusk — serveur d'alertes auto-hébergé compact sur Go de 16 MB. Prend en charge la migration de bot Telegram, ACK avec silence dans Alertmanager, WebSocket pour NAT. Fonctionne sans DB externes, avec PWA et notifications push.

Pusk : serveur d'alertes de 16 MB sans dépendances
Advertisement 728x90

Pusk : un serveur d'alerte auto-hébergé de 16 Mo construit en Go

Pusk est une solution auto-hébergée qui élimine la dépendance aux plateformes de messagerie externes pour la surveillance. Un exécutable unique de 16 Mo prend en charge 13 méthodes de l'API Bot Telegram, WebSocket, Web Push et un client PWA. Il fonctionne sans PostgreSQL ni autres bases de données — uniquement SQLite en Go pur. Conçu pour les scénarios où les API externes sont indisponibles en raison de limites, de blocages ou d'isolement.

L'architecture exclut les services externes. Go a été choisi pour ses compilations rapides (7 secondes) et son net/http intégré. La base de données utilise modernc.org/sqlite sans CGO, avec un RSS d'environ 4 Mo au démarrage. La journalisation est gérée via slog en format JSON ou texte.

Pourquoi pas les messageries standard ?

Les alternatives nécessitent des migrations, des bases de données et des ressources importantes :

Google AdInline article slot

| Plateforme | Dépendances | Compatibilité Bot | ACK | RAM |

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

| Mattermost | PostgreSQL, SMTP | Réécriture requise | Plugin | 500+ Mo |

Google AdInline article slot

| Matrix | Synapse, PostgreSQL | Réécriture requise | Non | 500+ Mo |

| Telegram | Cloud | — | Non | — |

Gotify/ntfy n'offrent que des notifications push sans chat ni ACK. Utiliser un VPN pour Telegram ajoute des points de défaillance. Pusk émule l'API Bot : changez le base_url dans votre bot, et il fonctionne avec votre infrastructure.

Google AdInline article slot

Structure du binaire

pusk (16 Mo, ~6600 lignes de Go, 110 tests)
├── API Bot    — /bot/<token>/<method>  (13 des 80+ méthodes de l'API Bot Telegram)
├── API Client — /api/*                 (backend PWA)
├── WebSocket  — /api/ws                (statuts en temps réel, saisie)
├── Web Push   — FCM / Mozilla          (notifications sans interrogation)
├── Fichiers   — /file/<id>             (médias)
├── PWA        — /                      (client web)
└── SQLite     — data/orgs/*/pusk.db    (base de données séparée pour chaque organisation)

Méthodes prises en charge : sendMessage, editMessageText, deleteMessage, answerCallbackQuery, sendPhoto, sendDocument, sendVoice, sendVideo, setWebhook, deleteWebhook, getWebhookInfo, getMe, getUpdates.

Middleware pour la compatibilité :

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)
    })
}

Migration depuis python-telegram-bot :

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

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

Long Polling et livraison des mises à jour

/getUpdates maintient une connexion pendant timeout secondes, tient compte de l'offset, avec une file d'attente en mémoire (100 mises à jour/bot). Au redémarrage, le bot reçoit les alertes suivantes sans persistance.

Pour les bots derrière NAT — relais 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())

Sélection automatique : webhook (avec protection SSRF), relais (limité à 30 msg/min), ou getUpdates.

SQLite par organisation et sauvegarde à chaud

Chaque organisation a une pusk.db séparée en mode WAL. Ne bloque pas les lecteurs pendant les écritures. Sauvegarde : sqlite3 pusk.db ".backup backup.db". Adapté à des dizaines de messages/min sans JOIN PostgreSQL.

Flux de travail

  • L'administrateur démarre le serveur (docker run ou binaire), crée une organisation — génère #general et un bot système.
  • Invitation via lien (7 jours, jusqu'à 50 personnes), notification automatique dans le chat.
  • Créez #alerts, webhook depuis Zabbix/Grafana/Alertmanager (?format=alertmanager).
  • Garde : push/WebSocket, bouton ACK, toute l'équipe voit le statut.

Rôles :

  • Administrateur : Droits complets + gestion utilisateurs/canaux.
  • Membre : Chat, ACK, fichiers, @mention.

Améliorations pour l'alerte

  • ACK → Silence : POST /api/v2/silences vers Alertmanager via PUSK_ALERTMANAGER_URL.
  • Couleurs : Bande rouge/verte pour déclenché/résolu.
  • Optimisation push : Si WebSocket est actif et canal ouvert, sauter le push.
  • Isolement : Frontend intégré, pas de CDN. Web Push nécessite FCM/Mozilla.

Fonctionnalités clés

  • Binaire unique de 16 Mo sans dépendances externes, SQLite en Go.
  • Émulation partielle de l'API Bot Telegram pour migration sans réécriture.
  • ACK avec mise en silence automatique pour Alertmanager, indicateurs de statut colorés.
  • Relais WebSocket pour NAT, limites de débit, protection SSRF.
  • PWA avec push, rôles administrateur/membre, isolement par org.db.

— Editorial Team

Advertisement 728x90

Lire ensuite