Dokumentace
Centrum nápovědyArchitekturaMulti-tenancy
docs/cs/01-architecture/multi-tenancy.md

Multi-tenancy

OPORA je multi-tenant systém, kde každý tenant je Organizace. Tenancy pravidla se uplatňují konzistentně napříč UI, aplikační logikou i perzistencí.

Definice tenanta

  • Tenant = Organizace
  • Uživatel může patřit do více organizací.
  • Aplikace běží pod aktivním kontextem organizace.

Pravidla vlastnictví dat (invarianty)

  • Každý záznam vlastněný tenantem obsahuje organizationId (nebo ekvivalentní ownership pole).
  • Všechny dotazy a zápisy jsou scoped na aktivní kontext organizace.
  • Cross-tenant přístup je zakázaný, pokud není explicitně navržen (a auditovaný); ve výchozím stavu je mimo scope.

Izolační strategie

Primární přístup: jedna databáze, logická izolace

  • Jedna Postgres databáze drží všechny tenanty.
  • Logická izolace je vynucována pomocí:
  • aplikační guard logiky (org kontext je povinný)
  • scoping dotazů a ownership checků
  • databázových omezení a indexačních strategií

Volitelné defense-in-depth

Podle risk tolerance a roadmapy:

  • Postgres politiky (např. row-level security) mohou přidat další vrstvu vynucení.
  • Je to defense-in-depth doplněk, ne náhrada za správnost aplikace.

Volba aktivní organizace

Protože uživatel může být členem více org:

  • post-auth routing musí aktivní org vybrat nebo na ni uživatele vyzvat
  • výběr org je perzistován bezpečným, serverem řízeným způsobem

Multi-tenant failure módy, kterým je potřeba zabránit

  • IDOR (Insecure Direct Object Reference): přístup k cizímu projektu hádáním ID.
  • Leaky joins: joiny bez organizationId scoping.
  • Leakage background jobů: exporty nebo async processing čtou/zapisují mimo org kontext.

Provozní dopady

  • Indexování podle organizationId je klíčové pro predikovatelnost výkonu.
  • Postupy backup/restore musí zachovat hranice tenantů a auditovatelnost.
  • Support nástroje nikdy nesmí “nakukovat” cross-tenant bez explicitní autorizace a logování.