Запуск ntfy через Traefik с Docker Compose

ntfy — простой HTTP/Web push для уведомлений: топики, приложение, curl, интеграции со скриптами и мониторингом. На домашнем сервере удобно держать свой инстанс за Traefik с логином и без открытой регистрации.

Нужны рабочий Traefik и сеть traefik_network.

1. Каталог

mkdir -p ntfy/{cache,etc,lib}
cd ntfy

2. etc/server.yml

base-url: "https://ntfy.(yourdomain)"
listen-http: ":80"
cache-file: "/var/cache/ntfy/cache.db"
attachment-cache-dir: "/var/cache/ntfy/attachments"
auth-file: "/var/lib/ntfy/user.db"
auth-default-access: "deny-all"
behind-proxy: true
enable-login: true
enable-signup: false
web-root: "app"

# опционально: доставка на iOS через upstream ntfy.sh
upstream-base-url: "https://ntfy.sh"

behind-proxy: true обязателен за Traefik. auth-default-access: deny-all + выключенный signup — доступ только существующим пользователям.

3. docker-compose.yml

services:
  ntfy:
    image: binwiederhier/ntfy:v2.31.0
    container_name: ntfy
    restart: unless-stopped
    command: serve
    environment:
      TZ: Europe/Astrakhan
    volumes:
      - ./cache:/var/cache/ntfy
      - ./etc:/etc/ntfy
      - ./lib:/var/lib/ntfy
    labels:
      - traefik.enable=true
      - traefik.http.middlewares.ntfy_https.redirectscheme.scheme=https
      - traefik.http.routers.ntfy.entrypoints=web
      - traefik.http.routers.ntfy.middlewares=ntfy_https@docker
      - traefik.http.routers.ntfy.rule=Host(`ntfy.(yourdomain)`)
      - traefik.http.routers.ntfy_https.entrypoints=websecure
      - traefik.http.routers.ntfy_https.rule=Host(`ntfy.(yourdomain)`)
      - traefik.http.routers.ntfy_https.tls=true
      - traefik.http.routers.ntfy_https.tls.certresolver=le
      - traefik.http.services.ntfy.loadbalancer.server.port=80
    networks:
      - traefik_network

networks:
  traefik_network:
    external: true

⚠️ Замените (yourdomain) на ваш домен.

4. Запуск и пользователь

docker compose up -d
curl -sf https://ntfy.(yourdomain)/v1/health

Создайте пользователя (пример):

docker exec -it ntfy ntfy user add --role=admin (youuser)
# пароль спросит интерактивно; либо:
# docker exec -it ntfy ntfy user hash

Откройте https://ntfy.(yourdomain), войдите, создайте топик и проверьте:

curl -u '(youuser):(youpassword)' \
  -d 'тест с домашнего сервера' \
  https://ntfy.(yourdomain)/home-lab

5. Замечания

  • Бэкапьте ./lib (пользователи) и при необходимости ./cache.
  • Для скриптов и Zabbix/cron достаточно curl с basic auth на топик.
  • upstream-base-url нужен в основном для iOS; Android/web работают напрямую с вашим инстансом.
  • Не публикуйте порт ntfy в NAT — только 80/443 на Traefik.

Итог: свой push-сервер за HTTPS с логином, без чужих облаков для обычных уведомлений стенда.