ObjectStackObjectStack

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

TypeScript Usage

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);

DatabaseLevelIsolationStrategy

Properties

PropertyTypeRequiredDescription
strategy'isolated_db'Database-level isolation strategy
database{ namingPattern: string; serverStrategy: Enum<'shared' | 'sharded' | 'dedicated'>; separateCredentials: boolean; autoCreateDatabase: boolean }optionalDatabase configuration
connectionPool{ poolSize: integer; maxActivePools: integer; idleTimeout: integer; usePooler: boolean }optionalConnection pool configuration
backup{ strategy: Enum<'individual' | 'consolidated' | 'on_demand'>; frequencyHours: integer; retentionDays: integer }optionalBackup configuration
encryption{ perTenantKeys: boolean; algorithm: string; keyManagement?: Enum<'aws_kms' | 'azure_key_vault' | 'gcp_kms' | 'hashicorp_vault' | 'custom'> }optionalEncryption configuration

Nested Shape: DatabaseLevelIsolationStrategy.database

PropertyTypeRequiredDescription
namingPatternstringoptional (default: "tenant_{tenant_id}")Database naming pattern
serverStrategyEnum<'shared' | 'sharded' | 'dedicated'>optional (default: "shared")Server assignment strategy
separateCredentialsbooleanoptional (default: true)Separate credentials per tenant
autoCreateDatabasebooleanoptional (default: true)Auto-create database

Nested Shape: DatabaseLevelIsolationStrategy.connectionPool

PropertyTypeRequiredDescription
poolSizeintegeroptional (default: 10)Connection pool size
maxActivePoolsintegeroptional (default: 100)Max active pools
idleTimeoutintegeroptional (default: 300)Idle pool timeout
usePoolerbooleanoptional (default: true)Use connection pooler

Nested Shape: DatabaseLevelIsolationStrategy.backup

PropertyTypeRequiredDescription
strategyEnum<'individual' | 'consolidated' | 'on_demand'>optional (default: "individual")Backup strategy
frequencyHoursintegeroptional (default: 24)Backup frequency
retentionDaysintegeroptional (default: 30)Backup retention days

Nested Shape: DatabaseLevelIsolationStrategy.encryption

PropertyTypeRequiredDescription
perTenantKeysbooleanoptional (default: false)Per-tenant encryption keys
algorithmstringoptional (default: "AES-256-GCM")Encryption algorithm
keyManagementEnum<'aws_kms' | 'azure_key_vault' | 'gcp_kms' | 'hashicorp_vault' | 'custom'>optionalKey management service

DatabaseProvider

Database provider for tenant data

Allowed Values

  • turso
  • postgres
  • memory

QuotaEnforcementResult

Quota enforcement check result

Properties

PropertyTypeRequiredDescription
allowedbooleanWhether the operation is within quota
exceededQuotastringoptionalName of the exceeded quota
currentUsagenumberoptionalCurrent usage value
limitnumberoptionalQuota limit
messagestringoptionalHuman-readable quota message

RowLevelIsolationStrategy

Properties

PropertyTypeRequiredDescription
strategy'shared_schema'Row-level isolation strategy
database{ enableRLS: boolean; contextMethod: Enum<'session_variable' | 'search_path' | 'application_name'>; contextVariable: string; applicationValidation: boolean }optionalDatabase configuration
performance{ usePartialIndexes: boolean; usePartitioning: boolean; poolSizePerTenant?: integer }optionalPerformance settings

Nested Shape: RowLevelIsolationStrategy.database

PropertyTypeRequiredDescription
enableRLSbooleanoptional (default: true)Enable PostgreSQL Row-Level Security
contextMethodEnum<'session_variable' | 'search_path' | 'application_name'>optional (default: "session_variable")How to set tenant context
contextVariablestringoptional (default: "app.current_tenant")Session variable name
applicationValidationbooleanoptional (default: true)Application-level tenant validation

Nested Shape: RowLevelIsolationStrategy.performance

PropertyTypeRequiredDescription
usePartialIndexesbooleanoptional (default: true)Use partial indexes per tenant
usePartitioningbooleanoptional (default: false)Use table partitioning by tenant_id
poolSizePerTenantintegeroptionalConnection pool size per tenant

SchemaLevelIsolationStrategy

Properties

