Files
admin/vds-ntfy-push.md
vitya f9bdb97be3 docs(.wiki,.tasks): vds-kzntsv-bootstrap done — 3 phases shipped
VDS Rusonyx 160 NVMe (89.253.255.94 / vds.kzntsv.site) активирован
2026-05-20. 3 фазы за ~6 часов:

- Phase 1: harden + docker 29.5.1 + traefik v2.11 + portainer 2.21.5
- Phase 2: shared DB park (postgres 16 / mariadb 11.4 / mongo 7 /
  redis 7) via traefik raw TCP forward + self-signed TLS
- Phase 3: миграция gitea (132 repos), verdaccio (2063 pkgs), registry
  fresh install (user accepted loss old images) + Joxit GUI

Ingest 1 source + 1 entity (vds-kzntsv) + 6 concepts (traefik-tcp-
passthrough-vs-starttls / portainer-2.21-admin-password-regression /
db-tls-self-signed-via-traefik-raw-tcp / rusonyx-vps-onboarding-quirks
/ registry-gc-mount-and-modify-flag / compose-bcrypt-escape-trap).

3 follow-up  tasks: vds-gc-cron, vds-backup-rsync-kreknin, vds-ntfy-push.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 22:39:31 +03:00

3.2 KiB
Raw Blame History

vds-ntfy-push

Goal

Self-host 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 на телефоне.
  • 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:

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:

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'ом для надёжности.