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:
332
myproject/TENANT_ADMIN_GUIDE.md
Normal file
332
myproject/TENANT_ADMIN_GUIDE.md
Normal 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.
|
||||
Reference in New Issue
Block a user