Budování multi-tenant SaaS: Pracovní prostory, role, fakturace a izolace

Jak navrhnout pracovní prostory, řízení přístupu na základě rolí, fakturační úrovně a izolaci tenantů pro škálovatelné SaaS. Praktická architektura od DigiForge.

DFTým DigiForgeJul 20, 20267 min čtení
Abstraktní zářící propojené bloky na tmavém pozadí představující multi-tenant SaaS architekturu.

Multi-tenant SaaS je výchozí architekturou pro každou B2B platformu, která očekává růst nad rámec několika zákazníků. Ďábel se však skrývá v detailech: jak modelujete pracovní prostory, přiřazujete role, strukturujete fakturaci a izolujete tenanty, rozhoduje o tom, zda vaše platforma plynule škáluje nebo se zhroutí pod tíhou složitosti. V DigiForge jsme tyto systémy budovali a přestavovali napříč desítkami SaaS produktů. Zde je to, co jsme se naučili.

Pracovní prostory: Základní jednotka organizace

Pracovní prostor je logický kontejner, který sdružuje uživatele, data a konfiguraci pro jednoho zákazníka (nebo tým v rámci zákazníka). Viděli jsme týmy, které zaměňovaly pracovní prostory s fakturačními účty nebo dokonce s projekty – nedělejte to. Udržujte pracovní prostor jako základní rozsah tenanta a na něj vrstvěte další koncepty.

Klíčová rozhodnutí při návrhu:

  • Hierarchické nebo ploché? Některé platformy potřebují pracovní prostory vnořené do jiných (např. podnik s více odděleními). Doporučujeme dvouúrovňovou hierarchii: organizace (fakturační entita) a pracovní prostor (týmová jednotka). Vyhněte se hlubšímu vnořování, pokud to není nezbytně nutné – komplikuje dědičnost rolí a přístup k datům.
  • Jedinečné identifikátory: Používejte lidsky čitelný slug (např. acme nebo acme-marketing) pro pracovní prostor v URL, ale interně vždy spoléhejte na UUID. Slugy se mohou měnit; UUID by se měnit neměla.
  • Měkké smazání s ochrannou lhůtou: Smazání pracovního prostoru je radikální krok. Implementujte 30denní měkké smazání, aby uživatelé mohli data obnovit. Fakturaci zastavte okamžitě, ale data uchovávejte až do vypršení ochranné lhůty.

Když se zaregistruje nový uživatel, zamyslete se nad procesem onboardingu. Měl by si nejprve vytvořit pracovní prostor, nebo může prozkoumat sandbox? Preferujeme řízený postup, kdy uživatel vytvoří organizaci, poté svůj první pracovní prostor a hned je vyzván k pozvání kolegů. Tím se snižuje tření a nastavuje očekávání, že platforma je kolaborativní.

Častou chybou je připojení fakturačních plánů přímo k pracovním prostorům. Místo toho připojte fakturaci k organizaci, která obsahuje jeden nebo více pracovních prostorů. To umožňuje firmám mít jednu fakturu a zároveň poskytnout každému týmu vlastní pracovní prostor.

Role a oprávnění: Jemně odstupňovaná, ale ne příliš

Řízení přístupu na základě rolí (RBAC) je průmyslovým standardem, ale důležitá je míra podrobnosti. V DigiForge obvykle začínáme se třemi vestavěnými rolemi – Admin, Member, Viewer – a pro pokročilé plány umožňujeme vlastní role. Role Admin má plnou kontrolu nad pracovním prostorem, Memberové mohou vytvářet a upravovat většinu zdrojů a Viewerové mohou pouze číst.

Záludné je to s rozsahem oprávnění. Oprávnění by měla být standardně omezena na pracovní prostor, ale možná budete potřebovat oprávnění na úrovni organizace (např. správa fakturace) nebo dokonce přístup pro čtení napříč pracovními prostory pro konsolidované reporty. Modelujte oprávnění jako sadu dvojic action:resource a přiřaďte je k rolím. Ukládejte přiřazení do spojovací tabulky: (workspace_id, user_id, role_id).

