Установка и настройка self-hosted системы уведомлений ntfy
Многие использовали Telegram не только как мессенджер, но и как доставщика оперативных уведомлений от различных систем мониторинга.
После его блокировки резко встал вопрос: а что теперь использовать? Вариантов я рассматривал несколько: VK-бот, E-mail, Jabber, MAX :) Но в одном из чатов увидел упоминание self-hosted решения - ntfy (произносится как «notify»). Это открытый HTTP-сервис для отправки push-уведомлений. Он работает по модели публикации и подписки (pub-sub): отправитель публикует сообщение в именованный топик, а подписчики получают его в режиме реального времени.
Установка и настройка
Создаём на сервере каталог для хранения файлов конфигурации ntfy и сохраняем туда следующие два файла:
- docker-compose.yml
services: ntfy: image: binwiederhier/ntfy:latest container_name: ntfy restart: unless-stopped ports: - "8080:80" environment: - NTFY_BASE_URL=https://example.ru - NTFY_CACHE_FILE=/var/lib/ntfy/cache.db - NTFY_AUTH_FILE=/var/lib/ntfy/auth.db - NTFY_AUTH_DEFAULT_ACCESS=deny-all - NTFY_BEHIND_PROXY=true - NTFY_ATTACHMENT_CACHE_DIR=/var/lib/ntfy/attachments volumes: - ntfy_cache:/var/cache/ntfy - ntfy_data:/var/lib/ntfy - ./server.yml:/etc/ntfy/server.yml:ro command: - serve healthcheck: test: ["CMD-SHELL", "wget -q --tries=1 http://localhost:80/v1/health -O - | grep -Eo '\"healthy\"\\s*:\\s*true' || exit 1"] interval: 60s timeout: 10s retries: 3 start_period: 40s networks: - ntfy_network volumes: ntfy_cache: driver: local ntfy_data: driver: local networks: ntfy_network: driver: bridge
Параметры:
- NTFY_BASE_URL - имя домена, по которому будет работать сервис.
- NTFY_BEHIND_PROXY - используется ли обратный прокси.
- server.yml
# ntfy server configuration file # Place this as server.yml in the same directory as docker-compose.yml # Listen address listen-http: ":80" # Attachment settings attachment-total-size-limit: "5G" attachment-file-size-limit: "15M" attachment-expiry-duration: "3h" # Authentication settings auth-default-access: "deny-all" # Require authentication for all topics enable-signup: false # Disable public signups enable-login: true # Enable login page require-login: true enable-reservations: true # Allow topic reservations # Rate limiting (adjust as needed) visitor-subscription-limit: 30 visitor-request-limit-burst: 60 visitor-request-limit-replenish: "5s" visitor-email-limit-burst: 16 visitor-email-limit-replenish: "1h" visitor-attachment-total-size-limit: "100M" visitor-attachment-daily-bandwidth-limit: "500M" # Email settings (optional - for email notifications) # smtp-sender-addr: "your-email@example.com" # smtp-sender-user: "your-email@example.com" # smtp-sender-pass: "your-app-password" # smtp-server-listen: ":25" # smtp-server-domain: "ntfy.example.com" # smtp-server-addr-prefix: "ntfy-" # Message settings message-size-limit: "4096" message-delay-limit: "12h" # Web settings #web-root: "disable" # Set to "app" to enable web UI, "disable" to disable web-root: "app" # Uncomment this line to enable the web interface # Logging log-level: "INFO" log-format: "text" # Metrics (optional) # enable-metrics: true # metrics-listen-http: ":9090" # Manager settings manager-interval: "1m"
Параметры:
- web-root - использовать веб-админку. Может принимать значения app или disable.
- enable-signup - включить регистрацию
- enable-login - включить вход по логину
- require-login - требовать вход по логину (запрет анонимного входа)
Теперь запускаем контейнер:
docker-compose up -d
В браузере теперь можно открыть админку:
Но пользователей у нас ещё нет. Добавляем username и делаем его админом:
docker exec -it ntfy ntfy user add username docker exec -it ntfy ntfy user change-role username admin
Просмотреть список всех пользователей можно командой:
docker exec -it ntfy ntfy user list
Сразу сгенерируем ключи VAPID:
docker exec -it ntfy ntfy webpush keys
Полученные строки вставим в конец файла server.yml:
web-push-public-key: ************************************************************************ web-push-private-key: ****************************************** web-push-file: /var/cache/ntfy/webpush.db # or similar web-push-email-address: example@example.com
Эти ключи необходимы для возможности отправки Push-уведомлений в браузер, даже когда сама страница сервиса закрыта и браузер свёрнут.
Перезапустим контейнер и после этого зайдём в админку созданным пользователем:
Для начала разрешим уведомления. Для этого нажимаем «Разрешить» в левом верхнем углу, и подтверждаем в браузере:
Теперь открываем настройки и включаем фоновые уведомления. Без этого браузерные Push-уведомления будут приходить только при открытой странице сервиса:
Ну и чуть ниже резервируем для своего пользователя необходимые каналы для уведомлений. Лучше их называть так, чтобы никто не догадался. Разрешим всем публиковать, а себе и читать и публиковать:
Если разрешить публикацию только себе, то придётся во все скрипты для отправки уведомлений вставлять авторизационные данные.
Сразу же подпишемся на созданную тему. Пока у нас нет никаких уведомлений:
Попробуем отправить. Для этого выполним curl запрос, как указано на странице. В результате должны будем получить push-уведомление в браузере и отображение его на странице:
Мобильное приложение
Отправка уведомлений
curl
Отправка с помощью curl:
curl -d "Hi" https://example.ru/topic
С указанием заголовка:
curl -H "Title:Title message" -d "Hi" https://example.ru/topic
С приоритетом:
curl -H "Priority:5" -H "Title:Title message" -d "Hi" https://example.ru/topic
Также можно в заголовке указывать некоторые символы emoji. Для этого используется параметр «X-Tags»:
curl -H "X-Tags:heavy_check_mark" -H "Title:Title message" -d "Hi" https://example.ru/topic
Примеры:
| warning | ⚠ |
| green_circle | 🟢 |
| white_check_mark | ✅ |
| skull | 💀 |
| rotating_light | 🚨 |
Mikrotik
Также отправлять уведомления можно с Mikrotik:
/tool fetch http-method=post url="https://example.ru/topic" mode=https output=none http-header-field="Title:Mikrotik Home,X-Tags:green_circle" http-data="Home server up"
Это позволяет настраивать мониторинг с помощью Netwatch или Dude.










