mysurik.ru

ntfy: уведомления на телефон со своего сервера

Я перепробовал кучу способов получать уведомления с сервера. Pushover — платный. Telegram — нужно бота создавать, токены хранить, следить чтобы бот не забаннили. Email — ну серьёзно, кто сейчас читает почту от сервера? У меня за месяц накопилось тысяч пять писем от cron, я перестал их открывать после первой недели. А потом я нашёл ntfy, и это было как глоток свежего воздуха.

Ntfy — это минималистичный сервер пуш-уведомлений, который ты поднимаешь сам у себя. Кидаешь на него HTTP-запрос, он шлёт пуш на телефон. Всё. Никаких регистраций, никаких сторонних сервисов, никаких ключей API. Свой сервер — свои правила. Единственное требование — у тебя должен быть домен или статический IP для аплинка, но через Tailscale тоже работает отлично.

Установка и настройка

Поднимается в Docker за 30 секунд. Буквально:

docker run -d --name ntfy 
  -p 2586:80 
  -v /path/to/ntfy:/var/lib/ntfy 
  -e TZ=Europe/Moscow 
  binwiederhier/ntfy

Я повесил его за nginx reverse proxy с let’s encrypt-сертификатом, чтобы было по HTTPS. Без HTTPS мобильные приложения ntfy работать отказываются — это не баг, а фича безопасности.

Дальше — базовое администрирование. Создал пользователя, подписался на топик:

docker exec ntfy ntfy user add --role=admin mysurik
docker exec ntfy ntfy token add mysurik mytopic

Можно использовать пароли, но я предпочёл токены — их проще менять и отзывать. Токен передаётся в заголовке Authorization: Bearer при отправке сообщения.

Интеграция с сервером

Первым делом я прикрутил ntfy к cron. Когда бекап Proxmox завершается (или, что бывает чаще, падает с ошибкой), я получаю пуш на телефон. Сделал простой скрипт-обёртку:

#!/bin/bash
NTFY_URL="https://ntfy.mysurik.ru/backups"
NTFY_TOKEN="tk_ваштокен"
if [ $? -eq 0 ]; then
  curl -H "Authorization: Bearer $NTFY_TOKEN" 
       -H "Title: ✅ Backup OK" 
       -H "Priority: low" 
       -d "Backup of $(hostname) completed at $(date)" $NTFY_URL
else
  curl -H "Authorization: Bearer $NTFY_TOKEN" 
       -H "Title: ❌ Backup FAILED" 
       -H "Priority: high" 
       -H "Tags: warning" 
       -d "Backup FAILED on $(hostname)! Check logs!" $NTFY_URL
fi

Потом прикрутил Fail2ban — когда банят IP, я вижу на телефоне кто и откуда ломился. Для Zabbix тоже есть интеграция через webhook — алерты приходят не на почту, а сразу в карман. Пробовал Grafana — через Alertmanager вебхуки работает без проблем.

Ещё настроил отправку уведомлений о состоянии дисков (S.M.A.R.T. через smartd), о переполнении логов (logwatch), о обновлениях пакетов (unattended-upgrades). Каждый сервис пишет в свой топик — я подписан на все, но на телефоне могу отфильтровать по топику или приоритету.

Клиент на телефоне

На телефоне поставил официальное приложение ntfy из F-Droid (в Google Play оно тоже есть). Работает через Firebase Cloud Messaging как fallback, но если сервер доступен напрямую — идёт прямое соединение через WebSocket. Сообщения приходят мгновенно, задержка меньше секунды.

Можно настроить приоритеты: критические уведомления с вибрацией и звуком, информационные — тихо в шторку. Я настроил так: бекапы и алерты Zabbix — высокий приоритет, автообновления пакетов — низкий. В итоге телефон не дёргается по пустякам, но важное не пропускает.

Настройки уведомлений хранятся на сервере — при смене телефона достаточно залогиниться в приложении, и все настройки подтянутся автоматически. Очень удобно, когда переустанавливаешь прошивку или меняешь устройство.

Продвинутые фичи

Ntfy умеет не только текст. Можно передавать заголовки, теги, приоритеты, URL и даже изображения. Я, например, настроил отправку скриншотов с камеры наблюдения при детекте движения (frigate + curl с attachment картинки). Ещё можно прикреплять файлы — логи, скриншоты, CSV.

Отдельно радует, что можно публиковать сообщения анонимно (если не включена аутентификация) — это удобно для одноразовых скриптов, где хранить токен не хочется. Но я всё-таки включил базовую аутентификацию, чтобы любой желающий с интернета не мог слать мне уведомления.

Ещё одна крутая фича — ntfy умеет работать как email-шлюз. Я настроил postfix на пересылку писем от сервера в ntfy через pipe transport. Теперь все письма от system, отчеты Logwatch и сообщения от mdadm приходят на телефон как пуши. Никаких почтовых ящиков для мониторинга — всё в одном месте.

Что не понравилось

Из минусов — нет ретроспективы. Если интернет упал или телефон был выключен, уведомления просто теряются. Ntfy не умеет доставлять пропущенные сообщения — это архитектурное ограничение протокола. Для некритичных уведомлений это нормально, но для критических алертов я дублирую через SMS (есть сервис-прослойка, который шлёт SMS при недоставке пуша).

Второй минус — нет встроенного дашборда. Хочется иногда посмотреть историю уведомлений за неделю, но веб-интерфейс показывает только последние сообщения. Для дашборда можно использовать ntfy + Prometheus/Grafana, но это дополнительная морока.

Третий — если отправлять много уведомлений, база данных ntfy растёт. По умолчанию он хранит всё. Я настроил TTL в конфиге (message-ttl: 72h) и автоочистку раз в час. Так база не раздувается.

Итог

Ntfy стал моей стандартной шиной уведомлений. Я забыл про почтовые ящики для логов. Всё важное — сразу в карман. Поставил на свой сервер, один раз настроил — и забыл. Точнее, помнишь только когда приходит пуш: «Бекап успешен» — и можно спать дальше.

Если у тебя есть свой сервер и ты ещё не поставил ntfy — очень рекомендую. Минимум усилий, максимум пользы. Из всех self-hosted решений, которые я пробовал, ntfy — одно из тех, что реально меняет повседневную работу с сервером. Установка занимает пять минут, интеграция с чем угодно — через curl. Дешевле и проще не бывает.

Ваш комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *