Phase 3.5 — еженедельный бэкап KV (setup для Windows Task Scheduler)

Phase 3.5 Способа 3. Скрипт backup-kv.ps1 запускается раз в неделю, скачивает дамп KV-namespace ICT_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-автора

Требования (одноразовая настройка)

  1. PowerShell 5.1+ (встроен в Windows). PowerShell Core 7+ тоже работает.
  2. 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, NextRunTime

LastTaskResult = 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