feat: Добавить автоматическое создание суперпользователей для тенантов

Реализована система автоматического создания суперпользователей при активации
новых тенантов (магазинов). Credentials читаются из .env файла.

Изменения:
- Подключен django-environ для управления переменными окружения
- Обновлен settings.py: SECRET_KEY, DEBUG, DATABASE теперь из .env
- Добавлены настройки TENANT_ADMIN_EMAIL, TENANT_ADMIN_PASSWORD, TENANT_ADMIN_NAME
- Обновлен tenants/admin.py: автоматическое создание superuser при активации
- Создан activate_tenant.py: универсальный скрипт активации заявок
- Обновлен activate_mixflowers.py: добавлено создание superuser
- Создан .gitignore для защиты секретов
- Добавлена документация TENANT_ADMIN_GUIDE.md

Использование:
1. Через админку: Заявки → Активировать (автоматически создаст superuser)
2. Через скрипт: python activate_tenant.py <schema_name>

Доступ к админке тенанта:
- URL: http://{schema_name}.localhost:8000/admin/
- Email: admin@localhost (из .env)
- Password: 1234 (из .env)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-10-27 18:20:26 +03:00
parent a55d0405ed
commit 4b44624f86
6 changed files with 1164 additions and 70 deletions

View File

@@ -0,0 +1,332 @@
# Руководство по автоматическому созданию суперпользователей для тенантов
## Обзор
При создании нового тенанта (магазина) система **автоматически** создает суперпользователя с credentials из файла `.env`. Это позволяет сразу после активации войти в админ-панель тенанта и начать работу.
---
## Настройка
### 1. Файл `.env`
В корне проекта находится файл [.env](myproject/.env) с настройками:
```env
# Настройки автоматического создания суперпользователя для новых тенантов
TENANT_ADMIN_EMAIL=admin@localhost
TENANT_ADMIN_PASSWORD=1234
TENANT_ADMIN_NAME=Admin
```
**Важно для продакшена:**
- Измените пароль на более безопасный
- Используйте надежный email
- Не коммитьте `.env` в git (уже добавлен в `.gitignore`)
### 2. Шаблон `.env.example`
Для других разработчиков создан файл [.env.example](myproject/.env.example) - скопируйте его в `.env` и настройте:
```bash
cp .env.example .env
# Отредактируйте .env своими значениями
```
---
## Как это работает
### При активации через админку
1. Заходите в админ-панель: `http://localhost:8000/admin/`
2. Раздел "Заявки на регистрацию"
3. Нажимаете кнопку "Активировать" напротив заявки
**Автоматически выполняется:**
- Создается тенант (Client)
- Создается домен ({schema_name}.localhost)
- Создается триальная подписка (90 дней)
- **Создается суперпользователь** с credentials из `.env`
- Обновляется статус заявки на "Одобрено"
### При активации через скрипт
#### Универсальный скрипт [activate_tenant.py](myproject/activate_tenant.py):
```bash
cd c:\Users\team_\Desktop\test_qwen\myproject
"c:\Users\team_\Desktop\test_qwen\venv\Scripts\python.exe" activate_tenant.py grach
```
Где `grach` - это schema_name заявки.
**Вывод скрипта:**
```
Найдена заявка: Цветы грач (grach)
Статус: Ожидает проверки
Email: owner@example.com
Начинаю активацию...
1. Создание тенанта: grach
[OK] Тенант создан (ID: 5)
2. Создание домена: grach.localhost
[OK] Домен создан (ID: 4)
3. Создание триальной подписки на 90 дней
[OK] Подписка создана (ID: 2)
Истекает: 2026-01-25 (89 дней)
4. Создание суперпользователя для тенанта
[OK] Суперпользователь создан (ID: 1)
5. Обновление статуса заявки
[OK] Заявка помечена как "Одобрено"
======================================================================
АКТИВАЦИЯ ЗАВЕРШЕНА УСПЕШНО!
======================================================================
Магазин: Цветы грач
Schema: grach
Домен: http://grach.localhost:8000/
Подписка до: 2026-01-25 (89 дней)
Доступ к админке тенанта:
URL: http://grach.localhost:8000/admin/
Email: admin@localhost
Password: 1234
======================================================================
```
---
## Доступ к админке тенанта
После создания тенанта доступ к его админ-панели:
**URL:** `http://{schema_name}.localhost:8000/admin/`
**Credentials:**
- Email: значение из `TENANT_ADMIN_EMAIL` (.env)
- Password: значение из `TENANT_ADMIN_PASSWORD` (.env)
### Пример для тенанта "grach":
```
URL: http://grach.localhost:8000/admin/
Email: admin@localhost
Password: 1234
```
### Пример для тенанта "mixflowers":
```
URL: http://mixflowers.localhost:8000/admin/
Email: admin@localhost
Password: 1234
```
---
## Создание дополнительных суперпользователей
Если нужно создать еще одного суперпользователя для конкретного тенанта, используйте скрипт [switch_to_tenant.py](myproject/switch_to_tenant.py):
```bash
cd c:\Users\team_\Desktop\test_qwen\myproject
"c:\Users\team_\Desktop\test_qwen\venv\Scripts\python.exe" switch_to_tenant.py grach
```
Откроется интерактивная оболочка Python в контексте тенанта "grach":
```python
# Вы уже находитесь в схеме тенанта
from django.contrib.auth import get_user_model
User = get_user_model()
user = User.objects.create_superuser(
email='another_admin@localhost',
name='Another Admin',
password='password123'
)
print(f'Создан пользователь: {user.email}')
```
---
## Технические детали
### Модель пользователя
Проект использует кастомную модель пользователя [CustomUser](myproject/accounts/models.py):
- **USERNAME_FIELD** = `email` (вход по email, а не username)
- **REQUIRED_FIELDS** = `['name']` (обязательно имя)
- Username автоматически = email для совместимости
### Метод создания суперпользователя
```python
User.objects.create_superuser(
email='admin@localhost', # из TENANT_ADMIN_EMAIL
name='Admin', # из TENANT_ADMIN_NAME
password='1234' # из TENANT_ADMIN_PASSWORD
)
```
### Переключение между схемами
```python
from django.db import connection
from tenants.models import Client
# Переключиться на тенанта
client = Client.objects.get(schema_name='grach')
connection.set_tenant(client)
# Теперь все запросы к БД идут в схему "grach"
User.objects.all() # Пользователи тенанта "grach"
# Вернуться в public схему
public_tenant = Client.objects.get(schema_name='public')
connection.set_tenant(public_tenant)
```
---
## Безопасность
### Для локальной разработки
Текущие настройки подходят:
```env
TENANT_ADMIN_EMAIL=admin@localhost
TENANT_ADMIN_PASSWORD=1234
TENANT_ADMIN_NAME=Admin
```
### Для продакшена
**ОБЯЗАТЕЛЬНО измените:**
1. **Пароль:**
```env
TENANT_ADMIN_PASSWORD=сложный-случайный-пароль-min-16-символов
```
2. **Email:**
```env
TENANT_ADMIN_EMAIL=admin@yourdomain.com
```
3. **Дополнительно:**
- Включите двухфакторную аутентификацию (2FA)
- Настройте IP whitelist для админки
- Используйте HTTPS
- Регулярно меняйте пароль
---
## Частые вопросы
### Q: Как изменить пароль для существующих тенантов?
A: Используйте скрипт `switch_to_tenant.py`:
```bash
python switch_to_tenant.py grach
```
Затем в интерактивной оболочке:
```python
from django.contrib.auth import get_user_model
User = get_user_model()
user = User.objects.get(email='admin@localhost')
user.set_password('новый-пароль')
user.save()
print(f'Пароль обновлен для {user.email}')
```
### Q: Что если я забыл пароль от админки тенанта?
A: Используйте тот же метод что выше для сброса пароля.
### Q: Можно ли использовать разные пароли для разных тенантов?
A: Сейчас все тенанты получают одинаковые credentials из `.env`. Если нужны уникальные пароли для каждого тенанта:
1. Вариант A: Генерируйте случайный пароль при создании и сохраняйте в notes тенанта
2. Вариант B: Отправляйте credentials на email владельца
3. Вариант C: Требуйте смены пароля при первом входе
### Q: Как дать доступ владельцу магазина?
A: Есть несколько вариантов:
**Вариант 1:** Использовать тот же email `admin@localhost` (быстро для разработки)
**Вариант 2:** Создать отдельного пользователя для владельца:
```python
python switch_to_tenant.py grach
# В оболочке:
from django.contrib.auth import get_user_model
User = get_user_model()
owner = User.objects.create_superuser(
email='owner@grach.com', # Email владельца из заявки
name='Владелец магазина',
password='временный-пароль'
)
```
Затем отправьте владельцу:
- URL: `http://grach.localhost:8000/admin/`
- Email: `owner@grach.com`
- Password: `временный-пароль`
- Попросите сменить пароль при первом входе
---
## Обновленные файлы
1. [.env](myproject/.env) - переменные окружения (НЕ коммитить!)
2. [.env.example](myproject/.env.example) - шаблон для разработчиков
3. [settings.py](myproject/myproject/settings.py) - подключен django-environ
4. [tenants/admin.py](myproject/tenants/admin.py) - автосоздание суперпользователя
5. [activate_tenant.py](myproject/activate_tenant.py) - универсальный скрипт активации
6. [.gitignore](myproject/.gitignore) - защита секретов
---
## Примеры использования
### Сценарий 1: Активация новой заявки через админку
```
1. http://localhost:8000/admin/ → вход как супер-админ
2. Заявки на регистрацию → найти pending заявку
3. Нажать "Активировать"
4. Готово! Доступ: http://{schema_name}.localhost:8000/admin/
```
### Сценарий 2: Активация через скрипт
```bash
cd c:\Users\team_\Desktop\test_qwen\myproject
"c:\Users\team_\Desktop\test_qwen\venv\Scripts\python.exe" activate_tenant.py myshop
```
### Сценарий 3: Вход в админку тенанта
```
1. Открыть: http://myshop.localhost:8000/admin/
2. Email: admin@localhost
3. Password: 1234
4. Готово!
```
---
**Вопросы?** Проверьте логи Django или обратитесь к документации по django-tenants.