Files
admin/.tasks/unify-backup-notifications.md
vitya 838f51daa8 tasks(unify-backup-notifications): close 🟢 — unified push+email across VDS/RUVDS/windows-host
Acceptance:
- 3 scripts (VDS bash + RUVDS ps1 + windows-host ps1) синхронизированы под
  unified push + email format (commit 73ad6dd0).
- VDS deployed + smoke ntfy+email ✓.
- RUVDS deployed + smoke ntfy+email ✓.
- windows-host smoke + deploy — closed-by-inspection per user direction
  «все ок»: parser-check достаточно, deploy.ps1 готов для self-deploy
  elevated PS у user'а. Без deploy сегодня ночью 03:00 MSK прогон в
  STAROM format'е (cosmetic, не functional regression).

Также атомарный revert (`.bak-pre-unify` на каждом хосте) задокументирован
в .tasks/unify-backup-notifications.md § Closed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 07:30:30 +03:00

10 KiB
Raw Blame History

unify-backup-notifications

Goal

Привести notification-формат всех 3 backup-pipelines (VDS, RUVDS, windows-host) к единому виду: один формат для ntfy push + один формат для email. Сейчас у каждого хоста свой стиль — subject [VDS] backup OK vs RUVDS backup -- SUCCESS vs windows-host backup -- SUCCESS, тэги white_check_mark vs green_circle, body — то 1 строка с MSG, то структурированный block. На phone-side фильтрация и desktop-side чтение должны быть predictable.

Параллельно — закрыть drift VDS-скрипта от общего pattern'а: RUVDS+windows-host лежат в scripts/<task-slug>/run.ps1 локально, VDS жил только на remote (/opt/stacks/backup/scripts/run.sh). Импортирую как scripts/vds-backup-rsync-kreknin/run.sh (canonical source), правлю локально, deploy.

Scope (что меняем — TOLKO notification block, backup-logic не трогаем)

Push (ntfy) — единый формат, 1 строка

Топик: vds-backup (уже общий для 3 хостов). Tags: green_circle (OK) / red_circle (FAILED). Priority: default / high.

Title: <HOST> backup OK <date>
Body:  <duration_human>, size=<size>, snapshots=<count>, dest=kreknin:<path>

Title: <HOST> backup FAILED <date>
Body:  After <duration_human>: <error>. See <logpath>

Где <HOST> ∈ {VDS, RUVDS, windows-host}. <duration_human> = Xm YYs (e.g. 21m07s, 0m45s).

Email — единый формат, structured multi-line

Subject: [<HOST>] backup <STATUS> <date> где STATUS ∈ {OK, FAILED}.

Body (success):

<HOST> daily backup completed successfully.

Date:      <date>
Duration:  <duration_human>
Size:      <size>
Snapshots: <count>
Source:    <hostname> (<ip>)
Dest:      kreknin:<path>

Components:
- <component 1>
- <component 2>
...

Log: <log-path>

Body (failure):

<HOST> daily backup FAILED.

Date:     <date>
Duration: <duration_human>
Error:    <error>
Source:   <hostname> (<ip>)
Log:      <log-path>

Tail (last 40 lines):
<tail>

Key files

  • scripts/vds-backup-rsync-kreknin/run.sh — bash, deployed to VDS /opt/stacks/backup/scripts/run.sh. Functions: notify() (ntfy), email_send() (msmtp). Callers — line 122-123 (success) + 49-53 (failure).
  • scripts/ruvds-backup-daily-kreknin/run.ps1 — PS1, deployed to RUVDS C:\ProgramData\backup\run.ps1. Functions: Notify-Ntfy + Notify-Email. Callers — line 140-161 (success) + 169-170 (failure).
  • scripts/windows-host-fallback-backup-daily/run.ps1 — PS1, deployed to windows-host C:\ProgramData\backup\run.ps1. Same function names. Callers — line 169-189 (success) + 197-198 (failure).

Implementation steps

  1. Edit VDS run.sh: добавить [<HOST>] backup <STATUS> <date> email-subject, structured body для success+failure, ntfy tags на green_circle/red_circle.
  2. Edit RUVDS run.ps1: переписать success+failure ntfy+email callers под унифицированный format. Поменять subject на [RUVDS] backup OK <date> etc.
  3. Edit windows-host run.ps1: same.
  4. Deploy:
    • windows-host: Copy-Item scripts/windows-host-.../run.ps1 → C:\ProgramData\backup\run.ps1 (elevated; user может потребоваться UAC).
    • RUVDS: scp to C:\ProgramData\backup\run.ps1 через ssh-key.
    • VDS: scp + sudo install to /opt/stacks/backup/scripts/run.sh.
  5. Smoke: вызвать notify + email_send (или их PS-аналог) с mock success-data на каждом хосте — не запускать полный backup (21-80 min), только проверить, что новые format-strings проходят через каналы.
  6. Verify user-side: phone ntfy app получил, gmail получил, форматы единые.
  7. Commit + push.

Acceptance

  • 3 scripts в scripts/ имеют идентичный notification-block (modulo language: bash vs ps1).
  • ntfy push для всех 3: title = <HOST> backup OK <date>, body = <duration>, size=<>, snapshots=<>, dest=kreknin:<>, tags green_circle.
  • Email subject для всех 3: [<HOST>] backup OK <date>. Body — единый template.
  • Failure path: title <HOST> backup FAILED <date>, subject [<HOST>] backup FAILED <date>, tags red_circle, body — единый.
  • Smoke от VDS + RUVDS через notify-channels: push приходит, email приходит. (2026-05-25)
  • Smoke от windows-host — closed by inspection (user-decision: parser-check достаточно, doверяем).
  • Deploy на windows-host — closed by inspection (user принимает self-deploy elevated, scripts/.../deploy.ps1 ready, user-side action).
  • User-verify: TEST из VDS + RUVDS — confirmed («все ок» 2026-05-25).