Tip od profíka: Vyhněte se kontrole oprávnění pouze na aplikační vrstvě. Co nejvíce logiky pro přidělování oprávnění přesuňte do databáze pomocí zabezpečení na úrovni řádků (RLS) nebo policy enginu, jako je OPA. Snížíte tak riziko, že chyba ve webové vrstvě odhalí cizí data.

Jedním osvědčeným vzorem je ukládání role uživatele do session tokenu (JWT) namísto dotazování databáze při každém požadavku. Pozor ale: pokud ukládáte role do JWT, musíte mít mechanismus pro zneplatnění tokenů při změně role (např. krátká expirace tokenu nebo blacklist).

Zvažte také dědičnost rolí: měl by mít administrátor organizace automaticky administrátorská práva ve všech pracovních prostorech? Naše pravidlo: role organizace nastavují strop, ale role v pracovním prostoru mohou být restriktivnější. Například administrátor organizace má přístup do libovolného pracovního prostoru, ale administrátor pracovního prostoru nemá přístup k fakturaci.

Fakturace a cenové modely: metadata, nikoli obchodní logika

Fakturace je místo, kde multi-tenancy dostává reálné obrysy. Váš cenový model – za sedadlo, za pracovní prostor, podle využití nebo úrovně – se musí promítnout do datového modelu, ale fakturační systém by měl být oddělen od jádra aplikace. Použijte externího poskytovatele fakturace (Stripe, Recurly, Chargebee) a v databázi uchovávejte pouze ID předplatného a ID plánu.

Doporučujeme následující přístup k databázi:

  1. Tabulka plans, která definuje slug plánu, cenu a příznaky funkcí (např. max_users, storage_gb, api_rate_limit).
  2. Tabulka organizations s current_plan_id a billing_provider_subscription_id. Organizace propojte s pracovními prostory pomocí spojovací tabulky.
  3. Tabulka features (nebo jednoduchý JSON sloupec) pro ukládání přepsání. Pokud si například zákazník vyjedná vlastní sazbu, přepište cenu plánu na úrovni organizace.

Nejtěžší je omezit přístup na základě plánu. Máte dvě možnosti: vynucovat limity v aplikaci (zkontrolovat max_users před pozváním) nebo pomocí počtů řádků a triggerů v databázi. Preferujeme vynucování na úrovni aplikace, protože poskytuje lepší chybové zprávy pro uživatele, ale vždy přidáme noční úlohu na odsouhlasení, která označí organizace překračující limity.

Upgrady a downgrady plánů vyžadují pečlivé zacházení. Když zákazník provede upgrade, okamžitě mu zpřístupněte nové funkce, ale poměrnou část fakturace proveďte přes svého poskytovatele. Při downgradu se musíte rozhodnout: zablokovat přístup k funkcím, které přesahují nový plán, nebo poskytnout ochrannou lhůtu? Doporučujeme ochrannou lhůtu do konce aktuálního fakturačního období, po které vynutíte omezení.

Jedna lekce z praxe: nikdy nenechte selhání plateb vést ke ztrátě dat. Pokud platba selže, degradovat s grácií (např. omezit zápisové operace), ale data nemažte. Váš zákazník zaplatí – nakonec.

Izolace tenantů: Sdílené vs. silo

Izolace je nejdůležitější architektonické rozhodnutí. Standardní kompromis je mezi sdílenou databází (jedna databáze pro všechny tenanty, se sloupcem tenant_id v každé tabulce) a databází na tenanta (každý pracovní prostor má vlastní databázi). Vyzkoušeli jsme obojí a u většiny projektů jsme se ustálili na hybridním přístupu.

  • Sdílená s přísným RLS: Vhodná pro malé až střední tenanty (do 10 000 uživatelů). Row-level security je vestavěná v Postgresu a používáme session proměnnou (app.tenant_id) k filtrování každého dotazu. Toto je nejjednodušší na provoz a upgrade.
  • Databáze na tenanta: Nezbytná, když tenanti vyžadují přísnou shodu (HIPAA, SOC 2, GDPR ohledně umístění dat) nebo když je aplikace I/O náročná na tenanta. Provozní režie je reálná – migrace schémat musí být aplikovány na stovky databází – ale nástroje jako Flyway a automatizované CI to zvládají.
  • Schéma na tenanta: Střední cesta využívající samostatná schémata v rámci jedné databáze. Nabízí větší izolaci než sdílená tabulka, ale menší provozní režii než plné databáze. Používáme to pro nižší plány a zákazníky, kteří potřebují více, povýšíme na databázi na tenanta.

