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>
10 KiB
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 RUVDSC:\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-hostC:\ProgramData\backup\run.ps1. Same function names. Callers — line 169-189 (success) + 197-198 (failure).
Implementation steps
- Edit VDS
run.sh: добавить[<HOST>] backup <STATUS> <date>email-subject, structured body для success+failure, ntfy tags наgreen_circle/red_circle. - Edit RUVDS
run.ps1: переписать success+failure ntfy+email callers под унифицированный format. Поменять subject на[RUVDS] backup OK <date>etc. - Edit windows-host
run.ps1: same. - Deploy:
- windows-host:
Copy-Item scripts/windows-host-.../run.ps1 → C:\ProgramData\backup\run.ps1(elevated; user может потребоваться UAC). - RUVDS:
scptoC:\ProgramData\backup\run.ps1через ssh-key. - VDS:
scp+sudo installto/opt/stacks/backup/scripts/run.sh.
- windows-host:
- Smoke: вызвать
notify+email_send(или их PS-аналог) с mock success-data на каждом хосте — не запускать полный backup (21-80 min), только проверить, что новые format-strings проходят через каналы. - Verify user-side: phone ntfy app получил, gmail получил, форматы единые.
- 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:<>, tagsgreen_circle. - Email subject для всех 3:
[<HOST>] backup OK <date>. Body — единый template. - Failure path: title
<HOST> backup FAILED <date>, subject[<HOST>] backup FAILED <date>, tagsred_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. Committed73ad6dd0, 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=27b09ca272bbmatch. Backup pre-unify в.bak-pre-unify. - 2026-05-25: RUVDS deployed:
scp→C:\ProgramData\backup\run.ps1.new→Move-Item -Force. SHA256=f3bb57a86af5match. 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.ps1→ntfy_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 закоммичен.