Tenant Tenant protocol schemas
Tenant Schema (Multi-Tenant Architecture)
Defines the tenant/tenancy model for ObjectStack SaaS deployments.
Supports different levels of data isolation to meet varying security,
performance, and compliance requirements.
Isolation Levels:
shared_schema: All tenants share the same database and schema (row-level isolation)
isolated_schema: Tenants have separate schemas within a shared database
isolated_db: Each tenant has a completely separate database
Source: packages/spec/src/system/tenant.zod.ts
import { DatabaseLevelIsolationStrategySchema, DatabaseProviderSchema, QuotaEnforcementResultSchema, RowLevelIsolationStrategySchema, SchemaLevelIsolationStrategySchema, TenantSchema, TenantConnectionConfigSchema, TenantIsolationConfigSchema, TenantIsolationLevel, TenantQuotaSchema, TenantSecurityPolicySchema, TenantUsageSchema } from '@objectstack/spec/system' ;
import type { DatabaseLevelIsolationStrategy, DatabaseProvider, QuotaEnforcementResult, RowLevelIsolationStrategy, SchemaLevelIsolationStrategy, Tenant, TenantConnectionConfig, TenantIsolationConfig, TenantIsolationLevel, TenantQuota, TenantSecurityPolicy, TenantUsage } from '@objectstack/spec/system' ;
// Validate data
const result = DatabaseLevelIsolationStrategySchema. parse (data);
Property Type Required Description strategy 'isolated_db'✅ Database-level isolation strategy database { namingPattern: string; serverStrategy: Enum<'shared' | 'sharded' | 'dedicated'>; separateCredentials: boolean; autoCreateDatabase: boolean }optional Database configuration connectionPool { poolSize: integer; maxActivePools: integer; idleTimeout: integer; usePooler: boolean }optional Connection pool configuration backup { strategy: Enum<'individual' | 'consolidated' | 'on_demand'>; frequencyHours: integer; retentionDays: integer }optional Backup configuration encryption { perTenantKeys: boolean; algorithm: string; keyManagement?: Enum<'aws_kms' | 'azure_key_vault' | 'gcp_kms' | 'hashicorp_vault' | 'custom'> }optional Encryption configuration
Property Type Required Description namingPattern stringoptional (default: "tenant_{tenant_id}") Database naming pattern serverStrategy Enum<'shared' | 'sharded' | 'dedicated'>optional (default: "shared") Server assignment strategy separateCredentials booleanoptional (default: true) Separate credentials per tenant autoCreateDatabase booleanoptional (default: true) Auto-create database
Property Type Required Description poolSize integeroptional (default: 10) Connection pool size maxActivePools integeroptional (default: 100) Max active pools idleTimeout integeroptional (default: 300) Idle pool timeout usePooler booleanoptional (default: true) Use connection pooler
Property Type Required Description strategy Enum<'individual' | 'consolidated' | 'on_demand'>optional (default: "individual") Backup strategy frequencyHours integeroptional (default: 24) Backup frequency retentionDays integeroptional (default: 30) Backup retention days
Property Type Required Description perTenantKeys booleanoptional (default: false) Per-tenant encryption keys algorithm stringoptional (default: "AES-256-GCM") Encryption algorithm keyManagement Enum<'aws_kms' | 'azure_key_vault' | 'gcp_kms' | 'hashicorp_vault' | 'custom'>optional Key management service
Database provider for tenant data
Quota enforcement check result
Property Type Required Description allowed boolean✅ Whether the operation is within quota exceededQuota stringoptional Name of the exceeded quota currentUsage numberoptional Current usage value limit numberoptional Quota limit message stringoptional Human-readable quota message
Property Type Required Description strategy 'shared_schema'✅ Row-level isolation strategy database { enableRLS: boolean; contextMethod: Enum<'session_variable' | 'search_path' | 'application_name'>; contextVariable: string; applicationValidation: boolean }optional Database configuration performance { usePartialIndexes: boolean; usePartitioning: boolean; poolSizePerTenant?: integer }optional Performance settings
Property Type Required Description enableRLS booleanoptional (default: true) Enable PostgreSQL Row-Level Security contextMethod Enum<'session_variable' | 'search_path' | 'application_name'>optional (default: "session_variable") How to set tenant context contextVariable stringoptional (default: "app.current_tenant") Session variable name applicationValidation booleanoptional (default: true) Application-level tenant validation
Property Type Required Description usePartialIndexes booleanoptional (default: true) Use partial indexes per tenant usePartitioning booleanoptional (default: false) Use table partitioning by tenant_id poolSizePerTenant integeroptional Connection pool size per tenant
Property Type Required Description strategy 'isolated_schema'✅ Schema-level isolation strategy schema { namingPattern: string; includePublicSchema: boolean; sharedSchema: string; autoCreateSchema: boolean }optional Schema configuration migrations { strategy: Enum<'parallel' | 'sequential' | 'on_demand'>; maxConcurrent: integer; rollbackOnError: boolean }optional Migration configuration performance { poolPerSchema: boolean; schemaCacheTTL: integer }optional Performance settings
Property Type Required Description namingPattern stringoptional (default: "tenant_{tenant_id}") Schema naming pattern includePublicSchema booleanoptional (default: true) Include public schema sharedSchema stringoptional (default: "public") Schema for shared resources autoCreateSchema booleanoptional (default: true) Auto-create schema
Property Type Required Description strategy Enum<'parallel' | 'sequential' | 'on_demand'>optional (default: "parallel") Migration strategy maxConcurrent integeroptional (default: 10) Max concurrent migrations rollbackOnError booleanoptional (default: true) Rollback on error
Property Type Required Description poolPerSchema booleanoptional (default: false) Separate pool per schema schemaCacheTTL integeroptional (default: 3600) Schema cache TTL
Property Type Required Description id string✅ Unique tenant identifier name string✅ Tenant display name isolationLevel Enum<'shared_schema' | 'isolated_schema' | 'isolated_db'>✅ databaseProvider Enum<'turso' | 'postgres' | 'memory'>optional Database provider connectionConfig { url: string; authToken?: string; group?: string }optional Database connection config provisioningStatus Enum<'provisioning' | 'active' | 'suspended' | 'failed' | 'destroying'>optional Current provisioning lifecycle status plan Enum<'free' | 'pro' | 'enterprise'>optional Subscription plan customizations Record<string, any>optional Custom configuration values quotas { maxUsers?: integer; maxStorage?: integer; apiRateLimit?: integer; maxObjects?: integer; … }optional
Property Type Required Description url string✅ Database connection URL authToken stringoptional Database auth token (encrypted at rest) group stringoptional Turso database group name
Property Type Required Description maxUsers integeroptional Maximum number of users maxStorage integeroptional Maximum storage in bytes apiRateLimit integeroptional API requests per minute maxObjects integeroptional Maximum number of custom objects maxRecordsPerObject integeroptional Maximum records per object maxDeploymentsPerDay integeroptional Maximum deployments per day maxStorageBytes integeroptional Maximum storage in bytes
Tenant database connection configuration
Property Type Required Description url string✅ Database connection URL authToken stringoptional Database auth token (encrypted at rest) group stringoptional Turso database group name
This schema accepts one of the following structures:
Property Type Required Description strategy 'shared_schema'✅ Row-level isolation strategy database { enableRLS: boolean; contextMethod: Enum<'session_variable' | 'search_path' | 'application_name'>; contextVariable: string; applicationValidation: boolean }optional Database configuration performance { usePartialIndexes: boolean; usePartitioning: boolean; poolSizePerTenant?: integer }optional Performance settings
Property Type Required Description enableRLS booleanoptional (default: true) Enable PostgreSQL Row-Level Security contextMethod Enum<'session_variable' | 'search_path' | 'application_name'>optional (default: "session_variable") How to set tenant context contextVariable stringoptional (default: "app.current_tenant") Session variable name applicationValidation booleanoptional (default: true) Application-level tenant validation
Property Type Required Description usePartialIndexes booleanoptional (default: true) Use partial indexes per tenant usePartitioning booleanoptional (default: false) Use table partitioning by tenant_id poolSizePerTenant integeroptional Connection pool size per tenant
Property Type Required Description strategy 'isolated_schema'✅ Schema-level isolation strategy schema { namingPattern: string; includePublicSchema: boolean; sharedSchema: string; autoCreateSchema: boolean }optional Schema configuration migrations { strategy: Enum<'parallel' | 'sequential' | 'on_demand'>; maxConcurrent: integer; rollbackOnError: boolean }optional Migration configuration performance { poolPerSchema: boolean; schemaCacheTTL: integer }optional Performance settings
Property Type Required Description namingPattern stringoptional (default: "tenant_{tenant_id}") Schema naming pattern includePublicSchema booleanoptional (default: true) Include public schema sharedSchema stringoptional (default: "public") Schema for shared resources autoCreateSchema booleanoptional (default: true) Auto-create schema
Property Type Required Description strategy Enum<'parallel' | 'sequential' | 'on_demand'>optional (default: "parallel") Migration strategy maxConcurrent integeroptional (default: 10) Max concurrent migrations rollbackOnError booleanoptional (default: true) Rollback on error
Property Type Required Description poolPerSchema booleanoptional (default: false) Separate pool per schema schemaCacheTTL integeroptional (default: 3600) Schema cache TTL
Property Type Required Description strategy 'isolated_db'✅ Database-level isolation strategy database { namingPattern: string; serverStrategy: Enum<'shared' | 'sharded' | 'dedicated'>; separateCredentials: boolean; autoCreateDatabase: boolean }optional Database configuration connectionPool { poolSize: integer; maxActivePools: integer; idleTimeout: integer; usePooler: boolean }optional Connection pool configuration backup { strategy: Enum<'individual' | 'consolidated' | 'on_demand'>; frequencyHours: integer; retentionDays: integer }optional Backup configuration encryption { perTenantKeys: boolean; algorithm: string; keyManagement?: Enum<'aws_kms' | 'azure_key_vault' | 'gcp_kms' | 'hashicorp_vault' | 'custom'> }optional Encryption configuration
Property Type Required Description namingPattern stringoptional (default: "tenant_{tenant_id}") Database naming pattern serverStrategy Enum<'shared' | 'sharded' | 'dedicated'>optional (default: "shared") Server assignment strategy separateCredentials booleanoptional (default: true) Separate credentials per tenant autoCreateDatabase booleanoptional (default: true) Auto-create database
Property Type Required Description poolSize integeroptional (default: 10) Connection pool size maxActivePools integeroptional (default: 100) Max active pools idleTimeout integeroptional (default: 300) Idle pool timeout usePooler booleanoptional (default: true) Use connection pooler
Property Type Required Description strategy Enum<'individual' | 'consolidated' | 'on_demand'>optional (default: "individual") Backup strategy frequencyHours integeroptional (default: 24) Backup frequency retentionDays integeroptional (default: 30) Backup retention days
Property Type Required Description perTenantKeys booleanoptional (default: false) Per-tenant encryption keys algorithm stringoptional (default: "AES-256-GCM") Encryption algorithm keyManagement Enum<'aws_kms' | 'azure_key_vault' | 'gcp_kms' | 'hashicorp_vault' | 'custom'>optional Key management service
shared_schema
isolated_schema
isolated_db
Property Type Required Description maxUsers integeroptional Maximum number of users maxStorage integeroptional Maximum storage in bytes apiRateLimit integeroptional API requests per minute maxObjects integeroptional Maximum number of custom objects maxRecordsPerObject integeroptional Maximum records per object maxDeploymentsPerDay integeroptional Maximum deployments per day maxStorageBytes integeroptional Maximum storage in bytes
Property Type Required Description encryption { atRest: boolean; inTransit: boolean; fieldLevel: boolean }optional Encryption requirements accessControl { requireMFA: boolean; requireSSO: boolean; ipWhitelist?: string[]; sessionTimeout: integer }optional Access control requirements compliance { standards?: Enum<'sox' | 'hipaa' | 'gdpr' | 'pci_dss' | 'iso_27001' | 'fedramp'>[]; requireAuditLog: boolean; auditRetentionDays: integer; dataResidency?: object }optional Compliance requirements
Property Type Required Description atRest booleanoptional (default: true) Require encryption at rest inTransit booleanoptional (default: true) Require encryption in transit fieldLevel booleanoptional (default: false) Require field-level encryption
Property Type Required Description requireMFA booleanoptional (default: false) Require MFA requireSSO booleanoptional (default: false) Require SSO ipWhitelist string[]optional Allowed IP addresses sessionTimeout integeroptional (default: 3600) Session timeout
Property Type Required Description standards Enum<'sox' | 'hipaa' | 'gdpr' | 'pci_dss' | 'iso_27001' | 'fedramp'>[]optional Compliance standards requireAuditLog booleanoptional (default: true) Require audit logging auditRetentionDays integeroptional (default: 365) Audit retention days dataResidency { region?: string; excludeRegions?: string[] }optional Data residency requirements
Current tenant resource usage
Property Type Required Description currentObjectCount integeroptional (default: 0) Current number of custom objects currentRecordCount integeroptional (default: 0) Total records across all objects currentStorageBytes integeroptional (default: 0) Current storage usage in bytes deploymentsToday integeroptional (default: 0) Deployments executed today currentUsers integeroptional (default: 0) Current number of active users apiRequestsThisMinute integeroptional (default: 0) API requests in the current minute lastUpdatedAt stringoptional Last usage update time