Pusk: Ein 16 MB selbst gehosteter Alert-Server in Go
Pusk ist eine selbst gehostete Lösung, die die Abhängigkeit von externen Messaging-Plattformen für die Überwachung beseitigt. Eine einzige 16 MB große ausführbare Datei unterstützt 13 Telegram Bot API-Methoden, WebSocket, Web Push und einen PWA-Client. Es läuft ohne PostgreSQL oder andere Datenbanken – nur SQLite in reinem Go. Entwickelt für Szenarien, in denen externe APIs aufgrund von Limits, Blockaden oder Isolation nicht verfügbar sind.
Die Architektur schließt externe Dienste aus. Go wurde für schnelle Builds (7 Sekunden) und seine integrierte net/http-Bibliothek gewählt. Die Datenbank nutzt modernc.org/sqlite ohne CGO, mit einem RSS von ~4 MB beim Start. Das Logging erfolgt über slog im JSON- oder Textformat.
Warum nicht Standard-Messenger?
Alternativen erfordern Migrationen, Datenbanken und erhebliche Ressourcen:
| Plattform | Abhängigkeiten | Bot-Kompatibilität | ACK | RAM |
|-----------|-------------|---------------------|-----|-----|
| Mattermost | PostgreSQL, SMTP | Umschreibung erforderlich | Plugin | 500+ MB |
| Matrix | Synapse, PostgreSQL | Umschreibung erforderlich | Nein | 500+ MB |
| Telegram | Cloud | — | Nein | — |
Gotify/ntfy bieten nur Push-Benachrichtigungen ohne Chat oder ACK. Die Nutzung eines VPN für Telegram fügt Fehlerquellen hinzu. Pusk emuliert die Bot API: Ändern Sie die base_url in Ihrem Bot, und er funktioniert mit Ihrer Infrastruktur.
Binärstruktur
pusk (16 MB, ~6600 Zeilen Go, 110 Tests)
├── Bot API — /bot/<token>/<method> (13 von 80+ Telegram Bot API-Methoden)
├── Client API — /api/* (PWA-Backend)
├── WebSocket — /api/ws (Echtzeit-Status, Tippen)
├── Web Push — FCM / Mozilla (Benachrichtigungen ohne Polling)
├── Files — /file/<id> (Medien)
├── PWA — / (Web-Client)
└── SQLite — data/orgs/*/pusk.db (separate DB für jede Organisation)
Unterstützte Methoden: sendMessage, editMessageText, deleteMessage, answerCallbackQuery, sendPhoto, sendDocument, sendVoice, sendVideo, setWebhook, deleteWebhook, getWebhookInfo, getMe, getUpdates.
Middleware für Kompatibilität:
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 von python-telegram-bot:
# Vorher:
app = ApplicationBuilder().token(TOKEN).build()
# Nachher:
app = ApplicationBuilder().token(TOKEN).base_url("https://pusk.internal/bot").build()
Long Polling und Update-Lieferung
/getUpdates hält eine Verbindung für Timeout-Sekunden, berücksichtigt Offset, mit einer In-Memory-Warteschlange (100 Updates/Bot). Beim Neustart erhält der Bot nachfolgende Alerts ohne Persistenz.
Für Bots hinter NAT – WebSocket-Relay:
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())
Automatische Auswahl: Webhook (mit SSRF-Schutz), Relay (ratenbegrenzt auf 30 Nachrichten/Minute) oder getUpdates.
SQLite pro Organisation und Hot Backup
Jede Organisation hat eine separate pusk.db im WAL-Modus. Blockiert Leser während Schreibvorgängen nicht. Backup: sqlite3 pusk.db ".backup backup.db". Geeignet für Dutzende Nachrichten/Minute ohne PostgreSQL-JOINs.
Workflow
- Admin startet den Server (docker run oder Binärdatei), erstellt eine Organisation – generiert #general und einen System-Bot.
- Einladung per Link (7 Tage, bis zu 50 Personen), automatische Benachrichtigung im Chat.
- Erstelle #alerts, Webhook von Zabbix/Grafana/Alertmanager (?format=alertmanager).
- Bereitschaftsdienst: Push/WebSocket, ACK-Button, das ganze Team sieht den Status.
Rollen:
- Admin: Volle Rechte + Benutzer/Kanal-Verwaltung.
- Mitglied: Chat, ACK, Dateien, @Erwähnung.
Verbesserungen für Alerting
- ACK → Silence: POST /api/v2/silences an Alertmanager über PUSK_ALERTMANAGER_URL.
- Farben: Rot/grüner Streifen für firing/resolved.
- Push-Optimierung: Wenn WebSocket aktiv und Kanal offen, Push überspringen.
- Isolation: Frontend eingebettet, kein CDN. Web Push erfordert FCM/Mozilla.
Hauptmerkmale
- Einzelne 16 MB Binärdatei ohne externe Abhängigkeiten, SQLite in Go.
- Partielle Emulation der Telegram Bot API für Migration ohne Umschreibung.
- ACK mit automatischem Silencing für Alertmanager, farbcodierte Statusanzeigen.
- WebSocket-Relay für NAT, Ratenlimits, SSRF-Schutz.
- PWA mit Push, Admin/Mitglied-Rollen, Isolation pro org.db.
— Editorial Team
Noch keine Kommentare.