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