Индекс журналаDockup / заметка с места
Note / self-host-ntfy

Как развернуть ntfy самостоятельно в 2026 году: топики, контроль доступа и доставка

Практическое руководство по самостоятельному размещению ntfy: Docker, порты, постоянное хранение данных, TLS, безопасность, резервные копии и проблемы, мешающие использовать сервис в production. Пошаговое руководство.

Большинство инструкций по установке ntfy заканчиваются на первом открытии страницы. Это слишком рано: кэш может быть эфемерным, а подключения WebSocket/SSE — завершаться по тайм-ауту на прокси. Полноценная production-проверка требует большего: опубликовать сообщение с помощью curl, получить его через подписки HTTP и WebSocket, прикрепить файл и проверить один топик с аутентификацией.

Роль ntfy проста: отправка push-уведомлений с помощью обычного HTTP-запроса. Но эксплуатационная граница сервиса включает не только веб-процесс, поэтому до поступления реальных данных нужно явно определить зависимость, сохраняемое состояние и публичный маршрут.

Production-архитектура ntfy

HTTP-процесс ntfy слушает порт 80. Оставьте этот порт во внутренней сети приложения и публикуйте только маршрут платформы. Локальное требование среды выполнения — том конфигурации и, при необходимости, база данных аутентификации. Проверьте эту границу до публикации и ещё раз после замены контейнера.

Зафиксируйте границу в виде короткого соглашения: кто отвечает за требование, какие credentials используются, какой тайм-аут допустим и как проявляется сбой. Затем выполните такую транзакцию: опубликуйте сообщение с помощью curl, получите его через подписки HTTP и WebSocket, прикрепите файл и проверьте один топик с аутентификацией. Во время проверки отслеживайте долгоживущие подключения подписчиков, размер вложений, срок хранения кэша и исходящие push-релеи, поскольку такая нагрузка даёт более полезную отправную точку для расчёта ресурсов, чем простаивающий контейнер.

Запустите ntfy, не скрывая важные детали

Используйте контейнер как заменяемую среду выполнения, а не как место хранения данных, которым можно доверять.

docker run -d \
  --name ntfy \
  --restart unless-stopped \
  -p 127.0.0.1:80:80 \
  -v ntfy-data:/var/cache/ntfy \
  -e NTFY_BASE_URL=https://app.example.com \
  binwiederhier/ntfy:latest serve

До публикации подтвердите локальное требование: том конфигурации и, при необходимости, база данных аутентификации. Перед открытием доступа проверьте пользователя контейнера, доступные для записи пути и привязанный listener. Выполните полный сценарий — опубликуйте сообщение с помощью curl, получите его через подписки HTTP и WebSocket, прикрепите файл и проверьте один топик с аутентификацией — и сохраните точную ссылку на образ, с которым был получен результат.

Назначьте ntfy один канонический адрес

Укажите в base-url публичный HTTPS-адрес, который используют отправители и подписчики. Направьте выбранное имя хоста на порт 80 контейнера, передавайте исходные host и HTTPS scheme и не публикуйте второй прямой origin.

Проверьте ntfy с чистого внешнего клиента. Отделяйте сбой ingress от известной границы приложения — кэш может быть эфемерным, а подключения WebSocket/SSE — завершаться по тайм-ауту на прокси. Ошибки сертификата, DNS или 502 относятся к маршрутизации; запрос, который дошёл до ntfy и завершился ошибкой позже, связан с состоянием приложения, ёмкостью или поддерживающим требованием. Первая группа подробно рассматривается в руководстве по TLS для пользовательского домена.

Убедитесь, что ntfy переживает замену

Защитите состояние ntfy до оптимизации контейнера. В обязательный набор входят конфигурация, база данных аутентификации и вложения, которые должны сохраняться. Подключите /var/cache/ntfy до bootstrap, запишите безвредные тестовые данные и замените контейнер, чтобы убедиться, что этот путь действительно постоянный. Если нужно согласовать несколько хранилищ, задокументируйте порядок приостановки записи и создания резервных копий.

Храните копии за пределами сервера развёртывания и шифруйте материалы, содержащие credentials или приватный контент. Восстановление считается успешным, когда возвращаются пользователи, ACL, конфигурация и сохранённые вложения, а подписчик с аутентификацией получает новое сообщение. Разница между постоянным mount и независимой копией объясняется в материале постоянное хранилище и snapshots.

Не предоставляйте ntfy доступ ко всему хосту

Для ntfy ценной поверхностью атаки не обязательно является главная страница. Основная ошибка — разрешить угадывать публичные топики, если сообщения содержат операционные детали. Противодействуйте этому намеренно: используйте ACL топиков, поскольку неугадываемые имена топиков не являются надёжной авторизацией для операционных сообщений.

NTFY_BASE_URL — это конфигурация, а не секрет. Храните её значение явно, защищая при этом отдельные credentials, используемые ntfy. Используйте непривилегированного пользователя контейнера, если образ это поддерживает, и не монтируйте посторонние credentials. Применяйте ограничения скорости или размера на ingress, где недоверенная нагрузка может занять долгоживущие подключения подписчиков, увеличить размер вложений, срок хранения кэша и нагрузку на исходящие push-релеи.

