Architektura Multi-tenant: Jak zbudować bezpieczny SaaS dla tysięcy klientów?

Wyobraź sobie, że prowadzisz hotel. Masz dwa wyjścia: albo dla każdego gościa budujesz osobny domek z własną hydrauliką i ogrzewaniem (Single-tenant), albo budujesz jeden duży budynek z wieloma pokojami, wspólną recepcją i infrastrukturą (Multi-tenant). W świecie software’u, 99% startupów, które próbują iść pierwszą drogą, bankrutuje przez koszty utrzymania.

Jeśli planujesz stworzyć produkt, który ma obsługiwać setki lub tysiące firm (B2B SaaS), nie możesz stawiać osobnej kopii aplikacji dla każdego klienta. To droga donikąd. Rozwiązaniem jest architektura Multi-tenant (wielodostępność). W AP2 Media, jako wyspecjalizowany Software House, wdrażamy to podejście standardowo, bo wiemy, że to jedyny sposób na rentowne skalowanie biznesu.

Co to właściwie jest Multi-tenancy?

Mówiąc najprościej: to architektura, w której jedna instancja aplikacji obsługuje wielu klientów (tenantów). Wszyscy korzystają z tego samego kodu i (zazwyczaj) tej samej bazy danych, ale każdy klient widzi tylko swoje dane. To jak Gmail – miliony ludzi używają tej samej aplikacji, ale nikt nie widzi cudzych maili.

Dla porównania, w modelu Single-tenant, każdy klient dostaje własny serwer, własną bazę i osobną kopię kodu. Brzmi bezpieczniej? Może. Ale wyobraź sobie aktualizację systemu. W Multi-tenant robisz „deploy” raz i wszyscy mają nową wersję. W Single-tenant musisz zaktualizować 500 serwerów ręcznie. To koszmar DevOpsa i gigantyczny koszt (więcej o definicjach przeczytasz na Wikipedii).

Strategie separacji danych – serce Twojego SaaS

Największym wyzwaniem w SaaS Development jest bezpieczeństwo danych. Klient A pod żadnym pozorem nie może zobaczyć faktur Klienta B. Jak to robimy? Stosujemy trzy główne strategie, w zależności od wymogów bezpieczeństwa i budżetu:

1. Wspólna baza, wspólny schemat (Shared Database, Shared Schema)

To najczęstsze, najtańsze i najszybsze rozwiązanie. Wszystkie dane leżą w tych samych tabelach, ale każdy rekord ma kolumnę tenant_id. Aplikacja na poziomie kodu (np. poprzez Global Scopes w Laravelu) automatycznie filtruje zapytania.

  • Zalety: Łatwe skalowanie, tania infrastruktura, błyskawiczne wdrożenie.
  • Wady: Wymaga żelaznej dyscypliny w kodzie, by nie dopuścić do wycieku danych (Data Leak).

2. Wspólna baza, oddzielne schematy (Shared Database, Separate Schemas)

Kompromis. Wszyscy są w jednej bazie (np. PostgreSQL), ale każdy klient ma swój własny „folder” (Schema). Dzięki temu dane są logicznie odseparowane na poziomie silnika bazy danych.

3. Oddzielne bazy danych (Database per Tenant)

Rozwiązanie Premium. Każdy klient ma fizycznie inną bazę danych. Stosujemy to tylko w projektach Enterprise (np. bankowość, medycyna), gdzie wymogi prawne są restrykcyjne.

Case Study: Jak zrobiliśmy to w RCM Control?

Teoria to jedno, ale jak to działa w boju? Spójrzmy na naszą realizację RCM Control. To system RCP (Rejestracja Czasu Pracy) dla firm. Mamy tu do czynienia z danymi osobowymi pracowników, grafikami i ewidencją wejść/wyjść.

Wyzwanie: System musiał obsługiwać setki firm, z których każda ma inną strukturę oddziałów i inne reguły prawne, przy zachowaniu maksymalnej wydajności.

