Реализована система автоматического создания суперпользователей при активации новых тенантов (магазинов). 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>
11 KiB
Руководство по автоматическому созданию суперпользователей для тенантов
Обзор
При создании нового тенанта (магазина) система автоматически создает суперпользователя с credentials из файла .env. Это позволяет сразу после активации войти в админ-панель тенанта и начать работу.
Настройка
1. Файл .env
В корне проекта находится файл .env с настройками:
# Настройки автоматического создания суперпользователя для новых тенантов
TENANT_ADMIN_EMAIL=admin@localhost
TENANT_ADMIN_PASSWORD=1234
TENANT_ADMIN_NAME=Admin
Важно для продакшена:
- Измените пароль на более безопасный
- Используйте надежный email
- Не коммитьте
.envв git (уже добавлен в.gitignore)
2. Шаблон .env.example
Для других разработчиков создан файл .env.example - скопируйте его в .env и настройте:
cp .env.example .env
# Отредактируйте .env своими значениями
Как это работает
При активации через админку
- Заходите в админ-панель:
http://localhost:8000/admin/ - Раздел "Заявки на регистрацию"
- Нажимаете кнопку "Активировать" напротив заявки
Автоматически выполняется:
- Создается тенант (Client)
- Создается домен ({schema_name}.localhost)
- Создается триальная подписка (90 дней)
- Создается суперпользователь с credentials из
.env - Обновляется статус заявки на "Одобрено"
При активации через скрипт
Универсальный скрипт activate_tenant.py:
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:
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":
# Вы уже находитесь в схеме тенанта
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:
- USERNAME_FIELD =
email(вход по email, а не username) - REQUIRED_FIELDS =
['name'](обязательно имя) - Username автоматически = email для совместимости
Метод создания суперпользователя
User.objects.create_superuser(
email='admin@localhost', # из TENANT_ADMIN_EMAIL
name='Admin', # из TENANT_ADMIN_NAME
password='1234' # из TENANT_ADMIN_PASSWORD
)
Переключение между схемами
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)
Безопасность
Для локальной разработки
Текущие настройки подходят:
TENANT_ADMIN_EMAIL=admin@localhost
TENANT_ADMIN_PASSWORD=1234
TENANT_ADMIN_NAME=Admin
Для продакшена
ОБЯЗАТЕЛЬНО измените:
- Пароль:
TENANT_ADMIN_PASSWORD=сложный-случайный-пароль-min-16-символов
- Email:
TENANT_ADMIN_EMAIL=admin@yourdomain.com
- Дополнительно:
- Включите двухфакторную аутентификацию (2FA)
- Настройте IP whitelist для админки
- Используйте HTTPS
- Регулярно меняйте пароль
Частые вопросы
Q: Как изменить пароль для существующих тенантов?
A: Используйте скрипт switch_to_tenant.py:
python switch_to_tenant.py grach
Затем в интерактивной оболочке:
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. Если нужны уникальные пароли для каждого тенанта:
- Вариант A: Генерируйте случайный пароль при создании и сохраняйте в notes тенанта
- Вариант B: Отправляйте credentials на email владельца
- Вариант C: Требуйте смены пароля при первом входе
Q: Как дать доступ владельцу магазина?
A: Есть несколько вариантов:
Вариант 1: Использовать тот же email admin@localhost (быстро для разработки)
Вариант 2: Создать отдельного пользователя для владельца:
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:
временный-пароль - Попросите сменить пароль при первом входе
Обновленные файлы
- .env - переменные окружения (НЕ коммитить!)
- .env.example - шаблон для разработчиков
- settings.py - подключен django-environ
- tenants/admin.py - автосоздание суперпользователя
- activate_tenant.py - универсальный скрипт активации
- .gitignore - защита секретов
Примеры использования
Сценарий 1: Активация новой заявки через админку
1. http://localhost:8000/admin/ → вход как супер-админ
2. Заявки на регистрацию → найти pending заявку
3. Нажать "Активировать"
4. Готово! Доступ: http://{schema_name}.localhost:8000/admin/
Сценарий 2: Активация через скрипт
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.