Drupal en mode SaaS (multisites avec ouvertures automatisées)

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour à tous,

je suis actuellement en train de mettre en place une ferme Drupal, càd, une gestion multisites. De ce point de vue il n'y a pas de soucis, je maitrîse Apache2, MySQL etc. Je met juste après un mini tuto qui pourra aider, ma question est après pour ceux qui savent déjà faire.

Pour procéder, j'ai fais ceci , sous Ubuntu Server 11.10 :
(ce qui suit peut servir de mini tuto pour ceux qui tomberont sur le sujet, dans le cas on on travaille en local)

DL des sources puis extraction des sources de Drupal

sudo mkdir /home/data
cd /home/data
sudo chown -R www-data:www-data ../data
sudo chmod -R 777 ../data
wget -c http://ftp.drupal.org/files/projects/drupal-7.12.tar.gz
tar -xvf ./drupal-7.12.tar.gz
sudo mv ./drupal-7.12 ./drupal
sudo chmod -R 550 ../data

création d'un lien symbolique entre /var/www et /home/data/drupal

sudo ln -s /home/data/drupal /var/www

préparation du premier site

cd /home/data/drupal/sites
sudo cp -r ./default ./site1.domaine
cd ./site1.domaine
sudo cp ./default.settings.php ./settings.php
sudo chmod o+w ./settings.php

prépartion du host et du vhost

préparation du fichier hosts :

sudo nano /etc/hosts

rajoutez la ligne suivante puis sauvegardez (ctrl + X >> Y >> Entrée) :

127.0.0.1   site1.domain

prépation du vhost :

cd /etc/apache2/sites-available
sudo cp ./default ./site1
sudo nano ./site1

remplacez la ligne 'Document Root /var/www' par 'DocumentRoot /var/www/drupal/' puis 'Directory /var/www' par 'Directory /var/www/drupal'. Sauvegardez.

prise en compte du vhost et restart de apache2

sudo a2ensite site1
sudo apache2ctl -k restart

il ne reste plus qu'à terminer l'installation

allez sur http://site1.domain dans votre navigateur préféré, et complétez l'installation. Il existe pleins de tuto sur le net, pour ça. N'oubliez pas de remettre les bons droits sur le 'settings.php'.

sudo chmod o-w /home/data/drupal/sites/site1.domain/settings.php

A ce stade, on a un site fonctionnel, accessible via l'URL, site1.domain. On peut installer les modules qu'on veut, y mettre du contenu, etc.

Ma question:

Maintenant, passons à ma question, à proprement parlé. Je veux automatiser l'ouverture de sites, en prenant le premier site comme modèle. Voilà comment j'ai procédé :

  • copie de /site1.domaine en /site2.domaine
  • modification du fichier settings.php
  • copie de la BBD associée
  • modification de champs de la nouvelle BDD (site_name, etc)
  • modification du /hosts et rajout du vhost

Cela fonctionne sans soucis, j'ai une parfaite copie, indépendante, du premier site, et avec un peu de scripting, je peux automatiser la procédure, et l'administration peut se faire ensuite avec drush.

L'avantage de ma méthode, est que je n'ai plus à aller sur le site au début pour réaliser l'installation. Pratique quand on veut ouvrir 20 sites en même temps (j'aurais ce cas de figure à gérer).

Ma méthode est-elle bonne? Je fais tout manuellement (ou via un script), ce qui peut amener à des surprises. Donc ne vaut-il pas mieux que je crée un profil d'installation (avec drush) d'après le premier site (le site modèle/template)?

Le problème alors est je n'ai pas trouvé comment faire pour éviter toute la phase d'installation en allant sur l'URL au début. De plus, je ne peux pas avoir un site avec du contenu par défaut contrairement à une copie de la BDD.

Merci d'avance, et n'hésitez pas si ma demande n'est pas claire.

Version de Drupal : 

Bonjour,

dans ton cas, drush-make pourrait être une bonne solution : il permet de définir un "makefile" avec la liste des modules à télécharger, et installe ainsi une arborescence complète.

J'ai également fait ce genre de script shell, qui crée la base de données, download tout ce qu'il faut via drush, modifie le settings.php.
Il me reste la partie virtualhost à faire.

L'approche est donc bonne.

Il reste cependant la partie Installation à faire. Ce qui est possible de faire c'est :

  • Faire une installation type complète
  • Faire un Dump de la base à ce moment
  • Lors de l'installation, créer la base et importer le contenu du dump "modèle"
  • Modifier le settings.php pour pointer vers cette base

