feat(control-panel): сброс системы «чистый запуск» (с бэкапом и подтверждением)

Пункт [Z] в control-panel.ps1: предпросмотр → бэкап БД → подтверждение вводом
«СБРОС» → очистка. Скрипт backend/scripts/reset-system.js (dry-run по умолчанию,
выполнение только с --apply --confirm=RESET):
• сохраняет одного админа (min id), переназначает ему авторский контент
  (courses/tests/flashcard_decks/custom_sims/шаблоны/библиотека/lab-ссылки/board);
• стирает всех остальных пользователей + классы/задания/сессии/геймификацию/
  уведомления/прогресс/историю классрума/доступы/логи;
• сохраняет контент: учебники, вопросы, темы, уроки, exam-prep, симуляции,
  биохимия, красная книга, магазин/достижения-определения, роли/права, app_settings;
• обнуляет игровые счётчики админа; классифицирует ВСЕ 119 таблиц, неизвестные не трогает;
• FK off + транзакция + foreign_key_check + VACUUM.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-06-23 11:32:44 +03:00
parent c6d323ec6d
commit 205290139d
2 changed files with 200 additions and 0 deletions
+26
View File
@@ -183,6 +183,30 @@ function Backup-Db {
Prune-Backups
}
function Reset-System {
Write-Host ''
Write-Host ' ============================================================' -ForegroundColor Red
Write-Host ' ВНИМАНИЕ: ЧИСТЫЙ ЗАПУСК - НЕОБРАТИМАЯ ОЧИСТКА' -ForegroundColor Red
Write-Host ' ============================================================' -ForegroundColor Red
Write-Host ' УДАЛЯТСЯ: все пользователи (кроме одного админа), классы,' -ForegroundColor Yellow
Write-Host ' задания, сессии, геймификация, уведомления, прогресс, история.' -ForegroundColor Yellow
Write-Host ' СОХРАНЯТСЯ: учебники, вопросы, тесты, курсы, уроки, exam-prep,' -ForegroundColor Gray
Write-Host ' симуляции, настройки/права и один админ (контент переходит ему).' -ForegroundColor Gray
Write-Host ''
Write-Host ' План (предпросмотр, без изменений):' -ForegroundColor Cyan
try { & node scripts/reset-system.js | Out-Host } catch { Write-Host (' Ошибка плана: ' + $_.Exception.Message) -ForegroundColor Red; return }
Write-Host ''
$ans = (Read-Host ' Для подтверждения введите СБРОС (иначе отмена)').Trim().ToUpper()
if ($ans -ne 'СБРОС' -and $ans -ne 'RESET') { Write-Host ' Отменено.' -ForegroundColor Yellow; return }
if (Server-Proc) { Write-Host ' Сервер работает - остановите его ([2]) перед сбросом для надёжности.' -ForegroundColor Yellow }
Write-Host ' Шаг 1/2: бэкап БД...' -ForegroundColor Cyan
Backup-Db
Write-Host ' Шаг 2/2: очистка...' -ForegroundColor Cyan
try { & node scripts/reset-system.js --apply --confirm=RESET | Out-Host }
catch { Write-Host (' Ошибка сброса: ' + $_.Exception.Message) -ForegroundColor Red; return }
Write-Host ' Готово. Перезапустите сервер ([3]). Бэкап сохранён в data\backups.' -ForegroundColor Green
}
function Restore-Db {
if (-not (Test-Path $script:BackupDir)) { Write-Host ' Папки бэкапов нет — сначала сделайте бэкап ([B]).' -ForegroundColor Yellow; return }
$files = @(Get-ChildItem $script:BackupDir -Filter 'learnspace-*.db' -ErrorAction SilentlyContinue | Sort-Object LastWriteTime -Descending)
@@ -389,6 +413,7 @@ while ($run) {
Menu-Row '[5]' 'Применить миграции' '[A]' 'Создать админа'
Menu-Row ' ' '' '[W]' 'Сторож (авто-рестарт)'
Menu-Row ' ' '' '[E]' 'Ошибки в логах'
Menu-Row ' ' '' '[Z]' 'Сброс системы (чистый запуск)'
Write-Host ''
Menu-Head 'ДИАГНОСТИКА И ПРОЧЕЕ' ''
Write-Host ' ' -NoNewline
@@ -417,6 +442,7 @@ while ($run) {
'^(U|Г)$' { Run-Cmd 'Обновление из репозитория' { Update-FromRepo }; Refresh-Status }
'^(W|Ц)$' { Watchdog; Refresh-Status }
'^(E|У)$' { Run-Cmd 'Ошибки в логах' { Show-Errors } }
'^(Z|Я)$' { Reset-System; Refresh-Status; Start-Sleep 1 }
'^0$' { $run = $false }
default { }
}