PropertyTypeRequiredDescription
strategy'isolated_schema'Schema-level isolation strategy
schema{ namingPattern: string; includePublicSchema: boolean; sharedSchema: string; autoCreateSchema: boolean }optionalSchema configuration
migrations{ strategy: Enum<'parallel' | 'sequential' | 'on_demand'>; maxConcurrent: integer; rollbackOnError: boolean }optionalMigration configuration
performance{ poolPerSchema: boolean; schemaCacheTTL: integer }optionalPerformance settings

Nested Shape: SchemaLevelIsolationStrategy.schema

PropertyTypeRequiredDescription
namingPatternstringoptional (default: "tenant_{tenant_id}")Schema naming pattern
includePublicSchemabooleanoptional (default: true)Include public schema
sharedSchemastringoptional (default: "public")Schema for shared resources
autoCreateSchemabooleanoptional (default: true)Auto-create schema

Nested Shape: SchemaLevelIsolationStrategy.migrations

PropertyTypeRequiredDescription
strategyEnum<'parallel' | 'sequential' | 'on_demand'>optional (default: "parallel")Migration strategy
maxConcurrentintegeroptional (default: 10)Max concurrent migrations
rollbackOnErrorbooleanoptional (default: true)Rollback on error

Nested Shape: SchemaLevelIsolationStrategy.performance

PropertyTypeRequiredDescription
poolPerSchemabooleanoptional (default: false)Separate pool per schema
schemaCacheTTLintegeroptional (default: 3600)Schema cache TTL

Tenant

Properties

PropertyTypeRequiredDescription
idstringUnique tenant identifier
namestringTenant display name
isolationLevelEnum<'shared_schema' | 'isolated_schema' | 'isolated_db'>
databaseProviderEnum<'turso' | 'postgres' | 'memory'>optionalDatabase provider
connectionConfig{ url: string; authToken?: string; group?: string }optionalDatabase connection config
provisioningStatusEnum<'provisioning' | 'active' | 'suspended' | 'failed' | 'destroying'>optionalCurrent provisioning lifecycle status
planEnum<'free' | 'pro' | 'enterprise'>optionalSubscription plan
customizationsRecord<string, any>optionalCustom configuration values
quotas{ maxUsers?: integer; maxStorage?: integer; apiRateLimit?: integer; maxObjects?: integer; … }optional

Nested Shape: Tenant.connectionConfig

PropertyTypeRequiredDescription
urlstringDatabase connection URL
authTokenstringoptionalDatabase auth token (encrypted at rest)
groupstringoptionalTurso database group name

Nested Shape: Tenant.quotas

PropertyTypeRequiredDescription
maxUsersintegeroptionalMaximum number of users
maxStorageintegeroptionalMaximum storage in bytes
apiRateLimitintegeroptionalAPI requests per minute
maxObjectsintegeroptionalMaximum number of custom objects
maxRecordsPerObjectintegeroptionalMaximum records per object
maxDeploymentsPerDayintegeroptionalMaximum deployments per day
maxStorageBytesintegeroptionalMaximum storage in bytes

TenantConnectionConfig

Tenant database connection configuration

Properties

PropertyTypeRequiredDescription
urlstringDatabase connection URL
authTokenstringoptionalDatabase auth token (encrypted at rest)
groupstringoptionalTurso database group name

TenantIsolationConfig

Union Options

This schema accepts one of the following structures:

Option 1

Properties

PropertyTypeRequiredDescription
strategy'shared_schema'Row-level isolation strategy
database{ enableRLS: boolean; contextMethod: Enum<'session_variable' | 'search_path' | 'application_name'>; contextVariable: string; applicationValidation: boolean }optionalDatabase configuration
performance{ usePartialIndexes: boolean; usePartitioning: boolean; poolSizePerTenant?: integer }optionalPerformance settings

Nested Shape: TenantIsolationConfig[strategy='shared_schema'].database

PropertyTypeRequiredDescription
enableRLSbooleanoptional (default: true)Enable PostgreSQL Row-Level Security
contextMethodEnum<'session_variable' | 'search_path' | 'application_name'>optional (default: "session_variable")How to set tenant context
contextVariablestringoptional (default: "app.current_tenant")Session variable name
applicationValidationbooleanoptional (default: true)Application-level tenant validation

Nested Shape: TenantIsolationConfig[strategy='shared_schema'].performance

PropertyTypeRequiredDescription
usePartialIndexesbooleanoptional (default: true)Use partial indexes per tenant
usePartitioningbooleanoptional (default: false)Use table partitioning by tenant_id
poolSizePerTenantintegeroptionalConnection pool size per tenant

Option 2

Properties

