diff --git a/backend/MANAGE_USERS.md b/backend/MANAGE_USERS.md new file mode 100644 index 0000000..5df785a --- /dev/null +++ b/backend/MANAGE_USERS.md @@ -0,0 +1,163 @@ +# Управление пользователями панели + +Публичная регистрация в панели **закрыта** — это сделано из соображений +безопасности, чтобы никто посторонний не мог зайти и создавать себе VPS +через ваш Proxmox. + +Все учётные записи создаёт администратор одним из способов: + +1. **Через CLI внутри контейнера backend** (рекомендуемый способ). +2. **Через эндпоинт `/admin/users` POST** (уже залогинившись как админ). +3. **Через UI → Admin → Users → «Создать»** (если добавите такую кнопку + в `frontend/src/pages/AdminUsers.jsx`). + +Документ описывает первый способ — CLI. + +--- + +## 1. Базовый вызов + +```bash +docker compose exec backend python -m app.manage_users <команда> [аргументы] +``` + +> `app.manage_users` уже лежит в репозитории (`backend/app/manage_users.py`) +> и автоматически попадает в образ backend — отдельно класть его в Dockerfile +> не нужно. + +### Все команды + +```text +list — список всех пользователей +create [admin|client] — создать пользователя +activate — включить (is_active=True) +deactivate — выключить (is_active=False) +set-role — сменить роль +reset-password — сменить пароль +delete — удалить пользователя +``` + +Если пароль не указан в аргументах — CLI безопасно спросит его +интерактивно через `getpass` (символы не отображаются в терминале). + +--- + +## 2. Типовые сценарии + +### 2.1. Первый запуск панели — создать админа + +> Самый первый пользователь создаётся **не через CLI**, а через bootstrap: +> при пустой БД endpoint `POST /auth/register` остаётся открытым и создаёт +> админа. Если вы только что подняли панель — зайдите на страницу +> `/register`, заполните форму один раз и получите admin-аккаунт. +> Сразу после этого вход через `/register` закрывается навсегда. + +```bash +# Способ через CLI (если вы предпочитаете не использовать /register): +docker compose exec backend python -m app.manage_users \ + create admin@example.com 'StrongP@ssw0rd!' admin +``` + +### 2.2. Создать обычного клиента + +```bash +docker compose exec backend python -m app.manage_users \ + create ivan@example.com 'TempP@ss123' client +``` + +Клиент сразу сможет войти (`is_active=True` по умолчанию) и видеть +доступные шаблоны VPS. + +### 2.3. Временно отключить пользователя + +```bash +docker compose exec backend python -m app.manage_users deactivate ivan@example.com +# Пользователь не сможет войти, его VPS остаются. + +docker compose exec backend python -m app.manage_users activate ivan@example.com +# Вернуть доступ. +``` + +### 2.4. Сделать пользователя админом (или наоборот) + +```bash +docker compose exec backend python -m app.manage_users set-role ivan@example.com admin +``` + +> ⚠️ CLI не даст понизить **единственного** активного администратора — +> сначала создайте/назначьте другого admin. + +### 2.5. Сбросить пароль + +```bash +docker compose exec backend python -m app.manage_users \ + reset-password ivan@example.com 'NewP@ssw0rd' +# или интерактивно (пароль не светится в истории): +docker compose exec backend python -m app.manage_users reset-password ivan@example.com +``` + +### 2.6. Удалить пользователя + +```bash +docker compose exec backend python -m app.manage_users delete ivan@example.com +``` + +> Это удалит запись пользователя из БД. **Его VPS в Proxmox останутся** — +> панель их создаёт через API, и они живут независимо. Если хотите удалить +> и VPS — сделайте это через UI Proxmox или дашборд панели до удаления +> пользователя. + +### 2.7. Посмотреть всех пользователей + +```bash +docker compose exec backend python -m app.manage_users list +``` + +Вывод: + +```text + ID EMAIL ROLE ACTIVE CREATED_AT +------------------------------------------------------------------------------ + 3 ivan@example.com client да 2026-08-10 12:34 + 2 petr@example.com client нет 2026-08-10 11:02 + 1 admin@example.com admin да 2026-08-09 22:11 +``` + +--- + +## 3. Защитные ограничения CLI + +Скрипт намеренно блокирует опасные операции: + +- **Нельзя удалить или понизить единственного активного admin** — защита + от случайной потери единственного администратора. Если вам кажется, + что это окей — сделайте это через прямой SQL-запрос к БД + (`docker compose exec db psql ...`), приняв на себя ответственность. +- **Пароль должен быть не короче 6 символов** (как и в UI). +- **Email нормализуется** (lowercase + trim), чтобы `User@Example.com` + и `user@example.com` не оказались разными пользователями. + +--- + +## 4. Локальный запуск без Docker + +Если вы разрабатываете панель вне Docker и используете SQLite из `config.py`: + +```bash +cd backend +python -m app.manage_users create admin@example.com password admin +``` + +Скрипт читает `DATABASE_URL` из окружения или `.env` (`backend/.env`), +так что работает и в dev-режиме, и в проде. + +--- + +## 5. Если что-то пошло не так + +| Симптом | Причина | Решение | +|---|---|---| +| `ModuleNotFoundError: No module named 'app'` | запускаете не из `backend/` | добавьте `cd backend` либо укажите `PYTHONPATH=/app:$PYTHONPATH` | +| `OperationalError: connection refused` | БД ещё не стартовала | подождите, пока `docker compose ps` покажет `db` healthy | +| `❌ Пользователь уже существует` | дубль email | проверьте `list` — возможно, регистрировались раньше | +| `❌ Нельзя понизить единственного администратора` | защита CLI | создайте второго admin, затем понизьте первого |