Разработка multi-tenant SaaS на заказ: один продукт для многих B2B-клиентов

Multi-tenant SaaS — это один продукт, который обслуживает много компаний-клиентов из одной кодовой базы, а не копия приложения на каждого. Разделить данные клиентов — только начало: нужны ещё настройки без доработок, вход через каталог клиента, лимиты против «шумного соседа», подключение и отключение организации и ответы на опросник безопасности. Делаем такое ядро на заказ, начиная с обследования.

Обследование — от 200 000 ₽, 2–3 неделиИзоляцию клиентов проверяем тестом, а не обещаниемИсходный код в вашем репозитории с первого коммита

С чем приходят

Когда нужен именно multi-tenant, а не ещё один проект под клиента

Проект для одного клиента превращается в продукт

Систему сделали под одну компанию, теперь её просят другие. Копии приложения придётся чинить поодиночке. Нужно ядро и слой настроек.

Каждый новый клиент — это доработка

Один хочет другое поле, второй другой порядок согласования, третий свой отчёт. Без правил, что настраивается, код превращается в набор исключений.

Крупный клиент прислал опросник по безопасности

Где хранятся данные, как они отделены, есть ли вход через наш каталог, журнал и выгрузка. Ответ «не знаем» можно дать один раз.

Платформа есть, но клиенты мешают друг другу

Один клиент запустил тяжёлый отчёт, и у остальных всё замедлилось: ограничений на ресурсы нет.

Что внутри

Пять свойств multi-tenant B2B SaaS: что требует клиент и где это ломается

Схемы хранения данных разобраны на странице разработки SaaS-платформы и в статье про мультиарендность. Здесь о том, что нужно кроме них.

Свойство
Что требует клиент
Как делаем
Где ломается
СвойствоИзоляция данныхклиент A не видит клиента B
Что требует клиентСпрашивают первым и просят описать на бумаге
Как делаемИдентификатор организации в каждой таблице, политики на уровне строк в базе, проверка на сервере; для особых клиентов отдельная схема или база
Где ломаетсяФоновая задача или отчёт без фильтра, кэш общий для всех, файлы лежат в общей папке
СвойствоНастраиваемостьмои поля, мои статусы
Что требует клиентСвои справочники, шаблоны, порядок согласования
Как делаемСлой настроек отдельно от кода: флаги, дополнительные поля, шаблоны, правила по организации
Где ломаетсяНастройка живёт в коде, исключения множатся
СвойствоДоступ сотрудников клиентанаш каталог, наши группы
Что требует клиентВход через каталог, роли по группам, отключение уволенного
Как делаемЕдиный вход по стандартным протоколам, роли внутри организации, журнал входов
Где ломаетсяОдна почта в двух организациях, права не отзываются при увольнении
СвойствоСправедливость ресурсовчужой отчёт не должен тормозить мой
Что требует клиентПредсказуемая скорость в рабочее время
Как делаемЛимиты по организации, отдельные очереди тяжёлых задач, квоты на хранилище и обращения к API
Где ломаетсяОдна общая очередь, один большой импорт занимает всех исполнителей
СвойствоЖизненный цикл организацииподключили, приостановили, ушли
Что требует клиентБыстрое подключение, правила при неоплате, выгрузка данных
Как делаемСостояния организации, автоматическое создание, экспорт и удаление
Где ломаетсяОрганизацию заводят вручную, данные одного клиента не удалить, не затронув остальных
Жизненный цикл

Подключение, приостановка и уход клиента: то, что забывают спроектировать

Описание «клиент зарегистрировался и работает» занимает одну страницу. Остальные случаи занимают остальные.

У организации-клиента в системе есть состояние, и каждый переход между состояниями описан до разработки. Иначе при первой просрочке платежа кто-то идёт в базу и отключает доступ руками.

  • Создание. Новая организация получает настройки по умолчанию, первого администратора и тариф. Если заведение идёт вручную, рост продукта упирается в одного сотрудника.
  • Пробный период. Организация работает с ограничениями; по окончании данные ждут решения, а срок их хранения записан в условиях сервиса.
  • Приостановка. При неоплате пользователи видят данные, но не создают новое. Отключение без предупреждения бьёт по бизнесу клиента.
  • Выгрузка. Клиент вправе забрать свои данные в понятном формате. Это требование из договоров, и сделать его после запуска всегда дороже, чем заложить заранее.
  • Удаление. Данные одной организации стираются из базы, файлов, кэша и копий по заранее известному сроку. Для общей схемы это самая трудоёмкая часть, потому что копия базы содержит всех.

Состояния связаны с биллингом и тарифами: как это устроено, показывает разбор типовой задачи про тарифы и счета.

Настройки

