Zpět na domů

Server alertů Pusk 16 MB na Go

Pusk — kompaktní self-hosted server alertů na Go o velikosti 16 MB. Podporuje migraci Telegram botů, ACK s silence v Alertmanager, WebSocket pro NAT. Funguje bez externích DB, s PWA a push notifikacemi.

Pusk: 16 MB server alertů bez závislostí
Advertisement 728x90

Pusk: Self-hosted server pro upozornění o velikosti 16 MB napsaný v Go

Self-hosted řešení Pusk nahrazuje závislost na externích messenger pro monitorování. Jeden spustitelný soubor o velikosti 16 MB podporuje 13 metod Telegram Bot API, WebSocket, Web Push a PWA klient. Funguje bez Postgres nebo jiných databází — pouze SQLite v čistém Go. Vyvinuto pro scénáře, kde externí API nejsou dostupná: limity, blokace nebo izolace.

Architektura vylučuje externí služby. Go bylo vybráno pro rychlé sestavení (7 sekund) a vestavěný net/http. Databáze — modernc.org/sqlite bez CGO, RSS ~4 MB při startu. Logování přes slog v JSON nebo textu.

Proč ne standardní messengery

Alternativy vyžadují migrace, databáze a zdroje:

Google AdInline article slot

| Platforma | Závislosti | Kompatibilita botů | ACK | RAM |

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

| Mattermost | Postgres, SMTP | Přepisovat | Plugin | 500+ MB |

Google AdInline article slot

| Matrix | Synapse, Postgres | Přepisovat | Ne | 500+ MB |

| Telegram | Cloud | — | Ne | — |

Gotify/ntfy — pouze push bez chatu a ACK. VPN pro Telegram přidává body selhání. Pusk emuluje Bot API: změníš base_url v botovi — a funguje s tvou infrastrukturou.

Google AdInline article slot

Struktura binárního souboru

pusk (16 MB, ~6600 řádků Go, 110 testů)
├── Bot API    — /bot/<token>/<method>  (13 z 80+ metod Telegram Bot API)
├── Client API — /api/*                 (backend PWA)
├── WebSocket  — /api/ws                (real-time stavy, typing)
├── Web Push   — FCM / Mozilla          (oznámení bez polling)
├── Soubory    — /file/<id>             (média)
├── PWA        — /                      (webový klient)
└── SQLite     — data/orgs/*/pusk.db    (samostatná DB pro každou organizaci)

Podpora: sendMessage, editMessageText, deleteMessage, answerCallbackQuery, sendPhoto, sendDocument, sendVoice, sendVideo, setWebhook, deleteWebhook, getWebhookInfo, getMe, getUpdates.

Middleware pro kompatibilitu:

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

Migrace python-telegram-bot:

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

# Stalo se:
app = ApplicationBuilder().token(TOKEN).base_url("https://pusk.internal/bot").build()

Long Polling a doručování aktualizací

/getUpdates drží spojení timeout sekund, bere v úvahu offset, fronta v paměti (100 aktualizací/bot). Při restartu bot dostane další upozornění bez persistence.

Pro boty za 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())

Automatický výběr: webhook (s SSRF ochranou), relay (rate-limit 30 zpráv/min) nebo getUpdates.

SQLite per org a horká záloha

Každá organizace — samostatný pusk.db v WAL režimu. Nezablokuje čtenáře při zápisu. Záloha: sqlite3 pusk.db ".backup backup.db". Vhodné pro desítky zpráv/min bez JOINů Postgres.

Pracovní postup

  • Admin spustí server (docker run nebo binární soubor), vytvoří organizaci — vygeneruje se #general a systémový bot.
  • Pozvání přes odkaz (7 dní, do 50 osob), automatické oznámení do chatu.
  • Vytvoření #alerts, webhook z Zabbix/Grafana/Alertmanager (?format=alertmanager).
  • Služba: push/WebSocket, ACK tlačítko, celý tým vidí stav.

Role:

  • Admin: všechna práva + správa uživatelů/kanálů.
  • Člen: chat, ACK, soubory, @mention.

Vylepšení pro upozorňování

  • ACK → Silence: POST /api/v2/silences do Alertmanager přes PUSK_ALERTMANAGER_URL.
  • Barvy: červený/zelený proužek pro firing/resolved.
  • Push optimalizace: WebSocket aktivní a kanál otevřený — push neposílat.
  • Izolace: frontend vestavěný, bez CDN. Web Push vyžaduje FCM/Mozilla.

Co je důležité

  • Jeden 16 MB binární soubor bez externích závislostí, SQLite v Go.
  • Částečná emulace Telegram Bot API pro migraci bez přepisování.
  • ACK s automatickým umlčením Alertmanager, barevná indikace stavů.
  • WebSocket relay pro NAT, rate-limits, SSRF ochrana.
  • PWA s push, role admin/člen, izolace podle org.db.

— Editorial Team

Advertisement 728x90

Číst dál