🌐 English
Pusk — self-hosted платформа для алертов и командной координации. Webhook из любого мониторинга, ACK одной кнопкой, push на телефон. Один бинарник, без внешних зависимостей.
Проблема: алерт сработал. Кто взял? Тишина.
- Алерты тонут в общих чатах среди обсуждений
- Нет подтверждения (ACK) — непонятно, кто разбирается
- Нет эскалации — если дежурный спит, алерт умирает
- Данные на чужих серверах — compliance не пройдёшь
Решение — Pusk:
- Алерты из Grafana, Zabbix, Alertmanager, Uptime Kuma — в отдельные каналы
- ACK одной кнопкой — автоматический silence в Alertmanager
- Push-уведомления на телефон даже при закрытом браузере
- Командный чат — каналы, @упоминания, файлы
- Совместим с Telegram Bot API — существующие боты работают с заменой одной строки
- DevOps/SRE-команды — алерты из мониторинга + координация инцидентов
- Компании с compliance — данные на своём сервере, без внешних зависимостей
- Те, кому нужна автономность — работает без внешних зависимостей
| Возможность | Описание |
|---|---|
| Алерты | Webhook из Alertmanager, Grafana, Zabbix, Uptime Kuma. Цветовые индикаторы, ACK, автоматический silence |
| Push | Web Push на телефон и десктоп (даже при закрытом браузере) |
| Боты | 13 методов Telegram Bot API. Inline-кнопки, webhook, long polling |
| Каналы | Командные каналы, @упоминания с push, reply, pin, редактирование |
| Файлы | Фото, видео, голосовые, документы — загрузка и просмотр |
| Онлайн-статус | Имена онлайн/отошёл в реальном времени, typing-индикатор |
| Мультитенант | Изолированные организации (отдельная SQLite на каждую) |
| Простота | Один бинарник (23 МБ), SQLite, ~2 МБ RAM, запуск за 1 секунду |
Готовые docker-compose файлы — скачай, запусти, работает:
| Кейс | Что получите | Время |
|---|---|---|
| Alertmanager | Prometheus → Alertmanager → Pusk, ACK с auto-silence | 5 мин |
| Grafana | Grafana Contact Point → Pusk | 5 мин |
| Zabbix | Zabbix Media Type → Pusk | 5 мин |
| Uptime Kuma | Uptime Kuma → Pusk | 3 мин |
| Всё сразу | Полный стек для знакомства | 5 мин |
Это ещё один мессенджер?
Нет. Это платформа алертов с командным чатом. Ближе к PagerDuty и Opsgenie, чем к Slack — но на вашем сервере и бесплатно.Чем отличается от PagerDuty?
Self-hosted, бесплатный, один бинарник. Нет расписания дежурств (пока), но есть командный чат и совместимость с Telegram Bot API.Нужно ставить приложение?
Нет. Pusk работает в браузере — открываете ссылку и пользуетесь. Можно добавить на главный экран телефона как иконку (PWA), но это необязательно. Поддерживаются Chrome, Firefox, Edge.Как приходят уведомления на телефон?
Через Web Push — стандарт браузера, как у Slack и Discord. Приходят даже когда браузер закрыт. На Android работает отлично, на iOS с Safari 16.4+.docker run -d --name pusk \
-p 8443:8443 \
-v pusk-data:/app/data \
ghcr.io/getpusk/pusk:latestОткройте http://localhost:8443 — зарегистрируйтесь и начните работу.
- Первый пользователь создаёт организацию — он становится администратором
- В настройках нажмите Пригласить — скопируйте ссылку и отправьте коллегам
- Коллеги переходят по ссылке, регистрируются — и сразу в команде
- Новые участники автоматически подписываются на все каналы
Назначьте минимум 2 админов, чтобы не зависеть от одного человека.
receivers:
- name: pusk
webhook_configs:
- url: 'https://your-pusk/hook/BOT-TOKEN?format=alertmanager'Alerting → Contact points → New → Type: Webhook
URL: https://your-pusk/hook/BOT-TOKEN?format=grafana
Administration → Media types → Create: Webhook
URL: https://your-pusk/hook/BOT-TOKEN?format=zabbix
Notifications → Add → Type: Webhook
URL: https://your-pusk/hook/BOT-TOKEN?format=raw&channel=alerts
curl -X POST 'https://your-pusk/hook/BOT-TOKEN?format=raw' \
-H 'Content-Type: application/json' \
-d '{"status":"down","name":"my-service"}'git clone https://github.com/getpusk/pusk.git
cd pusk
go build -o pusk ./cmd/pusk/
./puskversion: '3'
services:
pusk:
image: ghcr.io/getpusk/pusk:latest
ports:
- "8443:8443"
volumes:
- ./data:/app/data
environment:
- PUSK_ADMIN_TOKEN=your-secret
restart: unless-stoppedЕсли у вас уже есть бот на Telegram Bot API — он заработает в Pusk с заменой одной строки:
# Python (aiogram)
bot = Bot(token="TOKEN", base_url="https://your-pusk:8443/bot")
# Python (python-telegram-bot)
app = Application.builder().token(TOKEN).base_url("https://your-pusk:8443/bot").build()// Node.js (Telegraf)
bot.telegram.options.apiRoot = "https://your-pusk:8443";Поддерживается 13 из 80+ методов — достаточно для алертов, уведомлений и простых ботов.
sudo tee /etc/systemd/system/pusk.service << EOF
[Unit]
Description=Pusk
After=network.target
[Service]
User=pusk
WorkingDirectory=/opt/pusk
ExecStart=/opt/pusk/pusk
Restart=always
Environment=PUSK_ADDR=:8443
Environment=PUSK_ADMIN_TOKEN=your-secret
# Environment=PUSK_JWT_SECRET=your-jwt-secret
# Environment=VAPID_PUBLIC_KEY=...
# Environment=VAPID_PRIVATE_KEY=...
# Environment=VAPID_EMAIL=admin@example.com
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl enable --now puskpusk.example.com {
reverse_proxy localhost:8443
}
server {
listen 443 ssl;
server_name pusk.example.com;
location / {
proxy_pass http://127.0.0.1:8443;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
}
}| Переменная | По умолчанию | Описание |
|---|---|---|
PUSK_ADDR |
:8443 |
Адрес сервера |
PUSK_ADMIN_TOKEN |
— | Токен для Admin API |
PUSK_MAX_ORGS |
1 |
Макс. количество пользовательских организаций. 0 — без лимита. Админ-токен обходит лимит |
PUSK_DEMO |
— | 1 — включить демо-режим |
PUSK_MSG_RETENTION_DAYS |
30 |
Автоудаление сообщений старше N дней. 0 — не удалять |
PUSK_FILE_QUOTA_MB |
1024 |
Лимит хранилища файлов на организацию (МБ) |
PUSK_WEBHOOK_DEBOUNCE |
10s |
Дедупликация одинаковых webhook. 0 — отключить |
PUSK_ALERTMANAGER_URL |
— | URL Alertmanager для авто-silence при ACK |
VAPID_PUBLIC_KEY |
— | VAPID ключ для Web Push |
VAPID_PRIVATE_KEY |
— | Приватный ключ VAPID |
VAPID_EMAIL |
— | Email для push-сервиса |
PUSK_JWT_SECRET |
авто | Секрет JWT. Если не задан — генерируется и сохраняется в data/jwt.secret |
PUSK_LOG_FORMAT |
text |
json — JSON-логи для production |
PUSK_OPEN_USER_REGISTRATION |
true |
false — отключить саморегистрацию (только инвайты) |
PUSK_WEBHOOK_RATE_LIMIT |
60 |
Лимит webhook-запросов в минуту на бота |
PUSK_TPL_ALERTMANAGER |
— | Путь к файлу кастомного Go-шаблона для Alertmanager webhook |
PUSK_TPL_GRAFANA |
— | Путь к файлу кастомного Go-шаблона для Grafana webhook |
PUSK_TPL_ZABBIX |
— | Путь к файлу кастомного Go-шаблона для Zabbix webhook |
PUSK_TPL_RAW |
— | Путь к файлу кастомного Go-шаблона для raw webhook |
Все эндпоинты требуют Authorization: Bearer <PUSK_ADMIN_TOKEN> или JWT с ролью admin.
| Метод | Путь | Описание |
|---|---|---|
POST |
/admin/bots |
Зарегистрировать бота (token, name) |
POST |
/admin/channel |
Создать канал (name, description, bot_id) |
DELETE |
/admin/channel/{id} |
Удалить канал (кроме #general) |
PUT |
/admin/channel/{id} |
Переименовать канал (name) |
PUT |
/admin/bots/{id} |
Переименовать бота (name) |
POST |
/admin/reset-password |
Сбросить пароль (org, username, new_pin). Только ADMIN_TOKEN |
POST |
/admin/set-role |
Назначить роль (org, user_id, role: admin/member). Только ADMIN_TOKEN |
GET |
/api/org/info |
Информация о лимитах организаций |
POST |
/api/org/register |
Создать организацию (slug, name, username, pin) |
Все данные в папке data/:
# Горячий бэкап
sqlite3 data/orgs/my-org/pusk.db ".backup backup.db"
# Полный бэкап
tar czf pusk-backup-$(date +%Y%m%d).tar.gz data/pusk (23 МБ, ~8400 строк Go, 110 тестов)
├── Bot API — /bot/<token>/<method> (совместим с Telegram)
├── Client API — /api/* (бэкенд PWA)
├── WebSocket — /api/ws (real-time статусы, typing)
├── Файлы — /file/<id> (медиа)
├── PWA — / (веб-клиент)
└── SQLite — data/orgs/*/pusk.db (база данных)
Попробуйте: getpusk.ru — кнопка «Demo», без регистрации.
- JWT с 7-дневным TTL, bcrypt-хеширование паролей
- Защита владельца организации (первый админ) от удаления и понижения
- Канал #general защищён от удаления и переименования
- Rate limiting на авторизацию, регистрацию, отправку
- SSRF-защита webhook URL
- Мультитенант с полной изоляцией данных (отдельная SQLite на организацию)
BSL 1.1 — Copyright (c) 2026 Volkov Pavel | DevITWay
Подробнее в LICENSE.