Один код для всех: что настраивается, а что нет

Граница между настройкой и доработкой записывается в договоре и в документации. Иначе её определяет самый настойчивый клиент.

Правило простое: всё, что отличается у клиентов, но укладывается в известные формы, живёт в данных. Всё, что требует новой логики, живёт в коде и доступно всем или никому. Практически это четыре слоя.

  • Флаги возможностей. Раздел включён или выключен для организации и тарифа. Позволяет выпускать новое сначала для двух-трёх клиентов.
  • Дополнительные поля и справочники. Клиент добавляет свои поля к заказу или заявке, правит названия статусов. Поля хранятся структурно, по ним работают фильтры и отчёты.
  • Шаблоны. Документы, письма и уведомления с подстановкой данных. Шаблон по умолчанию общий, организация может переопределить свой.
  • Правила. Порядок согласования, пороги, маршруты. Это уже небольшой язык описания, и его границы стоит ограничить: «если сумма больше порога, то согласует руководитель», а не произвольная программа.

Если клиент платит за то, что в эти слои не укладывается, возможны два пути: функция становится частью продукта и получает флаг, либо это интеграция через API. Третий путь, ветка кода для одного клиента, превращает multi-tenant обратно в набор копий. Мы его не предлагаем.

Настройки проверяют так же, как код: у них есть версии, а откат настроек одной организации не затрагивает остальных.

Нагрузка

«Шумный сосед»: как не дать одному клиенту замедлить остальных

Заготовка разговора об ограничениях. На ваших данных строки будут другими, вопросы те же.

Ресурс
Как проявляется
Что ставим
Что проверяем
РесурсТяжёлые отчётывыгрузка за год
Как проявляетсяСтраница открывается медленно у всех, пока считается чужой отчёт
Что ставимОтчёты выполняются в фоне, с очередью на организацию и ограничением параллельных заданий
Что проверяемДва клиента запускают отчёты одновременно, остальные работают как раньше
РесурсМассовый импортзагрузка большого файла
Как проявляетсяИсполнители заняты, обычные задачи ждут
Что ставимОтдельная очередь и приоритеты; импорт нарезается на части и не блокирует остальных
Что проверяемПовторная загрузка того же файла не создаёт дублей
РесурсОбращения к APIскрипт клиента в цикле
Как проявляетсяСервер отвечает всем медленнее
Что ставимЛимиты по ключу и организации, ясный ответ «слишком часто»
Что проверяемПревышение одним ключом не влияет на другие
РесурсФайлы и хранилищевложения и архивы
Как проявляетсяДиск растёт непредсказуемо
Что ставимКвоты по тарифу, срок хранения, уведомление до достижения предела
Что проверяемЧто видит пользователь в момент достижения квоты
Закупка

Что спрашивают крупные B2B-клиенты и что мы закладываем в ответ

Опросники у разных компаний различаются, но повторяются одни и те же темы. Юридические формулировки и сертификаты не входят в наши работы, мы даём технические меры.

Вопрос клиента
Что отвечаем технически
Что для этого сделано
Что остаётся за вами
Вопрос клиентаГде хранятся данныеместо и владелец
Что отвечаем техническиСервер в России или у выбранного вами хостера, перечень сервисов, которые обрабатывают данные
Что для этого сделаноСхема развёртывания, перечень внешних сервисов, настройки доступа
Что остаётся за вамиВыбор хостера и договор с ним
Вопрос клиентаКак отделены наши данныеизоляция
Что отвечаем техническиОписание схемы, политики на уровне строк, результат теста «клиент A не видит клиента B»
Что для этого сделаноАвтоматические тесты в сборке и отдельный прогон перед релизом
Что остаётся за вамиРешение, давать ли особым клиентам отдельную базу
Вопрос клиентаМожно ли войти через наш каталогединый вход
Что отвечаем техническиВход по стандартным протоколам, роли по группам, двухфакторность
Что для этого сделаноПодключение и проверка с тестовым каталогом клиента
Что остаётся за вамиНастройка со стороны ИТ-службы клиента
Вопрос клиентаЧто видно в журналеаудит
Что отвечаем техническиКто, что и когда смотрел и менял; вход сотрудников поддержки под клиентом записывается отдельно
Что для этого сделаноЖурнал и экран просмотра для администратора организации
Что остаётся за вамиСрок хранения журнала по требованиям клиента
Эксплуатация

Админка для вашей команды и обновления без остановки всех клиентов

У multi-tenant продукта два круга пользователей: клиенты и ваша команда. Админка для второго круга входит в первую версию. Сотрудник поддержки находит организацию, видит её состояние, лимиты и последние ошибки и при необходимости открывает продукт «от имени клиента». Каждый такой вход пишется в журнал с указанием сотрудника и причины, права на него выдаются отдельной ролью.

