164 lines
7.6 KiB
Markdown
164 lines
7.6 KiB
Markdown
# Управление пользователями панели
|
||
|
||
Публичная регистрация в панели **закрыта** — это сделано из соображений
|
||
безопасности, чтобы никто посторонний не мог зайти и создавать себе 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 <email> <password> [admin|client] — создать пользователя
|
||
activate <email> — включить (is_active=True)
|
||
deactivate <email> — выключить (is_active=False)
|
||
set-role <email> <admin|client> — сменить роль
|
||
reset-password <email> <new_password> — сменить пароль
|
||
delete <email> — удалить пользователя
|
||
```
|
||
|
||
Если пароль не указан в аргументах — 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, затем понизьте первого |
|