Реализована система автоматического создания суперпользователей при активации новых тенантов (магазинов). 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>
333 lines
11 KiB
Markdown
333 lines
11 KiB
Markdown
# Руководство по автоматическому созданию суперпользователей для тенантов
|
||
|
||
## Обзор
|
||
|
||
При создании нового тенанта (магазина) система **автоматически** создает суперпользователя с 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.
|