Реализована полноценная система мультитенантности на базе django-tenants. Каждый магазин получает изолированную схему БД и поддомен. Основные компоненты: Django-tenants интеграция: - Модели Client (тенант) и Domain в приложении tenants/ - Разделение на SHARED_APPS и TENANT_APPS - Public schema для общей админки - Tenant schemas для изолированных данных магазинов Система регистрации магазинов: - Публичная форма регистрации на /register/ - Модель TenantRegistration для заявок со статусами (pending/approved/rejected) - Валидация schema_name (латиница, 3-63 символа, уникальность) - Проверка на зарезервированные имена (admin, api, www и т.д.) - Админ-панель для модерации заявок с кнопками активации/отклонения Система подписок: - Модель Subscription с планами (триал 90 дней, месяц, квартал, год) - Автоматическое создание триальной подписки при активации - Методы is_expired() и days_left() для проверки статуса - Цветовая индикация в админке (зеленый/оранжевый/красный) Приложения: - tenants/ - управление тенантами, регистрация, подписки - shops/ - точки магазинов/самовывоза (tenant app) - Обновлены миграции для всех приложений Утилиты: - switch_to_tenant.py - переключение между схемами тенантов - Обновлены image_processor и image_service Конфигурация: - urls_public.py - роуты для public schema (админка + регистрация) - urls.py - роуты для tenant schemas (магазины) - requirements.txt - добавлены django-tenants, django-environ, phonenumber-field Документация: - DJANGO_TENANTS_SETUP.md - настройка мультитенантности - TENANT_REGISTRATION_GUIDE.md - руководство по регистрации - QUICK_START.md - быстрый старт - START_HERE.md - общая документация Использование: 1. Пользователь: http://localhost:8000/register/ → заполняет форму 2. Админ: http://localhost:8000/admin/ → активирует заявку 3. Результат: http://{schema_name}.localhost:8000/ - готовый магазин 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
8.0 KiB
🚀 Чистый старт проекта с Django Tenants
Все миграции удалены. База данных пуста. Готов к чистому старту!
✅ Что уже сделано:
- ✅ PostgreSQL установлен и запущен в Docker
- ✅ Все старые миграции удалены
- ✅ SQLite база удалена
- ✅ Проект настроен для django-tenants
📋 Пошаговая инструкция:
Шаг 1: Установить зависимости
pip install -r requirements.txt
Это установит:
- django-tenants
- psycopg2-binary
- и все остальные зависимости
Шаг 2: Создать миграции для всех приложений
python manage.py makemigrations
Django создаст миграции для:
- tenants (public схема - Client и Domain)
- accounts, customers, shops, products, orders, inventory (tenant схемы)
Шаг 3: Применить миграции к public схеме
python manage.py migrate_schemas --shared
Это создаст:
- Схему
publicв PostgreSQL - Таблицы для управления тенантами (Client, Domain)
- Таблицы Django (auth, contenttypes, sessions, admin)
Шаг 4: Создать public тенанта
Public тенант нужен для главного домена (localhost в разработке).
python manage.py shell
В shell выполните:
from tenants.models import Client, Domain
# Создать public тенанта
public_tenant = Client.objects.create(
schema_name='public',
name='Главный домен',
owner_email='admin@inventory.by',
owner_name='Администратор'
)
# Создать домен для public
public_domain = Domain.objects.create(
domain='localhost',
tenant=public_tenant,
is_primary=True
)
print(f'✓ Public тенант создан: {public_tenant}')
print(f'✓ Public домен создан: {public_domain}')
exit()
Шаг 5: Создать суперпользователя (ваш аккаунт)
python manage.py createsuperuser --schema=public
Введите:
- Email: ваш email
- Name: ваше имя
- Password: ваш пароль
Этот суперпользователь будет иметь доступ к админке на localhost:8000/admin/ для управления тенантами.
Шаг 6: Создать первый магазин (тенант)
python manage.py create_tenant
Пример данных:
- Название магазина: Цветочный рай
- Схема БД: shop1
- Домен: shop1.localhost (или оставьте по умолчанию)
- Имя владельца: Иван Иванов
- Email: ivan@example.com
- Телефон: (можете оставить пустым)
Команда автоматически:
- Создаст тенанта в таблице
Client - Создаст домен в таблице
Domain - Создаст схему
shop1в PostgreSQL - Применит все миграции к схеме
shop1 - Создаст все таблицы (customers, orders, products, etc.) в схеме
shop1
Шаг 7: Настроить hosts файл
Откройте файл hosts с правами администратора:
Windows: C:\Windows\System32\drivers\etc\hosts
Добавьте строки:
127.0.0.1 localhost
127.0.0.1 shop1.localhost
127.0.0.1 shop2.localhost
Сохраните файл.
Шаг 8: Запустить сервер
python manage.py runserver 0.0.0.0:8000
Шаг 9: Проверить работу
1. Админка супер-администратора (Public схема):
URL: http://localhost:8000/admin/
Логин: email и пароль суперпользователя (из Шага 5)
Здесь вы увидите:
- Управление тенантами (магазинами)
- Управление доменами
- Стандартные разделы Django
2. Админка магазина (Tenant схема):
URL: http://shop1.localhost:8000/admin/
Сначала нужно создать пользователя для магазина:
python manage.py tenant_command createsuperuser --schema=shop1
Затем зайдите в админку магазина и увидите:
- Клиенты (Customers)
- Адреса (Addresses)
- Магазины/точки (Shops)
- Товары (Products, Categories, Kits)
- Заказы (Orders, OrderItems)
- Складской учет (Inventory)
🎯 Проверка изоляции данных
Создайте второй магазин:
python manage.py create_tenant
Данные (название: "Второй магазин", схема: "shop2", домен: "shop2.localhost")
Затем:
- Добавьте товары в shop1
- Добавьте товары в shop2
- Убедитесь, что товары из shop1 НЕ видны в shop2 и наоборот
Это и есть полная изоляация данных! ✅
🛠 Полезные команды
Посмотреть список всех тенантов:
python manage.py shell
from tenants.models import Client
for tenant in Client.objects.all():
print(f'{tenant.name}: {tenant.schema_name} - {tenant.get_primary_domain()}')
Применить миграции ко всем тенантам:
python manage.py migrate_schemas
Применить миграции к конкретному тенанту:
python manage.py migrate_schemas --schema=shop1
Выполнить команду для тенанта:
python manage.py tenant_command <command> --schema=shop1
Примеры:
python manage.py tenant_command createsuperuser --schema=shop1
python manage.py tenant_command shell --schema=shop1
python manage.py tenant_command dumpdata --schema=shop1 > shop1_data.json
📊 Структура базы данных
После выполнения всех шагов в PostgreSQL будет:
Схема public:
- Таблицы тенантов:
tenants_client,tenants_domain - Таблицы Django:
auth_user,auth_group,django_session, etc.
Схема shop1:
customers_customer,customers_addressshops_shopproducts_product,products_category,products_productkitorders_order,orders_orderiteminventory_*- И все остальные таблицы приложений
Схема shop2:
- Те же таблицы что и в
shop1, но с ДРУГИМИ данными!
❗ Возможные проблемы
Ошибка: "connection to server at localhost (127.0.0.1), port 5432 failed"
PostgreSQL не запущен. Запустите:
docker start inventory-postgres
Ошибка: "database 'inventory_db' does not exist"
Создайте базу:
docker exec -it inventory-postgres psql -U postgres -c "CREATE DATABASE inventory_db;"
Ошибка: "No tenant found for hostname 'shop1.localhost'"
- Проверьте hosts файл
- Проверьте, что домен создан:
Domain.objects.filter(domain='shop1.localhost').exists()
Ошибка: "relation does not exist"
Миграции не применены. Запустите:
python manage.py migrate_schemas
🎉 Готово!
После выполнения всех шагов у вас будет работающая SaaS-платформа с полной изоляцией данных между магазинами!
Подробная документация: DJANGO_TENANTS_SETUP.md