Арендаторы, хост и фильтр данных
ToRun построен на мультиарендной модели ABP Framework. У строки с пометкой IsMultiTenant есть столбец TenantId, по которому фреймворк фильтрует автоматически; запросы в контексте одного арендатора никогда не видят строки другого. Контекст хоста (TenantId == null) видит отдельный срез: там живут канонические каталоги, такие как SubscriptionPlan, AiProvider и LegalDocument.
Почему мы считаем хост полноправным участником
Большинство SaaS-продуктов добавляют хост в виде «инструментов администратора». Мы моделируем его как родственного арендатора: у хоста свои панели, свои политики ИИ и свои платёжные отношения. Это позволяет нам пускать собственный продакшен-трафик через те же компоненты, что использует каждый клиент.
Возможности по тарифу для каждого арендатора
Тарифы подписки содержат строки FeatureLimit, Entitlement, Capability и Mode. Когда арендатор активирует тариф, набор доступных ему возможностей — это пересечение его тарифа и глобального каталога. Добавление нового режима не требует трогать каждого арендатора: он получает режим автоматически, если его тариф его включает.
Подстановка BYOK в каждом вызове
Даже при общей инфраструктуре учётные данные BYOK остаются в пределах арендатора, которому они принадлежат. Каждый запрос к ИИ получает учётные данные в контексте арендатора через тот же фильтр данных; утечка ключей между арендаторами на уровне хранилища невозможна.
Чего мы намеренно не делаем
Мы не изолируем арендаторов на уровне базы данных или процесса. Стоимость масштабирования отдельной базы на каждого арендатора разрушает юнит-экономику мультиарендного SaaS-продукта. Фильтра данных вместе с разделённым по арендаторам кэшем достаточно, если схема спроектирована под это с первого дня.