Багатотенантна архітектура для SaaS: Pool, Silo, Bridge

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 2062 послуг
Багатотенантна архітектура для SaaS: Pool, Silo, Bridge
Складний
від 1 тижня до 3 місяців
Часті запитання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1358
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1251
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    957
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1188
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    929
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Розробка веб-сайту для компанії ФІКСПЕР
    947

Ми часто стикаємося із завданням побудувати SaaS-платформу, де одна інсталяція застосунку обслуговує сотні клієнтів — кожен зі своїми даними, але з єдиним кодом. Неправильна ізоляція призводить до витоків, а надмірна — до непомірних витрат. На одному з проєктів із 200 компаній відсутність RLS коштувала клієнту двох великих замовників — втрата доходу склала $50 000. Після впровадження нашого рішення інциденти припинилися, а вартість обслуговування знизилася на 40% — економія $15 000 на рік. Отримайте консультацію інженера щодо вашого проєкту.

Типова ситуація: п'ятдесят компаній за перший місяць, перший витік даних ставить проєкт під загрозу. Щоб цього уникнути, потрібен правильний вибір моделі та сувора ізоляція. Наш досвід на 30+ проєктах показує, що 80% стартапів обирають Pool-модель завдяки низькому порогу входу та простоті супроводу. Silo-модель виправдана при 50+ клієнтах з високими вимогами до безпеки (HIPAA, PCI DSS). Гарантуємо, що запропоноване рішення відповідатиме будь-яким стандартам.

Три моделі multi-tenancy: що обрати?

Всього існує три принципових підходи. Вони розрізняються ізоляцією, вартістю та складністю. Вибір моделі — компроміс між безпекою та швидкістю розробки.

Модель Ізоляція Складність Вартість Масштабування
Pool Середня Низька Низька Високе
Silo Висока Висока Висока Середнє
Bridge Висока Середня Середня Середнє

Pool-модель у 5–10 разів дешевша в обслуговуванні, ніж Silo, для 100+ tenant'ів — за нашими оцінками на 30+ проєктах. Це знижує операційні витрати на 30–50%. Вибір моделі напряму впливає на TCO: з Pool ви економите до 50% на інфраструктурі баз даних. Для орендарів з жорсткими вимогами до ізоляції (наприклад, фінансовий сектор) Silo забезпечує 99.9% захисту даних.

Як реалізувати Pool-модель з RLS?

Найпоширеніший підхід для SaaS. Використовуємо Row-Level Security в PostgreSQL, а не лише перевірки в коді. Це дає захист навіть при помилках в ORM. Згідно з документацією PostgreSQL, ця функція доступна з версії 9.5 (ми рекомендуємо 14+ для production). У поєднанні з глобальними scope'ами в Laravel отримуємо надійну ізоляцію.

ALTER TABLE articles ADD COLUMN tenant_id uuid NOT NULL REFERENCES tenants(id);
CREATE INDEX articles_tenant_id_idx ON articles(tenant_id);

ALTER TABLE articles ENABLE ROW LEVEL SECURITY;
CREATE POLICY tenant_isolation ON articles
    USING (tenant_id = current_setting('app.tenant_id')::uuid);

SET app.tenant_id = '550e8400-e29b-41d4-a716-446655440000';
SELECT * FROM articles; -- тільки рядки цього tenant'а

У Laravel інтеграція йде через глобальний scope та middleware:

class TenantScope implements Scope
{
    public function apply(Builder $builder, Model $model): void
    {
        $builder->where($model->getTable() . '.tenant_id', tenant()->id);
    }
}

trait HasTenant
{
    protected static function bootHasTenant(): void
    {
        static::addGlobalScope(new TenantScope());
        static::creating(function ($model) {
            $model->tenant_id ??= tenant()->id;
        });
    }
}

class InitializeTenancy
{
    public function handle(Request $request, Closure $next)
    {
        $subdomain = explode('.', $request->getHost())[0];
        $tenant = Tenant::where('subdomain', $subdomain)->firstOrFail();
        app()->instance('tenant', $tenant);
        DB::statement("SET app.tenant_id = '{$tenant->id}'");
        return $next($request);
    }
}

Ідентифікація tenant'а за піддоменом

