Установка и настройка 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-уведомление в браузере и отображение его на странице:

Конечно же есть одноимённое мобильное приложение ntfy для смартфонов.

Отправка с помощью 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:

/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.

  • docker/ustanovka_i_nastrojka_self_hosted_sistemy_uvedomlenij_ntfy.txt
  • Последнее изменение: 22.04.2026 20:51
  • r0wbh