Vai al contenuto

Multi-tenant hard: phases 1-2

Stato implementato

  • Tabella di registry: tenant_registry
  • Resolver host -> tenant context per request
  • Context disponibile in g.tenant_ctx e nei template come tenant_ctx
  • Routing DB per-request (opzionale): bind sessione ORM su db_uri tenant
  • Feature flag: disattivato di default

Configurazione

In .env:

MULTITENANCY_ENABLED=false
MULTITENANCY_STRICT_HOST_MATCH=false
MULTITENANCY_DEFAULT_TENANT_KEY=default
MULTITENANCY_ADMIN_HOSTS=127.0.0.1,localhost,10.50.0.200
MULTITENANCY_DB_ROUTING_ENABLED=false
MULTITENANCY_ENGINE_POOL_SIZE=5
MULTITENANCY_ENGINE_MAX_OVERFLOW=10
MULTITENANCY_ENGINE_POOL_RECYCLE=1800
TENANT_MYSQL_ADMIN_HOST=127.0.0.1
TENANT_MYSQL_ADMIN_PORT=3306
TENANT_MYSQL_ADMIN_USER=root
TENANT_MYSQL_ADMIN_PASSWORD=xxxx
TENANT_DB_HOST=127.0.0.1
TENANT_DB_PORT=3306

Migrazione DB

Applicare:

/root/.pyenv/versions/safeops/bin/flask --app app db upgrade

Note

  • Con MULTITENANCY_DB_ROUTING_ENABLED=true, la sessione ORM del request viene bindata al DB tenant.
  • Requisito: il DB tenant deve contenere lo stesso schema FAB/app.
  • Se db_uri non รจ presente per il tenant, resta il DB default.
  • Gli host in MULTITENANCY_ADMIN_HOSTS bypassano strict match e usano sempre il DB default.
  • Wizard provisioning disponibile in Impostazioni Avanzate -> Provisioning Tenant.
  • Il wizard usa comandi CLI (flask db upgrade, flask fab create-admin) sul DB tenant.

Esempio seed tenant_registry

INSERT INTO tenant_registry (tenant_key, display_name, primary_host, db_uri, is_active)
VALUES
  ('tenant_dev', 'Tenant Dev', '10.50.0.200', 'mysql+pymysql://user:pass@127.0.0.1:3306/appdb_tenant_dev', 1);