PropertyTypeRequiredDescription
strategy'isolated_schema'Schema-level isolation strategy
schema{ namingPattern: string; includePublicSchema: boolean; sharedSchema: string; autoCreateSchema: boolean }optionalSchema configuration
migrations{ strategy: Enum<'parallel' | 'sequential' | 'on_demand'>; maxConcurrent: integer; rollbackOnError: boolean }optionalMigration configuration
performance{ poolPerSchema: boolean; schemaCacheTTL: integer }optionalPerformance settings

Nested Shape: TenantIsolationConfig[strategy='isolated_schema'].schema

PropertyTypeRequiredDescription
namingPatternstringoptional (default: "tenant_{tenant_id}")Schema naming pattern
includePublicSchemabooleanoptional (default: true)Include public schema
sharedSchemastringoptional (default: "public")Schema for shared resources
autoCreateSchemabooleanoptional (default: true)Auto-create schema

Nested Shape: TenantIsolationConfig[strategy='isolated_schema'].migrations

PropertyTypeRequiredDescription
strategyEnum<'parallel' | 'sequential' | 'on_demand'>optional (default: "parallel")Migration strategy
maxConcurrentintegeroptional (default: 10)Max concurrent migrations
rollbackOnErrorbooleanoptional (default: true)Rollback on error

Nested Shape: TenantIsolationConfig[strategy='isolated_schema'].performance

PropertyTypeRequiredDescription
poolPerSchemabooleanoptional (default: false)Separate pool per schema
schemaCacheTTLintegeroptional (default: 3600)Schema cache TTL

Option 3

Properties

PropertyTypeRequiredDescription
strategy'isolated_db'Database-level isolation strategy
database{ namingPattern: string; serverStrategy: Enum<'shared' | 'sharded' | 'dedicated'>; separateCredentials: boolean; autoCreateDatabase: boolean }optionalDatabase configuration
connectionPool{ poolSize: integer; maxActivePools: integer; idleTimeout: integer; usePooler: boolean }optionalConnection pool configuration
backup{ strategy: Enum<'individual' | 'consolidated' | 'on_demand'>; frequencyHours: integer; retentionDays: integer }optionalBackup configuration
encryption{ perTenantKeys: boolean; algorithm: string; keyManagement?: Enum<'aws_kms' | 'azure_key_vault' | 'gcp_kms' | 'hashicorp_vault' | 'custom'> }optionalEncryption configuration

Nested Shape: TenantIsolationConfig[strategy='isolated_db'].database

PropertyTypeRequiredDescription
namingPatternstringoptional (default: "tenant_{tenant_id}")Database naming pattern
serverStrategyEnum<'shared' | 'sharded' | 'dedicated'>optional (default: "shared")Server assignment strategy
separateCredentialsbooleanoptional (default: true)Separate credentials per tenant
autoCreateDatabasebooleanoptional (default: true)Auto-create database

Nested Shape: TenantIsolationConfig[strategy='isolated_db'].connectionPool

PropertyTypeRequiredDescription
poolSizeintegeroptional (default: 10)Connection pool size
maxActivePoolsintegeroptional (default: 100)Max active pools
idleTimeoutintegeroptional (default: 300)Idle pool timeout
usePoolerbooleanoptional (default: true)Use connection pooler

Nested Shape: TenantIsolationConfig[strategy='isolated_db'].backup

PropertyTypeRequiredDescription
strategyEnum<'individual' | 'consolidated' | 'on_demand'>optional (default: "individual")Backup strategy
frequencyHoursintegeroptional (default: 24)Backup frequency
retentionDaysintegeroptional (default: 30)Backup retention days

Nested Shape: TenantIsolationConfig[strategy='isolated_db'].encryption

PropertyTypeRequiredDescription
perTenantKeysbooleanoptional (default: false)Per-tenant encryption keys
algorithmstringoptional (default: "AES-256-GCM")Encryption algorithm
keyManagementEnum<'aws_kms' | 'azure_key_vault' | 'gcp_kms' | 'hashicorp_vault' | 'custom'>optionalKey management service


TenantIsolationLevel

Allowed Values

  • shared_schema
  • isolated_schema
  • isolated_db

TenantQuota

Properties

PropertyTypeRequiredDescription
maxUsersintegeroptionalMaximum number of users
maxStorageintegeroptionalMaximum storage in bytes
apiRateLimitintegeroptionalAPI requests per minute
maxObjectsintegeroptionalMaximum number of custom objects
maxRecordsPerObjectintegeroptionalMaximum records per object
maxDeploymentsPerDayintegeroptionalMaximum deployments per day
maxStorageBytesintegeroptionalMaximum storage in bytes