Обновляйте ntfy без догадок

После каждого развёртывания используйте в качестве smoke test ntfy следующий сценарий: опубликуйте сообщение с помощью curl, получите его через подписки HTTP и WebSocket, прикрепите файл и проверьте один топик с аутентификацией. Важные метрики для поддержки — долгоживущие подключения подписчиков, размер вложений, срок хранения кэша и исходящие push-релеи; настройте оповещения, когда эти ресурсы приближаются к уровню, ухудшающему пользовательское действие.

Основной риск при изменениях связан с тем, что перед обновлением ntfy нужно проверить ключи конфигурации, миграции базы данных аутентификации и ожидания клиентов. Безопасный релиз начинается с восстанавливаемого snapshot и проверки любых необратимых изменений состояния до переключения трафика. Если кэш эфемерен или подключения WebSocket/SSE завершаются по тайм-ауту на прокси, не удаляйте неисправный контейнер, пока не прочитаете его конфигурацию и первую ошибку.

Release gate для ntfy

Кандидат на релиз ntfy получает трафик после выполнения фиксированного сценария: опубликовать сообщение с помощью curl, получить его через подписки HTTP и WebSocket, прикрепить файл и проверить один топик с аутентификацией. Зафиксируйте digest образа, фактическую конфигурацию без секретов, публичный origin и временные отметки этого сценария. Тестовые данные должны быть одноразовыми, но достаточно реалистичными, чтобы задействовать тот же путь, что и пользовательские данные.

Запустите сценарий после замены среды выполнения, а затем пересоберите сервис из конфигурации, базы данных аутентификации и вложений, которые должны сохраняться. Восстановление считается успешным, когда возвращаются пользователи, ACL, конфигурация и сохранённые вложения, а подписчик с аутентификацией получает новое сообщение. Сравните показатели долгоживущих подключений подписчиков, размера вложений, срока хранения кэша и исходящих push-релеев с предыдущим релизом и разберитесь с существенными отклонениями до продвижения версии.

Наконец, выполните контролируемый сбой: отправьте безвредные данные, близкие к ограничению ресурса или формата, связанному с этой границей: кэш эфемерен или подключения WebSocket/SSE завершаются по тайм-ауту на прокси. Убедитесь, что ntfy объясняет причину сбоя, не повреждает существующее состояние и продолжает работу после восстановления корректного условия. Сохраните обезличенный фрагмент лога и время восстановления. Вместе эти проверки охватывают поведение, сохранность данных и эксплуатационные характеристики, а не только доступность процесса.

Сохраняйте настройки ntfy явными, а маршрутизацию оставьте Dockup

Маршрутизация, сертификаты, замена сервисов и подключённое хранилище — подходящие цели для автоматизации. Dockup берёт это на себя для ntfy и может предоставить связанную managed database или подключиться к сервисам на собственном сервере клиента.

Но Dockup не должен самостоятельно придумывать trust policy для ntfy. После развёртывания укажите в base-url публичный HTTPS-адрес, который используют отправители и подписчики, примените это правило — используйте ACL топиков, поскольку неугадываемые имена топиков не являются надёжной авторизацией для операционных сообщений, — и проверьте результат следующего сценария: опубликуйте сообщение с помощью curl, получите его через подписки HTTP и WebSocket, прикрепите файл и проверьте один топик с аутентификацией. В результате вы получаете инфраструктуру в один клик с application-specific acceptance test.

Часто задаваемые вопросы

Что нужно ntfy для production-развёртывания?

Направьте контейнер ntfy на порт 80 через один HTTPS-origin. Локальное требование среды выполнения — том конфигурации и, при необходимости, база данных аутентификации. Не объявляйте ntfy готовым, пока не сможете опубликовать сообщение с помощью curl, получить его через подписки HTTP и WebSocket, прикрепить файл и проверить один топик с аутентификацией.

Какие данные ntfy нужно включать в резервную копию?

Сохраняйте /var/cache/ntfy и включайте в тот же recovery manifest конфигурацию, базу данных аутентификации и вложения, которые должны пережить восстановление. Восстановление ntfy считается успешным только тогда, когда возвращаются пользователи, ACL, конфигурация и сохранённые вложения, а подписчик с аутентификацией получает новое сообщение.

Требуется ли ntfy HTTPS за reverse proxy?

Используйте HTTPS для публичного origin ntfy, а порт 80 оставьте во внутреннем маршруте. Корректно примените настройку ntfy: укажите в base-url публичный HTTPS-адрес, который используют отправители и подписчики. Для ntfy HTTPS защищает credentials или пользовательский контент при передаче и обеспечивает согласованное поведение клиентов, зависящее от origin.

Как тестировать обновление ntfy?

Восстановите текущее состояние ntfy в изолированном развёртывании, примените кандидатную версию и повторите acceptance transaction. Уделите этому особое внимание, поскольку перед обновлением ntfy нужно проверить ключи конфигурации, миграции базы данных аутентификации и ожидания клиентов. Сохраняйте предыдущий образ ntfy, пока не будут понятны границы миграции данных и rollback.