Обновления делаются с расчётом на то, что клиентов много, а окно простоя у каждого своё. Структура данных меняется в два шага: сначала добавляется новое поле, совместимое со старым кодом, затем код переходит на него, и только потом старое поле убирается. Новые возможности включаются флагом сначала для нескольких организаций. Для схемы «отдельная база на клиента» добавляются реестр баз и массовый запуск изменений, и эта трудоёмкость видна в оценке заранее.

Публичный API для клиентов проектируется с теми же ограничениями: ключ привязан к организации, версии не ломают чужие скрипты. Подробнее — в разборе публичного API SaaS-продукта и на странице API и бэкенда.

Что делаем

Из чего состоит работа и сколько она стоит

Цены — по тарифам. Цена платформы называется по итогам обследования, остановиться можно после любой ступени.

Обследование: продукт и целевые клиенты

Кто клиенты, чем различаются, что настраивается, что спрашивают при закупке. На выходе схема изоляции, состав первой версии, вилка бюджета. Вычитается из первого этапа.

200 000 ₽ · 2–3 недели

Обследование: продукт и несколько систем

Когда нужен обмен с учётом, CRM или каталогами клиентов: схема обменов и матрица источников данных.

350 000 ₽ · 3–4 недели

Пилот: один сценарий

Главный сценарий для двух-трёх организаций без биллинга и без полного набора настроек.

150 000–400 000 ₽ · 2–8 недель

Первая версия с ядром multi-tenant

Организации, роли, слой настроек, лимиты, тарифы и счёт, админка вашей команды, журнал. Идёт в тарифах как тяжёлый пилот.

400 000–1 200 000 ₽ · 2–3 месяца

Вывод в эксплуатацию

Опытная эксплуатация на всех клиентах, нагрузочные испытания, регламент копий и удаления данных организации.

от 1 500 000 ₽ этапами по 300 000–700 000 ₽ · от 3 месяцев

Сопровождение

Мониторинг, обращения, разбор инцидентов и плановые доработки с пакета на 60 000 ₽. Сверх пакета — 5 000 ₽ в час.

20 000 / 60 000 / 120 000 ₽ в месяц
Процесс

Как идёт работа

2–4 недели — Обследование: клиенты, различия, требования

Делим различия клиентов на настройки и функции продукта, собираем вопросы закупки, выбираем схему изоляции, описываем состояния организации.

Перед разработкой — Схема данных и тесты изоляции

Сначала тест «клиент A не видит клиента B» и модель прав, потом первые экраны. Тест остаётся в сборке навсегда.

От 2 месяцев — Первая версия

Организации, роли, настройки, лимиты, админка. Раз в две недели показываем версию на тестовом стенде.

1–2 недели — Проверка

Прогон прав из-под каждой роли, проверка лимитов, восстановление одной организации из копии и удаление её данных.

3–7 дней — Запуск

Подключаем одну-две организации, смотрим журнал, ошибки и обращения, затем расширяем круг.

Дальше — рост или сопровождение

Новые возможности включаются флагами и идут этапами с отдельной приёмкой. Объём работ в месяц записан в договоре.

Контроль

Что остаётся у вас и чего мы не делаем

Остаётся у вас

  • Исходный код платформы в вашем репозитории с первого коммита.
  • Развёртывание на вашем оборудовании или у вашего хостера и инструкция к нему.
  • Описание схемы изоляции, состояний организации и слоя настроек, тесты изоляции в сборке.
  • Результат работ передаётся вам по акту; порядок передачи прав записывается в договоре; открытые компоненты остаются под своими лицензиями.
  • Право остановиться после любой ступени: сделанное остаётся у вас по акту.

Мы этого не делаем

  • Не строим платформы для команды в несколько десятков человек: берём ядро и первую версию.
  • Не делаем маркетплейсы с чужими продавцами, мобильные приложения, стриминг, не продвигаем сервис.
  • Не принимаем платежи от вашего имени и не храним данные карт: этим занимается платёжный провайдер.
  • Не проводим пентесты боевой системы и аттестацию, лицензии ФСТЭК у нас нет. Оферту, соглашение с пользователями и поручение на обработку персональных данных готовит юрист заказчика.
  • Не берём работы дешевле 150 000 ₽ и не дежурим круглосуточно.
Граница

Multi-tenant SaaS, кабинет или B2B-портал: чем это отличается

Если клиенты и партнёры смотрят на вашу информацию и оформляют заявки, это личный кабинет или B2B-портал: одна организация-владелец, много внешних пользователей. Если вы продаёте доступ к продукту компаниям, у каждой из которых свои пользователи, настройки, тариф и данные, нужен multi-tenant SaaS.