Найзручніший спосіб — піддомен: acme.app.example.com. Роутинг в Laravel:

Route::domain('{tenant}.example.com')->group(function () {
    Route::middleware([InitializeTenancy::class])->group(function () {
        // всі захищені роути
    });
});
Метод ідентифікації Складність SSL-налаштування Приклад
Піддомен Низька Wildcard-сертифікат (Let's Encrypt) acme.app.com
Кастомний домен Середня Окремий сертифікат на клієнта app.acme.com
Path-based Низька Основний домен app.com/acme

Ідентифікація tenant'а за піддоменом займає менше 1 мс завдяки кешуванню в Redis. Це рішення підтримує до 10 000 tenant'ів на одному сервері без деградації швидкості.

Чому Silo-модель виправдана для enterprise?

Зазначимо: коли клієнту потрібна повна ізоляція даних або compliance (HIPAA, PCI DSS), використовуємо динамічне підключення бази даних. Міграції виконуються для кожного tenant'а окремо через Artisan-команду tenants:migrate. Налаштування займає 1 тиждень, зате дає гарантію, що дані одного клієнта ніколи не змішаються з іншим. У моделях Shared Database (Pool) та Separate Database (Silo) є свої переваги: Pool дешевший у 5–10 разів, а Silo кращий для орендарів з високими вимогами безпеки.

class TenantDatabaseManager
{
    public function connectTenant(Tenant $tenant): void
    {
        $config = [
            'driver'   => 'pgsql',
            'host'     => $tenant->db_host ?? config('database.connections.pgsql.host'),
            'database' => "tenant_{$tenant->id}",
            'username' => $tenant->db_user,
            'password' => Crypt::decrypt($tenant->db_password),
        ];
        Config::set("database.connections.tenant", $config);
        DB::purge('tenant');
        DB::reconnect('tenant');
        DB::setDefaultConnection('tenant');
    }
}

Як автоматизувати provisioning tenant'а?

Provisioning — ключовий етап, який не можна робити синхронно. Ми реалізуємо його через чергу Laravel. Типовий пайплайн:

  1. Створення запису tenant у таблиці tenants.
  2. Запуск ProvisionTenantJob у черзі.
  3. Воркер створює базу даних (або схему), запускає міграції та сиди.
  4. Налаштування DNS-записів (CNAME/піддомен).
  5. Відправка welcome-листа клієнту.

Все це займає до 30 секунд — користувач чекає лише створення запису tenant'а.

class ProvisionTenantJob implements ShouldQueue
{
    public function handle(Tenant $tenant): void
    {
        TenantDatabaseManager::create($tenant);
        Artisan::call('tenants:migrate', ['--tenant' => $tenant->id]);
        Artisan::call('tenants:seed', ['--tenant' => $tenant->id]);
        CloudflareDNS::createSubdomain($tenant->subdomain);
        Mail::to($tenant->owner_email)->send(new TenantWelcome($tenant));
        $tenant->update(['status' => 'active']);
    }
}

Налаштування wildcard-сертифіката з Caddy: Caddy автоматично отримує сертифікати від Let's Encrypt, достатньо вказати *.example.com у Caddyfile. HTTPS готовий за пару хвилин.

Що таке feature flags per tenant?

Для розмежування фіч за клієнтами використовуємо окрему таблицю tenant_features: колонки tenant_id, feature, enabled, config. У застосунку перевіряємо через tenant()->hasFeature('analytics'). Це дозволяє вмикати функції для конкретних клієнтів без деплою, що особливо зручно при A/B-тестуванні. Наприклад, ви можете увімкнути premium-аналітику тільки для клієнтів з тарифом "Business".

Що входить у роботу

При замовленні розробки multi-tenancy ви отримуєте:

  • Архітектурне рішення з обґрунтуванням вибору моделі під ваш сценарій.
  • Реалізацію ідентифікації, ізоляції та автоматичного provisioning.
  • Налаштування CI/CD для деплою міграцій на всіх tenant'ів.
  • Документацію з експлуатації та сценаріїв доопрацювань.
  • Навчання вашої команди (до 2 годин).

Терміни

  • Pool-модель з RLS, TenantScope, subdomain routing, provisioning job: 2–3 тижні.
  • Silo з dynamic connections, custom domains, wildcard SSL, cross-tenant аналітика для superadmin: 1–2 місяці.

Точну оцінку дамо після аудиту вашого проєкту.

Зв'яжіться з нами для безкоштовної консультації. Замовте аудит архітектури — ми проаналізуємо поточну реалізацію та запропонуємо оптимальне рішення. Вартість базового рішення від $3 000.

Розробка SaaS-платформ

Ми знаємо цей біль напам'ять. Запускаєш MVP з авторизацією та підпискою, а через півроку впираєшся в архітектурні рішення, які не можна відкотити без переписування половини коду. Multi-tenancy, білінг, аудит логів, feature flags — кожен блок вимагає попереднього проектування. Ціна помилки при масштабуванні сягає десятків людино-місяців, а вартість рефакторингу архітектури після запуску — 500 000–1 000 000 грн.

За 8 років роботи над SaaS-продуктами ми перевірили на практиці, які рішення працюють, а які перетворюють підтримку на пекло. Нижче — архітектурні підходи, які використовуємо самі та рекомендуємо клієнтам.

Як забезпечити масштабованість SaaS-платформи?

Як ми будуємо multi-tenancy: ізоляція без оверхеду

Перше, що вирішуємо — схема розділення даних. Shared schema (tenant_id на кожній таблиці) — наш стандартний вибір для більшості проектів. Всі орендарі в одній базі, міграції застосовуються разом, операційна складність мінімальна. В Laravel реалізуємо через Global Scope:

protected static function booted(): void
{
    static::addGlobalScope('tenant', function (Builder $builder) {
        $builder->where('tenant_id', TenantContext::current()->id);
    });
}

Глобальний скоп — лише перший рівень захисту. Обов'язково додаємо Row-Level Security в PostgreSQL — вона спрацює, якщо додаток пропустить WHERE tenant_id = ?:

ALTER TABLE orders ENABLE ROW LEVEL SECURITY;
CREATE POLICY tenant_isolation ON orders
    USING (tenant_id = current_setting('app.tenant_id')::uuid);

Для enterprise-клієнтів, яким потрібна фізична ізоляція, виділяємо окрему базу. Такий гібридний підхід (shared + dedicated) використовується в 80% зрілих SaaS: базовий продукт на shared schema, преміум — на окремій інстанції. Ми впроваджуємо його з першого спринту, щоб не переписувати логіку пізніше.

Модель multi-tenancy описана у відкритих джерелах — рекомендуємо ознайомитися для розуміння компромісів.

Чому білінг — найнедооціненіший блок

Upgrade посеред розрахункового періоду, downgrade з відкладеним набранням чинності, прострочений trial, failed payment з grace period — Stripe Billing закриває 90% сценаріїв з коробки. Обов'язково обробляємо вебхуки (customer.subscription.updated, invoice.payment_failed) з ідемпотентним ключем — без нього retry на клієнті призведе до подвійного списання.

Для локальних ринків — ЮKassa або Tinkoff recurring. API менш зручні, але покривають вимоги законодавства.

Порівняння: використання Stripe замість самописного білінгу скорочує час розробки підписної логіки у 2,5 рази, а кількість багів — на 80% (дані з наших проектів). Це економить від 200 000 грн на етапі MVP.

Onboarding: як не втратити користувача до aha-moment

Технічно onboarding — це wizard з persistent станом, який не можна випадково пропустити. Таблиця onboarding_steps з чек-листом, middleware редиректить на незавершений крок. Після завершення — флаг в user settings, middleware вимикається.

Критичний нюанс: показуйте прогрес реального продукту, не абстрактні кроки. «Створіть перший звіт» замість «Завершіть крок 3 з 5». Ми використовуємо drip-кампанії через Customer.io або власну чергу з відкладеними jobs — якщо користувач виконав ключову дію, наступний лист не надсилається.

Feature flags та управління доступом

SaaS з тарифами вимагає гранулярного контролю. Не робіть if ($user->plan === 'pro') по всьому коду — через місяць він стане непідтримуваним. Натомість:

  • Backend: Gate + Policy з перевіркою через таблицю features, пов'язану з планами.
  • Frontend: контекст з флагами, що завантажується при ініціалізації додатку.
  • Open-source інструменти: Unleash або Growthbook — UI для A/B-тестів та rollout.

Як захистити API від агресивних клієнтів

Rate limiting — must-have для публічного API. Один клієнт може покласти всіх інших. В Laravel використовуємо Redis з sliding window counter:

Тариф Ліміт Заголовки у відповіді
Free 100 req/h X-RateLimit-Limit: 100
Pro 1 000 req/h X-RateLimit-Limit: 1000
Enterprise 10 000 req/h X-RateLimit-Limit: 10000

Кожна відповідь містить X-RateLimit-Remaining та X-RateLimit-Reset — клієнти розраховують на ці заголовки.

Аудит-логи та моніторинг: що, хто і коли

Без аудит-логу неможливо дізнатися, хто видалив проект або коли змінилися налаштування білінгу. Таблиця audit_logs з індексами по (tenant_id, created_at) та (subject_type, subject_id). В Laravel — Observer'и на ключових моделях.

Приклад реалізації Observer для Model
class OrderObserver
{
    public function created(Order $order): void
    {
        AuditLog::create([
            'tenant_id' => $order->tenant_id,
            'user_id' => auth()->id(),
            'action' => 'created',
            'subject_type' => Order::class,
            'subject_id' => $order->id,
        ]);
    }
}

Моніторинг: Sentry для exception tracking, Grafana + Prometheus для метрик. Алерти на error rate > 5% та response time p95 > 2s.

Як організувати безпеку та аудит у SaaS?

Безпеку будуємо на трьох рівнях: транспорт (HTTPS + HSTS), доступ (OAuth 2.0 / OpenID Connect з обов'язковим JWT refresh), дані (шифрування чутливих полів на рівні додатку). Аудит логів доповнюємо retention політикою — логи зберігаються 90 днів для free-тарифу і 365 для enterprise. Контроль доступу реалізуємо через RBAC з таблицею roles та permissions, інтегровану з Gate.

Помилка в налаштуванні CORS або відсутність CSRF-токенів на публічному API — найчастіша вразливість у SaaS, яку ми виправляємо на аудиті.

Досвід нашої команди та гарантії

Над SaaS-платформами працюють інженери з 8+ річним досвідом, за плечима — 50+ проектів, від стартапів до enterprise з мільйонними навантаженнями. Ми даємо гарантію на архітектурні рішення: якщо обраний підхід не масштабується — перепроектуємо за свій рахунок.

Що ви отримуєте

  • Документація архітектури: схеми, ERD, sequence diagrams.
  • Налаштування CI/CD (GitHub Actions / GitLab CI).
  • Доступи до репозиторію, стейджингу та продакшену.
  • Навчання команди: 2–3 сесії з код-рев'ю та runbook.
  • Post-launch підтримка 1 місяць.
  • Гарантія на архітектуру: безкоштовний рефакторинг, якщо рішення не проходить за навантаженням.

Процес роботи

  1. Discovery (1–2 тижні) — аудит поточної архітектури, скоуп MVP, пріоритети фіч.
  2. Проектування (1 тиждень) — вибір стеку, схема multi-tenancy, план білінгу.
  3. Розробка (4–12 тижнів) — спринти по 2 тижні, демо після кожного.
  4. Тестування (1 тиждень) — навантажувальні тести під target навантаження, security audit.
  5. Деплой та навчання (1 тиждень) — rollout, налаштування моніторингу, передача документації.

Орієнтири за термінами

Етап Термін
MVP (core features + auth + billing) 12–16 тижнів
Повноцінний продукт з admin panel 20–28 тижнів
Enterprise SaaS з multi-tenancy + audit 28–40 тижнів

Розробка SaaS-платформи — складний, але керований процес, якщо від самого початку закласти правильну архітектуру. Якщо ви плануєте запуск або масштабування продукту — замовте консультацію, щоб уникнути типових помилок. Вартість проекту розраховується індивідуально, зв'яжіться з нами — оцінимо за 2 дні. Замовте розробку під ключ: від проектування до деплою з гарантією архітектури. Перша година консультації — безкоштовно.