🌍 Django Multi-tenant : comprendre et mettre en place
🔹 Qu’est-ce que le multi-tenant ?
Le multi-tenant (multi-locataire) est une architecture logicielle où une seule application Django est utilisée par plusieurs clients (tenants), mais chaque client a ses données isolées.
En clair, tu n’installes pas une app Django pour chaque client, mais une seule instance partagée, ce qui simplifie la maintenance et l’évolutivité.
👉 Exemple concret :
- Un SaaS (Software as a Service) de gestion d’école.
- Chaque école (tenant) utilise la même application Django.
- Mais l’école A ne doit jamais voir les données de l’école B.
🔹 Deux approches principales en Django
-
Schéma partagé + filtrage des données
- Une seule base de données.
- Toutes les données sont stockées dans les mêmes tables.
- On ajoute un champ
tenant_id (ou organisation_id) à chaque modèle pour savoir à quel locataire appartient la donnée.
- Avantage : simple à mettre en place.
- Inconvénient : risque d’erreur si on oublie de filtrer par tenant.
-
Schéma isolé par tenant
- Toujours une seule base de données.
- Mais chaque tenant a son propre schéma PostgreSQL.
- Exemple :
tenant1.users, tenant2.users, etc.
- Avantage : isolation forte, sécurité renforcée.
- Inconvénient : plus complexe à gérer.
👉 Pour Django, la solution la plus utilisée est avec PostgreSQL + schémas séparés grâce à des librairies comme :
🔹 Exemple avec django-tenants
1️⃣ Installation
pip install django-tenants
2️⃣ Configuration du settings.py
On définit deux applications :
- Shared apps : utilisées par tous les tenants (ex. authentification, gestion des domaines).
- Tenant apps : propres à chaque tenant (ex. modèles métier).
SHARED_APPS = [
'django_tenants',
'customers', # app qui définit les tenants
'django.contrib.contenttypes',
'django.contrib.auth',
'django.contrib.sessions',
]
TENANT_APPS = [
'django.contrib.contenttypes',
'django.contrib.auth',
'myapp', # tes apps spécifiques
]
INSTALLED_APPS = SHARED_APPS + TENANT_APPS
DATABASE_ROUTERS = (
'django_tenants.routers.TenantSyncRouter',
)
3️⃣ Modèle Tenant
Dans customers/models.py :
from django_tenants.models import TenantMixin, DomainMixin
class Client(TenantMixin):
name = models.CharField(max_length=100)
paid_until = models.DateField()
on_trial = models.BooleanField(default=True)
class Domain(DomainMixin):
pass
TenantMixin → représente un tenant (client).
DomainMixin → lie un tenant à un domaine (ex. school1.monsaas.com).
4️⃣ Migration et création d’un tenant
python manage.py migrate_schemas --shared
Puis dans le shell :
from customers.models import Client, Domain
# Créer un tenant
tenant = Client(schema_name='tenant1', name='École A', paid_until='2026-01-01', on_trial=False)
tenant.save()
# Associer un domaine
domain = Domain(domain='ecolea.localhost', tenant=tenant)
domain.save()
5️⃣ Utilisation
Quand un utilisateur visite ecolea.localhost, Django bascule automatiquement sur le schéma tenant1 et isole ses données.
🔹 Avantages de l’architecture multi-tenant
✅ Mutualisation des ressources (un seul serveur / app Django).
✅ Mise à jour plus facile (on déploie une fois pour tous les clients).
✅ Meilleure isolation des données (surtout avec les schémas PostgreSQL).
✅ Idéal pour les SaaS et plateformes partagées.
🔹 Limites et précautions
⚠️ Complexité de mise en place (surtout pour la gestion des migrations multi-schémas).
⚠️ Risque de fuite de données si le filtrage n’est pas bien géré (dans le modèle "champ tenant_id").
⚠️ Les performances peuvent être affectées si on a des milliers de schémas (PostgreSQL peut devenir lourd).
🚀 Conclusion
Le multi-tenant dans Django est un choix stratégique pour développer un SaaS scalable.
- Si ton projet est simple ou avec peu de clients → utilise le champ tenant_id.
- Si tu veux une isolation forte et une vraie sécurité → utilise PostgreSQL +
django-tenants.
👉 C’est une approche puissante, mais elle demande de la rigueur dans la conception des modèles et de la base de données.