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

11 KiB
Raw Blame History

Руководство по автоматическому созданию суперпользователей для тенантов

Обзор

При создании нового тенанта (магазина) система автоматически создает суперпользователя с 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 своими значениями

Как это работает

При активации через админку

  1. Заходите в админ-панель: http://localhost:8000/admin/
  2. Раздел "Заявки на регистрацию"
  3. Нажимаете кнопку "Активировать" напротив заявки

Автоматически выполняется:

  • Создается тенант (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

Для продакшена

ОБЯЗАТЕЛЬНО измените:

  1. Пароль:
TENANT_ADMIN_PASSWORD=сложный-случайный-пароль-min-16-символов
  1. Email:
TENANT_ADMIN_EMAIL=admin@yourdomain.com
  1. Дополнительно:
  • Включите двухфакторную аутентификацию (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. Если нужны уникальные пароли для каждого тенанта:

  1. Вариант A: Генерируйте случайный пароль при создании и сохраняйте в notes тенанта
  2. Вариант B: Отправляйте credentials на email владельца
  3. Вариант 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: временный-пароль
  • Попросите сменить пароль при первом входе

Обновленные файлы

  1. .env - переменные окружения (НЕ коммитить!)
  2. .env.example - шаблон для разработчиков
  3. settings.py - подключен django-environ
  4. tenants/admin.py - автосоздание суперпользователя
  5. activate_tenant.py - универсальный скрипт активации
  6. .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.