6eefb70ce7
control-panel.ps1 расширена: - Бэкап БД [B] (копия learnspace.db+wal/shm с датой в data/backups) и восстановление [R] (выбор из списка, страховочная копия .pre-restore, авто-стоп/старт сервера). - Умный статус: health-пинг /api/health (+ms), размер БД, кол-во пользователей, последняя миграция (db-status.js), версия Node, сводка .env (CLIENT_ORIGIN/JWT/LLM). Кэш в . - Создать админа [A] → scripts/create-admin.js (bcrypt, upsert role=admin, busy_timeout). - Сторож [W]: авто-перезапуск при падении (выход по клавише). Логи в backend/logs (не %TEMP%), [E] ошибки из логов. Фиксы PS 5.1: порт/путь БД читаются из .env (inline node -e с кавычками 5.1 ломает); db-status вынесен в файл-скрипт; миграция по filename DESC; UTF-8 BOM, парсинг OK. Меню — лат.+рус. клавиши. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
43 lines
2.4 KiB
JavaScript
43 lines
2.4 KiB
JavaScript
'use strict';
|
|
/* create-admin.js — создать или повысить пользователя до администратора.
|
|
*
|
|
* Запуск (значения через переменные окружения, чтобы пароль не светился в argv):
|
|
* ADMIN_EMAIL=a@b.c ADMIN_PASSWORD=secret12 ADMIN_NAME="Имя" node scripts/create-admin.js
|
|
* Используется панелью управления (control-panel.ps1, пункт «Создать админа»).
|
|
*
|
|
* Если пользователь с таким email уже есть — обновляет пароль/имя, ставит role='admin'
|
|
* и инкрементит token_version (старые токены становятся недействительны). Иначе создаёт.
|
|
*/
|
|
const path = require('path');
|
|
const bcrypt = require('bcryptjs');
|
|
const { DatabaseSync } = require('node:sqlite');
|
|
|
|
const email = String(process.env.ADMIN_EMAIL || '').trim().toLowerCase();
|
|
const password = String(process.env.ADMIN_PASSWORD || '');
|
|
const name = String(process.env.ADMIN_NAME || '').trim() || 'Администратор';
|
|
|
|
function fail(msg) { console.error('✗ ' + msg); process.exit(1); }
|
|
|
|
if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) fail('Некорректный email (ADMIN_EMAIL).');
|
|
if (password.length < 8) fail('Пароль минимум 8 символов (ADMIN_PASSWORD).');
|
|
|
|
const DB = process.env.DB_PATH || path.join(__dirname, '..', 'data', 'learnspace.db');
|
|
const db = new DatabaseSync(DB);
|
|
try { db.exec('PRAGMA busy_timeout=4000'); } catch (_) {} // подождать, если сервер пишет
|
|
|
|
(async () => {
|
|
const hash = await bcrypt.hash(password, 12);
|
|
const existing = db.prepare('SELECT id, role FROM users WHERE email = ?').get(email);
|
|
if (existing) {
|
|
db.prepare(`UPDATE users SET password_hash = ?, name = ?, role = 'admin',
|
|
token_version = COALESCE(token_version,0) + 1 WHERE id = ?`)
|
|
.run(hash, name, existing.id);
|
|
console.log(`✓ Пользователь ${email} обновлён: роль admin, новый пароль (id=${existing.id}).`);
|
|
} else {
|
|
const r = db.prepare(`INSERT INTO users (email, password_hash, name, role) VALUES (?,?,?, 'admin')`)
|
|
.run(email, hash, name);
|
|
console.log(`✓ Создан администратор ${email} (id=${r.lastInsertRowid}).`);
|
|
}
|
|
db.close();
|
|
})().catch(e => fail(e.message));
|