# vds-ntfy-push ## Goal Self-host [ntfy.sh](https://ntfy.sh) на VDS для push-нотификаций на телефон. Docker-image `binwiederhier/ntfy`. Использовать для: - [[vds-backup-rsync-kreknin]] backup status (вместо/параллельно email на vitya.kuznetsov@gmail.com) - Monitoring alerts (CMS down, traefik certs истекают, disk fill, registry GC fail, etc.) - Любые ad-hoc уведомления от ops-скриптов Domain: `ntfy.vds.kzntsv.site` (под уже существующим wildcard `*.vds.kzntsv.site`). ## Open questions - [ ] **Auth model:** ntfy supports anonymous (open топики — anyone with topic name может subscribe/publish) или с auth (per-user/per-topic ACL). Для push на личный телефон — anonymous с длинными UUID-топиками практично; auth ближе production. Recommend: auth + ACL. - [ ] **Топики:** один общий (`vitya-ops`) или по сервису (`vds-backup`, `cms-monitor`, `traefik-alerts`)? Per-service удобнее для filtering на телефоне. - [x] ~~**Phone app:**~~ Android (resolved 2026-05-20) → ntfy Android app, pure self-host без APNs middleware. - [ ] **Persistence:** sqlite DB в `/opt/stacks/ntfy/data/`. Тривиально. ## Implementation sketch `/opt/stacks/ntfy/docker-compose.yml`: ```yaml services: ntfy: image: binwiederhier/ntfy container_name: ntfy restart: unless-stopped command: - serve networks: - proxy volumes: - ./data:/var/cache/ntfy - ./etc:/etc/ntfy environment: NTFY_BASE_URL: https://ntfy.vds.kzntsv.site NTFY_CACHE_FILE: /var/cache/ntfy/cache.db NTFY_AUTH_FILE: /var/cache/ntfy/auth.db NTFY_AUTH_DEFAULT_ACCESS: deny-all NTFY_BEHIND_PROXY: true NTFY_ATTACHMENT_CACHE_DIR: /var/cache/ntfy/attachments labels: - traefik.enable=true - traefik.http.routers.ntfy.rule=Host(`ntfy.vds.kzntsv.site`) - traefik.http.routers.ntfy.entrypoints=websecure - traefik.http.routers.ntfy.tls.certresolver=letsEncrypt - traefik.http.services.ntfy.loadbalancer.server.port=80 networks: proxy: external: true ``` После up — `docker exec ntfy ntfy user add --role=admin vitya` → задать пароль → грант access на топики. Publish from any script: ```bash curl -u "vitya:$NTFY_PASS" \ -H "Title: VDS backup completed" \ -H "Tags: white_check_mark" \ -H "Priority: default" \ -d "Size 12.5G, 18m12s, kreknin OK" \ https://ntfy.vds.kzntsv.site/vds-backup ``` Phone subscribes to `https://ntfy.vds.kzntsv.site/vds-backup` (с basic auth) — получает уведомление. ## Decisions log - _Пусто — задача только заведена._ ## Notes - Триггер: после `[[vds-kzntsv-bootstrap]]` Phase 3 и до или одновременно с `[[vds-backup-rsync-kreknin]]` (backup pipeline хочет ntfy для статус-уведомлений). - Интегрируется с `[[vds-backup-rsync-kreknin]]` — backup script публикует через ntfy + дублируется email'ом для надёжности.