Tu peux aussi regarder du côté de Aegir (http://www.aegirproject.org/ ou http://drupalfrance.com/node/1036) qui permet de gérer plusieurs sites Drupal.

Bonjour vincent59

merci pour ta réponse, je vois que je ne suis pas le seul à s'être posé des questions. Je suis en train de regarder du côté de drush et drush-make effectivement. Mon idée actuelle est de suivre le workflow suivant :

  • [Drush] Installation de Drupal (core + modules)
  • [Shell] Préparation du multisites (préparation du dossier du premier site dans /sites + copie du settings.php)
  • [Drush ou Shell] Création de la BDD du premier site
  • [Shell] Config du hosts et création du vhost
  • [A la mano] Installation du premier site et configuration de celui (il servira de site template)
  • [Drush-Make] Création du .make et du .profile selon le premier site

  • [Shell] Création du répertoire du second site + copie du settings.php + création hosts et vhost

  • [Shell ou Drush]Création BDD
  • [Drush] Installation du second selon le profil généré par le site 1 (le template)

On recommence pour les autres à partir de l'étape 7

Maintenant, pour faire bien, il faut pouvoir installer et déployer Drupal (core + modules) (étape 1°) avec un make, les modules allant dans /sites/all. Comme cela ils seront accessibles à tous les sites, et pas besoin de les re-télécharger à chaque création d'instance. Mes sites auront tous les mêmes modules, car tous basés sur un template unique.

Avec cette solution, il n'y aura aucun contenu par défaut dans les sites, mais je trouve cela plus propre, car on part sur des BDD vierges et pas des copies. Si j'ai vraiment besoin de contenu, il y'a des fonctions Drush qui permettent d'ajouter cela.

Pour l'ajout des utilisateurs (j'aurai environ 150 comptes à créer par site, de manière automatisé, les authentifications se faisant après via un CAS, mais c'est une autre affaire), je passerai aussi par Drush.

Mon interrogation actuelle est : pour la création des BDD, le fais-je avec des 'drush sql-*' ou bien dans mon Shell en calant la requête MySQL au milieu. Ça change rien d'un point de vue global, mais je cherche à faire les choses le plus proprement possible.
Je penche pour le faire via Drush, pour la simple raison que je trouve plus logique de séparer ce qui concerne l'installation d'une instance, et la config du serveur (vhost, hosts).

Pour ceux que ça intéresse, une fois que j'aurai répondu à toutes mes questions et que tout sera clair pour moi (parce que mine de rien, je débute avec Drupal), je compléterai mon tuto de mon post précédent pour que ça devienne une vraie doc. J'ai eu beau chercher sur le net, je n'ai rien trouvé sur comment mettre en place du SaaS avec Drupal, les tutos expliquant comment installer Drupal via Drush sont nombreux, mais aucun ne traite du cas où on fait du multisites.

bonjour, j ai développer un module d'authentification via SSO qui te permet d'associer des groupes de ton annuaire via le sso à un rôle drupal (un peu comme le module LDAP SSO mais en plus light).
le truc est qu on devait faire un authentification en allant chercher les info du sso sur un autre nom de domaine donc non fait par la communauté (le site a 2 nom de domaine 1 pour les anonymes et 1 pour récup des données SSO et retour sur nom de domaine1 avec authentification). Ca marche aussi si ton site est directement derrière le SSO.

=> pas besoin de gérer l'utilisateur, tu gère des groupes annuaire.

On pense peut être le rendre disponible à la communauté drupal.

Merci pour le conseil mais je ne suis pas sûr que ça corresponde vraiment à mon cas de figure. Car en plus du rôle, je dois récupérer les informations du profil de l'user dans le LDAP. J'avoue ne pas m'être encore très penché sur le sujet. Merci en tout cas.

J'ai avancé mon script, il est terminé à 90% je dirai, et j'arrive à tout faire sauf une étape, celle de l'installation d'un site avec Drush (c'est ballot... ^^).

Voilà la commande que je lance à la racine de Drupal (tout étant préparé avant, dossier, settings.php, BDD, etc) :

drush site-install standard --sites-subdir=monsite.mondomain --site-name=nom_de_mon_site --db-url=mysql://user_mysql:mdp_user_mysql@localhost/nom_BDD

L'installation a lieu, pas de soucis pour ça, mon soucis est que le nom de site que je renseigne pourtant dans ma ligne de commande n'est pas pris en compte. Je peux le changer via une requête SQL (même si modifier un BLOB à la main, c'est parfois bancale) ou bien en modifiant le settings.php pour qu'il override le contenu de site_name dans la table variable, mais je trouve ça pas propre. Et puis ça m'oblique à le coder. Savez-vous donc pourquoi Drush ne prend pas en compte ce paramètre?

Il me reste de plus à réaliser la création du user, l'admin premier.

Pour votre info, j'ai scripté en fabric (http://docs.fabfile.org/en/1.4.0/index.html), une librairie python faîtes pour l'administation de serveurs distants (tout passe en ssh, parce que le FTP c'est pas bien)

Je continue, mais sans question cette fois.
Je note ici mes trouvailles pour ceux qui chercheront dans le futur.

Pour être sûr qu'une installation via Drush fonctionne (pour avoir un site utilisable donc), il y'a deux pré-requis :

  • la ligne RewriteBase / du .htaccess (situé à la racine de Drupal) doit être décommentée
  • le mode rewrite d'Apache2 doit être actif (pour ce faire : sudo ln -s /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled/)

Pour avoir une installation via Drush directement en fr :