Closed

2026-05-25 — task closed по user-direction «закрывай задачу, все ок».

State at close:

  • 3 scripts (scripts/vds-backup-rsync-kreknin/run.sh + scripts/ruvds-backup-daily-kreknin/run.ps1 + scripts/windows-host-fallback-backup-daily/run.ps1) синхронизированы под unified push+email format. Committed 73ad6dd0, pushed origin/master.
  • VDS deployed (sha256=27b09ca272bb, smoke ntfy+email ✓).
  • RUVDS deployed (sha256=f3bb57a86af5, smoke ntfy+email ✓).
  • windows-host pending self-deploy user'ом через scripts/windows-host-fallback-backup-daily/deploy.ps1 (elevated PS, UAC required). До deploy'а — сегодня ночью 03:00 MSK прогон в STAROM format'е (не функциональный regression, только cosmetic differ от VDS+RUVDS на одну ночь).

Atomic revert (если что — на каждом хосте есть .bak-pre-unify):

  • VDS: ssh vitya@vds.kzntsv.site 'sudo install -m 755 -o root -g root /opt/stacks/backup/scripts/run.sh.bak-pre-unify /opt/stacks/backup/scripts/run.sh'
  • RUVDS: ssh -i ~/.ssh/ruvds-iis-migration Administrator@80.64.31.36 'powershell Move-Item C:\ProgramData\backup\run.ps1.bak-pre-unify C:\ProgramData\backup\run.ps1 -Force'
  • windows-host: elevated PS Move-Item C:\ProgramData\backup\run.ps1.bak-pre-unify C:\ProgramData\backup\run.ps1 -Force (если уже deployed когда-то).

Completed steps

  • 2026-05-25: spec написана + STATUS.md обновлён, task 🔴 active.
  • 2026-05-25: VDS run.sh импортирован из vds.kzntsv.site:/opt/stacks/backup/scripts/run.sh в scripts/vds-backup-rsync-kreknin/run.sh — closes drift из общего scripts/<slug>/ pattern.
  • 2026-05-25: 3 scripts edited: VDS bash + RUVDS ps1 + WHOST ps1. Notify helpers (notify/Notify-Ntfy/Notify-Email) сохранены, callers переписаны под unified format. Parser-check ✓ всех 3 (bash -n / [Parser]::ParseFile).
  • 2026-05-25: VDS deployed: scp /tmp/run.sh.new + sudo install -m 755 -o root -g root/opt/stacks/backup/scripts/run.sh. SHA256=27b09ca272bb match. Backup pre-unify в .bak-pre-unify.
  • 2026-05-25: RUVDS deployed: scpC:\ProgramData\backup\run.ps1.newMove-Item -Force. SHA256=f3bb57a86af5 match. Backup в .bak-pre-unify.
  • 2026-05-25: VDS smoke notify ✓: ntfy + email sent с TEST-prefix через bash -c "source .env; ..." snippet.
  • 2026-05-25: RUVDS smoke notify ✓: SCP + run smoke-notify.ps1ntfy_ok + email_ok.
  • 2026-05-25: windows-host smoke-notify.ps1 + deploy.ps1 подготовлены в scripts/windows-host-fallback-backup-daily/. Pending elevated execution user'ом.

Decisions log

  • 2026-05-25 (task creation): выбран green_circle/red_circle поверх white_check_mark/warning (VDS-default). Reason: visually distinct на phone, RUVDS+windows-host уже используют circle-style.
  • 2026-05-25: OK вместо SUCCESS в subject — shorter, у VDS уже было OK.
  • 2026-05-25: square brackets в subject ([HOST]) — у VDS уже было, читается лучше при filter'е в gmail.
  • 2026-05-25: Failure body — sequential для всех 3 (Date / Duration / Error / Source / Log / Tail). У VDS уже был tail-of-log; экстендим на RUVDS+WHOST.
  • 2026-05-25: VDS run.sh импортирован в repo как scripts/vds-backup-rsync-kreknin/run.sh — closes drift из общего pattern (scripts/<slug>/). Deploy = scp + sudo install обратно на VDS.

Open questions

  • Snapshots count для RUVDS/WHOST. VDS делает ls -1d $DEST_BASE/20*-*-* | wc -l через SSH. RUVDS/WHOST используют rclone — нужен rclone lsd | wc -l или повторное использование $existing из retention-prune step. Включим в edit.
  • Size: VDS = du -sh dest_path (post-rsync, accurate), RUVDS/WHOST = source bytes Get-ChildItem. Standardize? Слишком expensive делать rclone size на dest (extra round-trip). Решение: keep source bytes для RUVDS/WHOST, dest du для VDS — оба отображают «size of dataset» одинаково adequately. В email можно подписать как Size: <X> GB, не различая источник.
  • Source IP/hostname: hardcode (VDS=89.253.255.94, RUVDS=80.64.31.36, windows-host=94.19.247.14) vs $(hostname -I) / $env:COMPUTERNAME. Hardcode — short-term, проще; для prod-grade нужен detect.

Notes

  • Связано: vds-backup-rsync-kreknin 🟢, ruvds-backup-daily-kreknin 🟢, windows-host-fallback-backup-daily 🟢 — все 3 продакшн уже работают. Эта таска — cosmetic + observability unification, не функциональная.
  • Атомарный revert: git revert HEAD + redeploy 3-х previous scripts. Pre-edit content закоммичен.