Files
octopus/myproject/TENANT_ADMIN_GUIDE.md
Andrey Smakotin 4b44624f86 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>
2025-10-27 18:20:26 +03:00

333 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Руководство по автоматическому созданию суперпользователей для тенантов
## Обзор
При создании нового тенанта (магазина) система **автоматически** создает суперпользователя с 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.