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

ntfy — простой сервер push-уведомлений: curl на URL — и пуш на телефон. Подходит для бэкапов, Fail2ban, Uptime Kuma и cron-задач.

1. Каталог

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

2. Конфиг сервера

cat > etc/server.yml << 'EOF'
base-url: "https://ntfy.yourdomain"
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
EOF

deny-all — без анонимной публикации; пользователей создадите после старта.

3. docker-compose.yml

services:
  ntfy:
    image: binwiederhier/ntfy:latest
    container_name: ntfy
    restart: unless-stopped
    command: serve
    environment:
      TZ: Europe/Moscow
    volumes:
      - ./cache:/var/cache/ntfy
      - ./etc:/etc/ntfy
      - 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

volumes:
  ntfy_lib:

networks:
  traefik_network:
    external: true

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

docker compose up -d
docker exec -it ntfy ntfy user add --role=admin youruser

Установите приложение ntfy, подпишитесь на топик, например homelab-alerts (с логином).

В веб-интерфейсе управления пользователями нет. Обычных людей и доступ к топику задаёте в CLI:

docker exec ntfy ntfy user list
docker exec -it ntfy ntfy user add username
docker exec ntfy ntfy access username homelab-alerts read-write
docker exec ntfy ntfy user del username

read-only вместо read-write — только получать пуши. Админ видит все топики; обычный пользователь — только те, куда выдали access.

Топик как сущность в базе не создаётся: достаточно имени и ACL. Новый канал тому же человеку:

docker exec ntfy ntfy access username backups read-write
docker exec ntfy ntfy access

После этого он подписывается в приложении на backups. Закрыть топик: ntfy access username backups deny.

5. Отправка из скрипта

curl -u 'youruser:password' \
  -H "Title: Backup OK" \
  -d "Ночной rclone завершился успешно" \
  https://ntfy.yourdomain/homelab-alerts

Замечания

  • Не оставляйте auth-default-access: write-only на публичном сервере без необходимости.
  • Бэкапьте volume ntfy_lib и каталог ./etc.
  • Топики с секретами в имени — слабая защита; лучше auth.

Итог: лёгкие push-алерты для всего домашнего сервера через HTTPS.