Rozwiązanie: Zastosowaliśmy architekturę Multi-tenant opartą o wspólną bazę danych (Strategia nr 1) z silną izolacją na poziomie kodu API.

  • Wykorzystaliśmy framework Laravel do zarządzania identyfikacją tenanta.
  • System automatycznie rozpoznaje klienta po subdomenie (np. firmaA.rcmcontrol.pl) i wstrzykuje odpowiednie tenant_id do każdego zapytania SQL.
  • Dzięki temu, nawet jeśli programista zapomni dodać warunku where, system sam zabezpieczy dane.

Efekt? Jeden serwer obsługuje tysiące pracowników, a koszty chmury są minimalne.

Szybkość i wydajność a Multi-tenancy

Pisaliśmy już o tym, jak ważna jest szybkość w artykule o Core Web Vitals. W architekturze Multi-tenant wydajność bazy danych jest kluczowa. Jeśli jeden duży klient „zaleje” system zapytaniami, może spowolnić działanie aplikacji dla pozostałych (tzw. problem „Noisy Neighbor”).

W projekcie IndexChecker.link, gdzie przetwarzamy miliony zapytań o status indeksacji w Google, rozwiązaliśmy to poprzez kolejkowanie zadań (Redis queues). Nawet jeśli jeden użytkownik wrzuci do sprawdzenia 100 tysięcy linków, system dzieli to na mniejsze paczki, nie blokując zasobów dla innych użytkowników. To techniczna finezja, która odróżnia profesjonalny SaaS od amatorskiego skryptu.

Dlaczego Single-tenant to pułapka dla startupu?

Wielu Founderów na początku myśli: „Zrobię dla każdego klienta osobną instalację, będzie bezpieczniej”. To błąd poznawczy. Owszem, na początku, przy 5 klientach, to działa. Ale przy 50 klientach:

  1. Zamiast rozwijać produkt, Twój zespół zajmuje się tylko utrzymaniem serwerów.
  2. Koszty hostingu rosną liniowo (każdy klient = nowy koszt), zamiast maleć przy skali.
  3. Wdrożenie nowej funkcji (np. integracji z Stripe) zajmuje tydzień zamiast godziny.

Jeśli zaczynasz budowę MVP, architektura Multi-tenant jest inwestycją, która zwraca się błyskawicznie.

Podsumowanie: Nie buduj długu technologicznego

Decyzja o architekturze bazy danych jest jedną z tych, których nie da się łatwo cofnąć. Przepisanie systemu z Single-tenant na Multi-tenant to często konieczność napisania aplikacji od zera. Nie ryzykuj.

Planujesz budowę aplikacji B2B lub platformy SaaS? Skontaktuj się z nami. Zaprojektujemy architekturę, która będzie bezpieczna jak Fort Knox i skalowalna jak Amazon, a Ty zajmiesz się biznesem, a nie łataniem serwerów.

FAQ – Pytania o Multi-tenancy

Czy dane moich klientów są bezpieczne we wspólnej bazie?

Tak, pod warunkiem, że aplikacja jest napisana przez profesjonalistów. Giganci tacy jak Salesforce, Slack czy Shopify używają architektury Multi-tenant. Kluczem jest automatyzacja testów bezpieczeństwa i poprawna implementacja warstwy izolacji danych w kodzie (tzw. Tenant Scope).

Czy każdy klient może mieć własną domenę?

Oczywiście. W Multi-tenancy standardem jest obsługa subdomen (klient.twoja-app.pl), ale w AP2 Media wdrażamy też obsługę Custom Domains. Twój klient może podpiąć własną domenę (np. app.jego-firma.pl), a nasz system automatycznie wygeneruje dla niej certyfikat SSL (Let’s Encrypt).

Co jeśli jeden klient potrzebuje innej funkcji niż reszta?

Wtedy stosujemy tzw. Feature Flags (flagi funkcjonalności). W kodzie zaszywamy funkcję, ale jest ona aktywna tylko dla konkretnego tenant_id. Dzięki temu nie musisz tworzyć osobnej wersji aplikacji – po prostu włączasz „przełącznik” w panelu administratora dla tego jednego klienta (często za dodatkową opłatą).

Podziel się swoją opinią
Adam Piersa
Adam Piersa
Artykuły: 17