TenantSecurityPolicy

Properties

PropertyTypeRequiredDescription
encryption{ atRest: boolean; inTransit: boolean; fieldLevel: boolean }optionalEncryption requirements
accessControl{ requireMFA: boolean; requireSSO: boolean; ipWhitelist?: string[]; sessionTimeout: integer }optionalAccess control requirements
compliance{ standards?: Enum<'sox' | 'hipaa' | 'gdpr' | 'pci_dss' | 'iso_27001' | 'fedramp'>[]; requireAuditLog: boolean; auditRetentionDays: integer; dataResidency?: object }optionalCompliance requirements

Nested Shape: TenantSecurityPolicy.encryption

PropertyTypeRequiredDescription
atRestbooleanoptional (default: true)Require encryption at rest
inTransitbooleanoptional (default: true)Require encryption in transit
fieldLevelbooleanoptional (default: false)Require field-level encryption

Nested Shape: TenantSecurityPolicy.accessControl

PropertyTypeRequiredDescription
requireMFAbooleanoptional (default: false)Require MFA
requireSSObooleanoptional (default: false)Require SSO
ipWhiteliststring[]optionalAllowed IP addresses
sessionTimeoutintegeroptional (default: 3600)Session timeout

Nested Shape: TenantSecurityPolicy.compliance

PropertyTypeRequiredDescription
standardsEnum<'sox' | 'hipaa' | 'gdpr' | 'pci_dss' | 'iso_27001' | 'fedramp'>[]optionalCompliance standards
requireAuditLogbooleanoptional (default: true)Require audit logging
auditRetentionDaysintegeroptional (default: 365)Audit retention days
dataResidency{ region?: string; excludeRegions?: string[] }optionalData residency requirements

TenantUsage

Current tenant resource usage

Properties

PropertyTypeRequiredDescription
currentObjectCountintegeroptional (default: 0)Current number of custom objects
currentRecordCountintegeroptional (default: 0)Total records across all objects
currentStorageBytesintegeroptional (default: 0)Current storage usage in bytes
deploymentsTodayintegeroptional (default: 0)Deployments executed today
currentUsersintegeroptional (default: 0)Current number of active users
apiRequestsThisMinuteintegeroptional (default: 0)API requests in the current minute
lastUpdatedAtstringoptionalLast usage update time

On this page

TypeScript UsageDatabaseLevelIsolationStrategyPropertiesNested Shape: DatabaseLevelIsolationStrategy.databaseNested Shape: DatabaseLevelIsolationStrategy.connectionPoolNested Shape: DatabaseLevelIsolationStrategy.backupNested Shape: DatabaseLevelIsolationStrategy.encryptionDatabaseProviderAllowed ValuesQuotaEnforcementResultPropertiesRowLevelIsolationStrategyPropertiesNested Shape: RowLevelIsolationStrategy.databaseNested Shape: RowLevelIsolationStrategy.performanceSchemaLevelIsolationStrategyPropertiesNested Shape: SchemaLevelIsolationStrategy.schemaNested Shape: SchemaLevelIsolationStrategy.migrationsNested Shape: SchemaLevelIsolationStrategy.performanceTenantPropertiesNested Shape: Tenant.connectionConfigNested Shape: Tenant.quotasTenantConnectionConfigPropertiesTenantIsolationConfigUnion OptionsOption 1PropertiesNested Shape: TenantIsolationConfig[strategy='shared_schema'].databaseNested Shape: TenantIsolationConfig[strategy='shared_schema'].performanceOption 2PropertiesNested Shape: TenantIsolationConfig[strategy='isolated_schema'].schemaNested Shape: TenantIsolationConfig[strategy='isolated_schema'].migrationsNested Shape: TenantIsolationConfig[strategy='isolated_schema'].performanceOption 3PropertiesNested Shape: TenantIsolationConfig[strategy='isolated_db'].databaseNested Shape: TenantIsolationConfig[strategy='isolated_db'].connectionPoolNested Shape: TenantIsolationConfig[strategy='isolated_db'].backupNested Shape: TenantIsolationConfig[strategy='isolated_db'].encryptionTenantIsolationLevelAllowed ValuesTenantQuotaPropertiesTenantSecurityPolicyPropertiesNested Shape: TenantSecurityPolicy.encryptionNested Shape: TenantSecurityPolicy.accessControlNested Shape: TenantSecurityPolicy.complianceTenantUsageProperties