Арендаторы видят данные друг друга
Фильтр по идентификатору арендатора забыт в одном запросе из сотни — и выгрузка, отчёт или глобальный поиск отдают чужие записи. Находят это обычно клиенты, а не тесты.
Выберите тему — соберём контекст
Проектируем и разрабатываем мультитенантный SaaS: единое ядро, изолированные данные арендаторов, темы оформления без форка репозитория, кастомные домены с автоматическим SSL и партнёрский кабинет с прозрачным расчётом вознаграждений.
Или сразу: +7 (962) 368-39-51 Telegram
Это не гипотетические риски, а повторяющиеся проблемы проектов, которые выросли из одного клиента в десятки.
Фильтр по идентификатору арендатора забыт в одном запросе из сотни — и выгрузка, отчёт или глобальный поиск отдают чужие записи. Находят это обычно клиенты, а не тесты.
Второй клиент получает форк репозитория, третий — свою ветку. Через год поддерживать приходится пять почти одинаковых продуктов, и каждый релиз делается пять раз.
Клиент просит свой домен, сертификат выпускают руками, продлевать забывают. Платформа работает, а вход по адресу клиента отдаёт ошибку сертификата.
Реферальные начисления ведут в Google Sheets: процент за прошлый месяц пересчитывают руками, расхождения всплывают на сверке и превращаются в спор с партнёром.
Менеджер партнёра видит в меню только разрешённые разделы, но серверная проверка прав отсутствует: прямой запрос к API отдаёт данные всех арендаторов.
У крупных клиентов свои правки в общей ветке. Релиз превращается в ручной мерж на неделю, поэтому релизы откладывают, а платформа отстаёт на год.
Объём подбирается под стадию: пилот на одном клиенте, превращение существующего продукта в мультитенантный или платформа для продажи через партнёров.
Выбираем модель изоляции под ваш профиль риска и требования клиентов, а не по моде.
Второй и двадцатый клиент подключаются настройками, а не новой копией продукта.
Партнёр продаёт вашу платформу своим клиентам и видит свои цифры без вашего участия.
Один продуктовый конвейер для всех арендаторов — иначе платформа быстро становится необслуживаемой.
Начинаем с модели тенантности: от неё зависят и архитектура, и стоимость эксплуатации на сотнях клиентов.
Разбираем профиль клиентов и требования к изоляции данных, выбираем схему: общий контур, отдельная схема или отдельная база. Фиксируем, что становится настройкой арендатора, а что остаётся общим.
Реализуем вход с выбором арендатора, роли и права, тарифы с лимитами, биллинг-контур и админку платформы. Пишем тесты, которые проверяют изоляцию данных при каждом изменении.
Добавляем темы, кастомные домены с SSL, партнёрский кабинет и расчёт вознаграждений. Готовим white-label версии документов, писем и справки.
Подключаем первых арендаторов, смотрим метрики по каждому, настраиваем регламент релизов, поддержки и подключения новых клиентов.
Первая модель — общий контур: все арендаторы в одних таблицах, каждая запись помечена идентификатором арендатора. Это дешевле всего в разработке и эксплуатации, легко масштабируется до тысяч мелких клиентов, но требует дисциплины: любой запрос без фильтра арендатора становится утечкой, поэтому нужны автоматические проверки на уровне доступа к данным.
Вторая — отдельная схема на арендатора в одной базе. Изоляция заметно выше, резервное копирование и удаление данных клиента делаются поштучно, но количество схем упирается в ресурсы сервера базы, а миграции приходится прогонять по всем схемам.
Третья — отдельная база или отдельный контур на клиента. Так делают, когда этого требуют корпоративные заказчики или персональные данные особой категории. Стоимость эксплуатации выше, зато крупный клиент получает выделенные ресурсы и независимое обновление. На практике модели часто комбинируют: мелкие клиенты живут в общем контуре, а два-три крупных выносятся в отдельные базы.
White-label — это не только другой логотип. Клиент или партнёр должен получить собственный домен, письма с собственного адреса, документацию со своим названием и — что важнее — свои цифры: сколько его пользователей активно, сколько он заработал, сколько должен заплатить вам. Возможность выгрузить эти данные самостоятельно ценится выше, чем цвет кнопки.
Отдельный вопрос — разграничение ответственности. Если платформа продаётся через партнёра, договор с конечным пользователем заключает партнёр, а значит в интерфейсе нужны его реквизиты, его оферта и его поддержка первой линии. Технически это означает, что шаблоны документов, контакты поддержки и правила возвратов должны быть атрибутами арендатора, а не константами в коде.
Схема «процент от платежа» кажется простой, пока не появляются возвраты, чарджбеки и смена тарифа в середине периода. Поэтому вознаграждение считают не от факта оплаты, а от признанной выручки за период: платежи пересчитываются в подписочные периоды, возвраты уменьшают базу того периода, к которому относятся, а не текущего.
Второй элемент — удержание. Разумно держать выплату партнёру до истечения срока возможного возврата, иначе после чарджбека сумму придётся вычитать из следующей выплаты. Мы закладываем это в модель начисления: три состояния — начислено, удерживается, выплачено — и реестр, который партнёр видит в своём кабинете. Спор о сумме обычно заканчивается на этом экране, без переписки с бухгалтерией.
Готовое мультитенантное ядро с тарифами, ролями и биллингом собирается за 3–5 месяцев. Если продукт уже существует и его нужно превратить в мультитенантный, добавьте 4–8 недель на вынос данных арендаторов, разделение хранилищ и перенос кастомизаций в настройки. Точная оценка зависит от количества интеграций и от того, требуется ли партнёрский кабинет с расчётом вознаграждений.
Изоляция обеспечивается не только фильтром в запросах. Мы добавляем глобальный скоуп на уровне модели данных, автоматические тесты, которые проверяют доступ к чужому объекту под каждой ролью, раздельные каталоги файлов и очереди на арендатора, а также журнал доступа к чувствительным операциям. При выборе модели с отдельной базой на клиента изоляция обеспечивается физически.
Да. Домен арендатора добавляется в настройках платформы, сертификат выпускается и продлевается автоматически, письма отправляются с подтверждённого домена клиента с настроенными SPF и DKIM. Это стандартная часть нашей реализации white-label, а не отдельная доработка.
Индивидуальные требования закрываем настройками, модулями и флагами функций, а не правками в общей ветке. Если требование действительно уникально, оно оформляется как отдельный модуль с собственным интерфейсом расширения, поэтому обновление ядра не ломает логику клиента. Такие модули включаются по арендатору и не влияют на остальных.
Смежные задачи, которые обычно решаются в одном проекте с этой.
Расскажите, кому и как вы планируете продавать подписку, — предложим архитектуру, модель тенантности и сроки.
Cookie и аналитика
Мы используем необходимые cookie для работы сайта и форм. Аналитические cookie (Яндекс.Метрика, включая запись сессий) подключаем только с вашего согласия — от него можно отказаться. Подробнее: Политика использования cookie и обработка персональных данных.