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