Общее описание платформы и состав MVP — на странице разработки SaaS-платформы; как сузить первую версию до главного сценария, — на странице разработки SaaS MVP. Устройство такой системы показывает разбор типовой задачи многоарендная B2B SaaS-платформа. Про ИИ-функции в продукте — отдельная статья.

Инструменты

На чём собираем

Серверная часть и данные
  • Python (Django, FastAPI) или Go
  • PostgreSQL с политиками на уровне строк
  • Redis для кэша и лимитов; очередь в PostgreSQL или RabbitMQ
  • S3-совместимое хранилище (своё или у хостера) с разделением по организациям
Интерфейс, вход и развёртывание
  • React или Vue, TypeScript
  • Keycloak или собственная модель входа; OIDC и SAML для каталогов клиентов
  • Docker, Nginx, GitLab CI, тесты изоляции в сборке
  • Мониторинг, журнал действий, админка для поддержки
Материалы

Материалы по теме

Статья

Мультиарендность в SaaS: как разделить данные клиентов

Три схемы изоляции, тесты «клиент A не видит клиента B» и способы сменить схему позже.

  • Три схемы
  • Политики на уровне строк
  • Тесты изоляции
Читать →
Статья

Сколько стоит разработка SaaS-платформы

Цена по ступеням, четыре фактора вилки и признаки плохой оценки.

  • Цена по ступеням
  • Факторы вилки
  • Плохая оценка
Читать →
Статья

Как сделать SaaS MVP: что включить и что отложить

Как вычеркнуть из первой версии лишнее и не потерять главный сценарий.

  • Отбор функций
  • Ручной режим
  • Порядок сборки
Читать →
Заявка

Разберём ваш продукт и его будущих B2B-клиентов

Сорок минут созвона: что за продукт, кто клиенты, чем они различаются и какие требования уже прозвучали. По итогам скажем, с какой ступени начинать и в какую вилку это укладывается.

Спасибо, заявка отправлена. Ответим в течение рабочего дня.

Не удалось отправить. Напишите в телеграм или позвоните.

Вопросы

Частые вопросы: разработка multi-tenant SaaS

Чем multi-tenant SaaS отличается от обычного веб-сервиса?

Обычный веб-сервис обслуживает одну организацию или открытую аудиторию. В multi-tenant продукте одна кодовая база обслуживает много компаний, у каждой свои данные, пользователи, настройки и тариф. Отсюда изоляция данных, слой настроек, лимиты ресурсов и жизненный цикл организации.

Какую схему хранения данных брать на старте?

Чаще всего общую схему с идентификатором организации в каждой таблице и политиками на уровне строк в базе: она дешевле в эксплуатации. Отдельную схему или базу берут для клиентов с особыми требованиями. Выбор делаем на обследовании по вашим клиентам, подробнее в статье про мультиарендность.

Сколько стоит разработка multi-tenant SaaS?

Обследование — 200 000 ₽ за один-два процесса или 350 000 ₽, если платформа связана с несколькими системами. Первая версия — 400 000–1 200 000 ₽ за 2–3 месяца, вывод в эксплуатацию — от 1 500 000 ₽ этапами по 300 000–700 000 ₽, сопровождение — от 20 000 ₽ в месяц. Цена платформы называется по итогам обследования, обследование вычитается из первого этапа.

Можно ли превратить наш проект под одного клиента в SaaS?

Часто можно, но не всегда выгодно. На обследовании смотрим, есть ли в коде разделение данных по организациям и права на сервере. Если нет, переделка ядра может стоить как новая версия. Покажем оба варианта с вилками, выбор за вами.

Как вы проверяете, что данные клиентов не смешиваются?

Автоматическим тестом в сборке: он создаёт две организации и пробует открыть данные второй из-под первой через интерфейс, API, файлы и фоновые задачи. Перед релизом идёт отдельный прогон из-под каждой роли. Это проверка кода и конфигурации, а не пентест боевой системы.

Поддерживаете ли вход через корпоративный каталог клиента?

Да, по протоколам OIDC и SAML, роли соотносятся с группами каталога. Подключение каждого клиента требует настройки с его стороны и тестовой среды, это идёт в сроки отдельной строкой.

Кому принадлежит код и где работает платформа?

Код принадлежит вам и лежит в вашем репозитории с первого коммита. Платформа работает на ваших серверах или у выбранного вами хостера. Персональные данные граждан России обычно должны храниться на серверах в России.

Вы работаете только в Ростове-на-Дону?

Мы в Ростове-на-Дону, работаем с заказчиками по всей России: удалённо и в вашем контуре. Доступ к системам и обследование согласуем на старте с вашей службой безопасности.