Phase 3.5 — еженедельный бэкап KV (setup для Windows Task Scheduler)
Phase 3.5 Способа 3. Скрипт
backup-kv.ps1запускается раз в неделю, скачивает дамп KV-namespaceICT_PROGRESSчерезGET /api/admin/backupи сохраняет в90-Resources/backups/kv-YYYY-MM-DD.json. Хранит 12 последних бэкапов (≈3 месяца).
Что бэкапится
Все ключи KV-namespace ICT_PROGRESS:
learners— реестр учеников (admin + students)progress:{token}:*— прогресс уроков / задач / семинаров / трейдов / бэктестовchat:{token}:*— архивы AI-чатовcomments:{token}:*— комментарии Senat-автора
Требования (одноразовая настройка)
- PowerShell 5.1+ (встроен в Windows). PowerShell Core 7+ тоже работает.
ICT_AUTHOR_TOKEN— env-переменная с admin-токеном, доступная для Task Scheduler.
Установка env-переменной (User-level, переживает рестарт)
[Environment]::SetEnvironmentVariable("ICT_AUTHOR_TOKEN", "senat-author-mock-67890", "User")После Phase 3.6 заменить mock на реальный admin-токен.
Регистрация плановой задачи
Шаг 1 — открыть PowerShell от обычного пользователя (не админ)
Задача регистрируется в User-scope, чтобы при выполнении был доступ к env-переменной ICT_AUTHOR_TOKEN.
Шаг 2 — выполнить блок (по аналогии с ICT-Git-AutoPush-Daily)
$Action = New-ScheduledTaskAction `
-Execute "powershell.exe" `
-Argument '-ExecutionPolicy Bypass -NoProfile -File "C:\Obsidian\ewa\ICT\Обучение ICT\_worker\scripts\backup-kv.ps1"'
$Trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Sunday -At 3am
$Settings = New-ScheduledTaskSettingsSet `
-AllowStartIfOnBatteries `
-DontStopIfGoingOnBatteries `
-StartWhenAvailable `
-RunOnlyIfNetworkAvailable
$Principal = New-ScheduledTaskPrincipal `
-UserId $env:USERNAME `
-LogonType S4U `
-RunLevel Limited
Register-ScheduledTask `
-TaskName "ICT-KV-Backup-Weekly" `
-Description "Phase 3.5 Способа 3 — еженедельный бэкап KV в 90-Resources/backups/" `
-Action $Action -Trigger $Trigger -Settings $Settings -Principal $PrincipalШаг 3 — тестовый запуск
Start-ScheduledTask -TaskName "ICT-KV-Backup-Weekly"Через ~10 сек проверить:
Get-ScheduledTaskInfo -TaskName "ICT-KV-Backup-Weekly" | Select LastRunTime, LastTaskResult, NextRunTimeLastTaskResult = 0 → успех. Файл 90-Resources/backups/kv-2026-05-14.json должен появиться. Лог — 90-Resources/scripts/logs/backup-kv-2026-05-14.log.
Ручной запуск (без Task Scheduler)
cd "C:\Obsidian\ewa\ICT\Обучение ICT\_worker"
.\scripts\backup-kv.ps1Восстановление из бэкапа
cd "C:\Obsidian\ewa\ICT\Обучение ICT\_worker"
# Извлечь `data` поле из бэкапа в отдельный JSON
$backup = Get-Content "..\90-Resources\backups\kv-YYYY-MM-DD.json" -Raw | ConvertFrom-Json
$backup.data | ConvertTo-Json -Depth 10 -Compress | Out-File restore.json -Encoding UTF8
# Для каждого ключа — wrangler kv key put (этот шаг ручной — restore это редкая операция)
# Например, для одного ключа:
# $val = $backup.data.learners | ConvertTo-Json -Depth 10 -Compress
# $val | Out-File -FilePath learners.json -Encoding UTF8 -NoNewline
# wrangler kv key put learners --path learners.json --binding ICT_PROGRESS --remote --preview falseДеактивация / удаление задачи
Unregister-ScheduledTask -TaskName "ICT-KV-Backup-Weekly" -Confirm:$false