Project

General

Profile

HowDoWeDoDjangoTenants

Individuellement les projets n'ont pas à se soucier de multitenant, c'est totalement pris en charge par de la configuration.

Voir http://git.entrouvert.org/hobo.git/tree/debian/debian_config_common.py?h=master (à partir de # multitenant adaptations, ligne 206)

Exemple de fichier /usr/lib/<project>/debian_config.py appelé à la fin du settings.py du projet :

# /usr/lib/<project>/debian_config.py
# appelé en execfile() en toute fin des settings.py de <project>

PROJECT_NAME = 'foobar'

# si nécessaire:
#INSTALLED_APPS += ('mellon',)   # SAML2 authentication

execfile('/usr/lib/hobo/django_config_common.py')   # cf http://git.entrouvert.org/hobo.git/tree/debian/debian_config_common.py?h=debian

# en cas de besoin supplémentaire au niveau de la gestion des settings.py
# par tenant pour <project>. Par exemple pour Authentic:
TENANT_SETTINGS_MIDDLEWARE_LOADERS = +(
        'hobo.multitenant.settings_loaders.Authentic',
        # 'hobo.multitenant.settings_loaders.SettingsPy',
)

execfile('/etc/%s/settings.py' % PROJECT_NAME)

Utilisation

Création d'une base de données (avec comme propriétaire l'utilisateur faisant tourner le code de l'appli)

# su - postgres
$ createdb -O user foobar

Création d'un tenant

$ ./manage.py create_tenant foobar.example.net
[...]
$ ls /var/tmp/foobar/tenants/foobar.example.net/
media  static  templates

Appel des commandes de management

$ manage.py tenant_command createsuperuser -d foobar.example.net
Username (leave blank...)

Visite avec postgresql

$ psql foobar
foobar=> set schema 'foobar_example_net';
SET
foobar=> select username from auth_user;
 username 
----------
 fred
(1 ligne)
...

Fonctionnement

tenant_schema, "schémas" dans postgresql, + de notre côté des fichiers dans le filesystem, /var/lib/xxx/tenants/yyy.

Lancer des commandes

Commande unique:

package-manage tenant_command command -d domain ...

Commande multiple (pour les cron):

package-manage tenant_command command --all-tenants domain ...

Suppression des tenants

  • supprimer le service dans hobo
    sudo -u hobo hobo-manage shell -d hobo.<domaine client>
    
    In [1]: from hobo.environment.models import Brique
    In [2]: Brique.objects.get().delete()
    Out[2]: (1, {'environment.Brique': 1})
    
  • renommage du répértoire du tenant: sudo mv /var/lib/brique/tenants/brique<domaine client> /var/lib/brique/tenants/brique<domaine client>.<date>.invalid
  • suppression du service SAML dans authentic

Renommage des tenants

Renommage d'un site wcs (note: rien à voir avec les tenants Django)

  • déclarer le domaine et le vhost nginx
  • se rendre dans le backoffice de wcs /backoffice/settings/identification/idp/sp et /backoffice/settings/sitename et modifier les urls avec le nouveau nom.
  • renommer le répértoire du tenant
  • mettre à jour les méta-données dans authentic à partir de la nouvelle url des métadonnées
  • mettre à jour l'url de base dans le serveur hobo (dans le shell django)
  • dans l'ancien vhost nginx mettre en place la redirection vers le nouveau nom.

Migrations Django

Il faut utiliser une commande dédiée pour gérer les migrations sur les tenants.

Revenir à la migration d'avant

$ passerelle-manage migrate_schemas iparapheur 0005 -v2
$ passerelle-manage migrate_schemas iparapheur 0005 -v2 --fake  # uniquement en base

Ajouter une migration

$ passerelle-manage makemigrations
$ git add passerelle/contrib/iparapheur/migrations/0006_iparapheur_wsdl_endpoint_location.py
$ passerelle-manage migrate_schemas

Also available in: PDF HTML TXT