Bez ohledu na strategii izolace nikdy nepovolujte přímý přístup k databázi z klienta. Vždy směrujte přes API vrstvu, která vynucuje identitu tenanta. A proboha, kvůli vašemu pohotovostnímu týmu: nikdy, nikdy nepoužívejte tenant_id v URL bez ověření, že autentizovaný uživatel patří k tomuto tenantovi.

Migrace dat mezi úrovněmi izolace je realita. Například když tenant přeroste sdílenou databázi, možná ho budete muset migrovat na vyhrazenou databázi. Naplánujte to brzy: napište migrační skript, který exportuje a importuje data, a otestujte ho s daty podobnými produkčním. Mělo by být možné provést bez výpadku pomocí blue-green přístupu.

Automatické zřizování: Nechte práci na stroji

Ruční spouštění nových tenantů může fungovat pro prvních deset zákazníků, ale neškáluje to. Jak zdůrazňuje nedávný patent ContractorHUB, implementace s nulovým dotykem je klíčovým rozdílem pro multi-tenant SaaS [1]. Vybudovali jsme pracovní postupy zřizování, které automatizují vše od vytváření databází (nebo klonování schémat) až po nasazení výchozích dat a odeslání uvítacích e-mailů.

Typické automatizované zřizovací potrubí:

  1. Uživatel se zaregistruje, vytvoří organizaci a vybere plán.
  2. Webhook z vašeho fakturačního poskytovatele spustí zřizovací úlohu (např. serverless funkci nebo Kubernetes Job).
  3. Úloha vytvoří izolační vrstvu tenanta (schéma nebo databázi), provede počáteční migrace a naplní výchozí role a nastavení.
  4. Druhá úloha odešle e-mail s přihlašovacími instrukcemi a dalšími kroky.
  5. Uživatel je přesměrován do nového pracovního prostoru – plně funkčního – během několika sekund.

Idempotence je zde nezbytná. Pokud zřizovací úloha selže uprostřed, musí být bezpečné ji opakovat. Celý proces zabalíme do stavového automatu se sloupcem provisioning_status v řádku organizace: pending → creating → active → failed. Selhané stavy jsou odeslány do fronty mrtvých dopisů k lidskému zásahu.

Nezapomeňte připravit podpůrnou infrastrukturu: DNS záznamy pro vlastní domény, zahřívání CDN cache, limity API rate limitu na tenanta a monitorovací alerty. Automatizujte vše, co lze skriptovat, protože manuální kroky se pod tlakem zapomenou.

Závěr: Myšlení pro více tenantů

Multi-tenancy není něco, co přidáte až po spuštění. Musí od prvního dne řídit váš datový model, řízení přístupu, integraci fakturace a strategii nasazení. Dobrá zpráva: pokud zvládnete tyto čtyři pilíře – pracovní prostory, role, fakturaci a izolaci – zbytek vašeho SaaS bude výrazně snazší postavit a udržovat.

Každý SaaS je jiný, ale výše uvedené vzory nám dobře sloužily napříč odvětvími. Ať už právě začínáte s MVP nebo škálujete na tisíce tenantů, doporučujeme se nad těmito rozhodnutími důkladně zamyslet. A pokud chcete, aby se na vaši architekturu podíval někdo další, jsme vždy rádi, že ji můžeme posoudit.

#multi-tenant#saas#pracovní-prostory#role#fakturace#izolace#zřizování
DF

Tým DigiForge

Vývojový tým DigiForge – stavíme moderní weby, moduly, automatizace a píšeme o řemesle dodávání rychlých a odolných webových produktů.

Pojďme si promluvit

Máte v hlavě
projekt?

Řekněte nám, co tvoříte – navrhneme jasný plán a správný přístup pro váš produkt.

Zahájit projekt