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:
| Platforma | Závislosti | Kompatibilita botů | ACK | RAM |
|-----------|-------------|---------------------|-----|-----|
| Mattermost | Postgres, SMTP | Přepisovat | Plugin | 500+ MB |
| 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.
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
Zatím žádné komentáře.