Ferme à SPIP

Un petit article synthétique qui explique en quelques mots et captures d’écrans comment faire une « ferme à SPIP » avec le plugin "Mutualisation" à partir d’un nom de domaine principal.

ATTENTION , cet article nécessite d’utiliser une version stable > à 2.0

Les prérequis (au 1er janvier 2008) :

-  posséder un nom de domaine disponible
-  avoir la possibilité de modifier la configuration apache

Dans l’exemple suivant on supposera que l’on cherche à mettre la ferme sur le site GrmlEU [1]

Installation SPIP

Installer un SPIP (une version récente est recommandée). Pour la suite de l’exercice on supposera que le SPIP est installé dans le répertoire « /home/grml/public_html/ ».

Installation plugin mutualisation

Installer le plugin Mutualisation [2] (il est plus simple de ne pas le mettre dans le répertoire plugin) . Nous avons donc « /home/grml/public_html/mutualisation »

Configuration apache

Modifier la configuration apache

Si vous êtes sur apache2 il faut créer un fichier grml.eu.

etc/apache2/sites-available# more grml.eu 
<VirtualHost *>
ServerName grml.eu
ServerAlias *.grml.eu
DocumentRoot /home/grml/public_html
</VirtualHost>

Ce qui veut dire que tous les sous domaines de grml.eu vont pointer vers le répertoire « /home/grml/public_html ».

Ensuite il faut faire une lien symbolique pour que le domaine soit actif

cd etc/apache2/sites-enable
ln -s /etc/apache2/sites-available/grml.eu  grml.eu 

Enfin il faut prendre en compte ces changements

/etc/init.d/apache2 force-reload 

Configuration DNS

Il faut maintenant que lorsque l’on tape grml.eu, il redirige vers l’adresse ip du serveur

voici la config utilisée chez gandi

Configuration de la mutualisation

Copier le fichier /home/grml/public_html/mutualisation/mes_options.php.txt vers « /home/grml/public_html/config » et enlevez l’extension « .txt » . Ouvrez ce fichier et procédez au paramétrage.

Pour vous aider voici le fichier de config utilisé sur scriibe

<?php

        $GLOBALS['taille_des_logs']=1000;
        #parametrage a faire 
        $monTld="scriibe.net";

        require _DIR_RACINE.'mutualisation/mutualiser.php';
        define ('_ID_WEBMESTRES', 1);

        $site = $_SERVER['HTTP_HOST'];

        $type_urls = 'propres2'; # par defaut, surchargeable ci-dessous

        switch($site) {
                case "www.$monTld":
                        $site=$monTld;
                        break;
                case 'www.spip-blog.net':
                        $site='spipblog';
                        break;
                case 'spip-blog.net':
                        $site='spipblog';
                        break;
                default :
                        $site = str_replace('.scriibe.net', '', $site);
                        break ; 
        }
        define ('_SITES_ADMIN_MUTUALISATION', ''); // ici sites esclaves
        define ('_INSTALL_SERVER_DB', 'mysql');
        define ('_INSTALL_HOST_DB', 'plouf');
        define ('_INSTALL_USER_DB_ROOT', 'plouf');
        define ('_INSTALL_PASS_DB_ROOT', 'plouf');
        define ('_INSTALL_TABLE_PREFIX', 'spip');
        define ('_INSTALL_NAME_DB', 'scr_'.prefixe_mutualisation($site));
        if ($site != "$monTld") {
                demarrer_site($site,
                        array(
                        'creer_site' => true,
                        'creer_base' => true,
                        'code' => 'plouf',
                        'url_img_courtes' => true,
                        'creer_user_base' => true,
                        'mail' => 'ben.spip@gmail.com'
                        )
                );
        }
        else {
        $GLOBALS['dossier_squelettes']=":mutualisation";
        }

?>

pour celui sur GrmlEU

<?php

        if (!defined("_ECRIRE_INC_VERSION")) return;
        require _DIR_RACINE.'mutualisation/mutualiser.php';

        $site = str_replace('www.', '', $_SERVER['HTTP_HOST']);
        if ($site != $_SERVER['HTTP_HOST']) {
                include_spip('inc/headers');
                redirige_par_entete('http://'.$site.'/');
        }

        define ('_INSTALL_SERVER_DB', 'mysql');
        define ('_INSTALL_HOST_DB', 'localhost');
        define ('_INSTALL_USER_DB', 'plouf');
        define ('_INSTALL_PASS_DB', 'plouf');
        define ('_INSTALL_NAME_DB', 'grml');
        #define ('_INSTALL_TABLE_PREFIX', 'spip');
 
        define ('_SITES_ADMIN_MUTUALISATION', 'grml.eu');


        demarrer_site($site,
                array(
                        'creer_site' => true,  
                        'creer_base' => false,
                        'creer_user_base' => false,
                        'mail' => 'ben.spip@gmail.com',               
                        'code' => 'ecureuil',
                        'table_prefix' => true,     
                        'cookie_prefix' => true,   
                        'repertoire' => 'sites',     
                        'url_img_courtes' => true, 
                        'url_creer_base' => '' 
                )
        );

?>

On peut noter que pour scriibe, une base et un utilisateur mysql sont créés pour chaque site. Par contre sur GrmlEU, il n’y a qu’un user et qu’une seule base, avec un préfixe différent pour les tables de chaque site.

Notes

[1GrmlEU est un site qui permet d’essayer SPIP : vous pouvez créer un SPIP en quelques clics. Les sites sont effacés tous les mois

Discussion

50 discussions

  • 4
    Marc VALLETEAU de MOULLIAC

    Bonjour, je trouve ce plugin vraiment formidable, car je suis en train de mettre en place sur mon serveur dédié (Apache 2) un hébergement de sites accessibles par nom de domaine et non en sous-domaine.

    J’ai alors modifié les lignes du haut pour les remplacer par ceci :

    $site = $_SERVER['HTTP_HOST'];
       if ($site != $_SERVER['HTTP_HOST']) {
          include_spip('inc/headers');
          redirige_par_entete('http://'.$site.'/');
    }

    En effet, en laissant le code d’origine, impossible d’accéder à mon site « maître » (http://www.atoutsweb.org)

    Ai-je bien fait ? La mise en place d’un autre site a été un peu cahotique, - en utilisant un autre domaine pointant sur le « maître », il m’a mis directement dans la fenêtre de création d’un répertoire, et non sur la demande du code (ecureuil) - mais ça a bien fonctionné en fin de compte.

    Par contre, j’ai un souci plus embêtant : sur la partie publique, il n’arrive pas à afficher les images du dossier IMG ou local/cache-vignettes car le chemin est incomplet (alors que tout s’affiche bien en privé).

    La modification ci-dessus en est-elle la cause ? Sinon, comment faire pour corriger cela ?

    Merci d’avance

    Marc

    • Delorimier

      Idem - j’ai le même problème avec les images dans la partie publique

    • Bonjour

      Est ce que l’on peux avoir l’adresse du soucis et le code du mes_options ?

    • VALLETEAU de MOULLIAC

      Bien, d’une part, je suis content d’avoir enfin (!) une réaction au sujet de mon post ...

      Par ailleurs, le problème a été résolu en complétant la config sur mon serveur (Mac os X) : j’ai autorisé toutes les dérogations, ce qui fait que depuis, cela fonctionne. Donc, le code du fichier mes_options.php n’est pas en cause ...

      Ce qui me soucie le plus, depuis cette solution, c’est la gesiton des plugins (en 2.0.10), car la plugin sensé permettre d’ajouter/enlever des plugins directement dans chaque site mutualisé est absolument inefficace. Il apparaît bien, en effet, la possibilité d’ajouter des plugins, mais ensuite, impossible de les activer !!

      Je suis donc obligé de les mettre dans le site maître, ce qui ne m’arrange pas toujours ...

      Merci à quiconque pourra m’aider à trouver une solution ...

    • Bonsoir

      ton message est dater de 2009 ... alors que j’en ai répondu en 2010 quand meme

      Est ce que tu peux nous en dire plus ?

      -  Tu es parti de quel exemple ?
      -  droit sur les dossiers ?
      ...

      Pour infos, sur ma mutu j’ai domaines et sous domaine et j’ai pas de soucis, les webmaster ont tous les droits

    Répondre à ce message

  • J’aimerai bien installer le plugin mutualisation chez free-h.org au travers d’une interface Plesk
    certain d’entre vous ont-ils réalisé cette installation

    merci

    Répondre à ce message

  • 1

    Salut et merci pour ce super plugin qui facilite vraiment les choses.

    Une précision pour les futurs utilisateurs, fruit d’une petite heure de prise de tête :

    il est préférable de s’arranger pour que le nom du répertoire de chaque site (donc dans l’exemple de cet article dans le répertoire ’sites/’) ne comporte pas de point !

    Je sais, c’est bateau mais si l’expérience peut servir ... j’aurai moins l’impression d’avoir perdu une heure pour une erreur d’inattention ;-)

    Explication rapide du problème rencontré :
    Si le répertoire d’un site est nommé du type ’sites/mondom.fr/’, certaines actions et notamment les téléchargements et accès aux documents sont impossibles (cas sur un serveur mutualisé OVH avec chmod limité à 755) ...
    Préférez donc des noms de répertoires du type ’mondom_fr/’ ou ’mondomfr/’

    Tchuss

    • Bonsoir

      Cela est possible chez OVH mais je n’ai pas ce soucis avec mon hébergeur même avec des sous.domaine.fr par exemple.

    Répondre à ce message

  • Bonjour,

    Petit truc de Matthieu Marcillaud passé sur l’IRC.

    Dans le cas d’une installation d’un mutualisation sur un site déjà existant, afin de conserver le site maitre accessible, rajouter autour des lignes 8/10 de mes_options.php :

    $mutualisation = ($_SERVER['HTTP_HOST'] == 'ledomaine.tld') ? false : true ;
    	if ($mutualisation) {
    	define ('_SITES_ADMIN_MUTUALISATION', 'ledomaine.tld');
    /* ici, tout le reste de votre mes_options.php concernant la mutualisation, et mettre le } pour finir le  if */
    }

    Une grand merci à Matthieu et à la communauté SPIP.

    Répondre à ce message

  • François Daniel Giezendanner

    Recherche spécialiste SPIP pour enseigner la maîtrise de la création de Fermes à SPIP : Etat de l’art

    Pour dispenser cette formation à une équipe du SEM nous cherchons un spécialiste SPIP ayant la maîtrise et l’expérience de la mise en place de Fermes à SPIP avec les technologies les plus performantes.

    Les personnes intéressées sont priées de s’adresser à :

    François Daniel Giezendanner : francois-daniel.giezendanner at edu.ge.ch

    en indiquant des exemples de réalisations de fermes à SPIP.

    Information complémentaire : http://icp.ge.ch/sem/cms-spip/spip.php?article1039

    Répondre à ce message

  • 7

    Bonjour,

    Je voudrais signaler un truc qui me semble important, dans le cadre d’une installation mutualisée par sous-domaines ou le serveur Apache n’est pas le serveur MySQL, et ou on souhaite utiliser le même utilisateur MySQL sur les bases des sites mutualisés (plutôt que de créer un utilisateur par base à chaque création de nouveau site). Cet utilisateur étant préexistant.

    L’installation plantait systématiquement après la création de la base, au moment de créer les tables, en déclarant que la connexion à la base était impossible. On se retrouvait avec un utilisateur MySQL déclaré comme opérant depuis le serveur MySQL (user@serveur_mysql), alors qu’il aurait du l’être depuis le serveur Apache (user@serveur_apache). Dans mon cas c’était user@IP_du_serveur_apache vu que l’utilisateur est unique pour tous les noms de domaines (même ceux qui n’existent pas encore).

    En clair : la connexion avec root fonctionne bien, elle crée la base, crée un utilisateur (alors qu’elle devrait juste ajouter des droits à l’utilisateur existant) et dès que ce nouvel utilisateur est utilisé -> connexion impossible.

    Finalement, en commentant la ligne 157 du fichier mutualiser_creer.php « define (’_INSTALL_HOST_DB_LOCALNAME’, _INSTALL_HOST_DB) » et en initialisant _INSTALL_HOST_DB_LOCALNAME avec l’IP du serveur Apache tout rentre dans l’ordre.

    Je sais pas si c’est très clair :) mais il me semble qu’au lieu d’affecter directement la valeur la ligne 157 devrait le faire uniquement dans le cas ou _INSTALL_HOST_DB_LOCALNAME n’est pas défini.

    Evidemment ça fonctionne bien tel quel sur les environnements de développement (testé sur WAMP et MAMP) puisque tous les serveurs sont sur la même machine (localhost).

    • @philip : tu n’as pas besoin de commenter la ligne en question pour ajouter ton propre

      define (’_INSTALL_HOST_DB_LOCALNAME’, '...');

      un peu en amont dans le fichier qui définit tes paramètres de mutualisation.

    • J’ai fait ce dont tu me parles dès le début.

      La solution a consisté à commenter la ligne 157 du fichier mutualisation/mutualiser_creer.php « define (’_INSTALL_HOST_DB_LOCALNAME’, _INSTALL_HOST_DB) » et en initialisant _INSTALL_HOST_DB_LOCALNAME avec l’IP du serveur Apache dans le fichier /config/mes_options.php.

      J’ai perdu plusieurs heures là-dessus, ce n’est pas une situation simple, merci de bien lire mon message :) ...

      Voici le contenu du fichier mes_options.php :

      $TLD=« domaine.ext » ;

      $site = str_replace(’www.’, ’’, $_SERVER[’HTTP_HOST’]) ;
      if ($site != $_SERVER[’HTTP_HOST’])
      include_spip(’inc/headers’) ;
      redirige_par_entete(’http://’.$site.’/’) ;
      else $site = str_replace(’.’ . $TLD, ’’, $site) ;

      define (’_INSTALL_HOST_DB’, ’nom_serveur_mysql’) ;
      define (’_INSTALL_HOST_DB_LOCALNAME’, ’IP_serveur_apache’) ;
      define (’_INSTALL_USER_DB_ROOT’, ’root’) ;
      define (’_INSTALL_PASS_DB_ROOT’, ’root_passwd’) ;
      define (’_SITES_ADMIN_MUTUALISATION’, ’’) ;
      define (’_INSTALL_SERVER_DB’, ’mysql’) ;
      define (’_INSTALL_TABLE_PREFIX’, ’spip’) ;
      define (’_INSTALL_NAME_DB’, ’toto_’ . prefixe_mutualisation($site)) ;
      define (’_INSTALL_USER_DB’, ’tata’) ;
      define (’_INSTALL_PASS_DB’, ’tutu’) ;
      define(’_PRIVILEGES_MYSQL_USER_BASE’,’Alter, Select, Insert, Update, Delete, Create, Drop’) ;

      demarrer_site($site,
      array(
      ’creer_site’ => true,
      ’creer_base’ => true,
      ’code’ => ’tagada’,
      ’url_img_courtes’ => true,
      ’creer_user_base’ => true,
      ’table_prefix’ => false,
      ’cookie_prefix’ => true,
      ’repertoire’ => ’sites’,
      ’mail’ => ’admin@spip.u-bordeaux4.fr’
      )
      ) ;

      Si je ne commente pas cette ligne, je me retrouve avec un utilisateur_mysql@serveur_mysql qui ne risque pas d’ouvrir de connexion, au lieu de l’utilisateur_mysql@serveur_apache attendu.

    • Il y a un truc qui m’échappe. Le défine que tu commentes est conditionné par le fait de créer un utilisateur pour la nouvelle base, or tu dis :

      on souhaite utiliser le même utilisateur MySQL sur les bases des sites mutualisés (plutôt que de créer un utilisateur par base à chaque création de nouveau site). Cet utilisateur étant préexistant.

      J’en conclus qu’il devrait y avoir ’creer_user_base’ => false, et non true ?

      Il est possible qu’il y ait un bug avec cette configuration que tu décris cependant, mais on devrait s’en sortir à coup de define(). Si c’est pas le cas, il faut corriger… mais commenter le code n’est peut être pas la meilleure correction :)

    • Oui, mais d’après ce que j’ai compris du code et les essais que j’ai faits, si je mets ’creer_user_base’ => false j’obtiens « La connexion à la base de données a échoué. » à l’étape 1 « Connexion à votre base de données », avec la nouvelle base créée et vide...

      Le ’creer_user_base’ => true me permet de passer dans le code qui ajoute les droits MySQL à l’utilisateur unique (qui ne doit pas être root) sur la base nouvellement créée.

      En utilisant la version actuelle de mutualiser_creer.php je me retrouve avec un nouvel utilisateur créé sur le serveur MySQL, qui porte le même nom que _INSTALL_USER_DB mais au lieu d’être @le_serveur_http il est @le_serveur_mysql, et évidemment ça ne peut pas fonctionner.

      J’avais commenté la ligne pour tester, et maintenant je pense qu’il faudrait mettre à la place quelque-chose comme

      if (!defined(’_INSTALL_HOST_DB_LOCALNAME’))
      define (’_INSTALL_HOST_DB_LOCALNAME’, _INSTALL_HOST_DB) ;

      qui permettrait de pouvoir différencier le cas ou le serveur MySQL n’est pas le serveur HTTP : la création de nouveau site fonctionnait sans modification avec la configuration de mes_options.php donnée précédemment sur l’environnement de développement ou serveur_MySQL = serveur_HTTP = localhost, le problème est apparu lorsque je l’ai essayée « en vrai », ou le serveur MySQL n’est pas le serveur HTTP et ou on doit donner à l’utilisateur MySQL nommé utilisateur_MySQL@serveur_HTTP (le _INSTALL_USER_DB donc) les droits sur la nouvelle base du nouveau site Spip.

      Sans modif du code, on se retrouve avec les droits de utilisateur_MySQL@serveur_HTTP inchangés, et un nouvel utilisateur_MySQL@serveur_MySQL ayant les droits sur la nouvelle base, mais inutilisable puisqu’on va s’en servir pour se connecter depuis serveur_HTTP...

      Avec modif, on obtient une mise à jour des droits de utilisateur_MySQL@serveur_HTTP, lui donnant les droits nécessaires sur la nouvelle base.

      Bon, d’accord, ce qui m’arrive n’est pas facile à expliquer :) ...

    • La correction proposée est tout aussi inutile, en théorie, que la première.

      if (!defined(’_INSTALL_HOST_DB_LOCALNAME’))
      define (’_INSTALL_HOST_DB_LOCALNAME’, _INSTALL_HOST_DB) ;

      Comme disait Fil, cela revient à laisser tel quel mutualiser_creer.php et à définir un define(’_INSTALL_HOST_DB_LOCALNAME’, ’serveur’) ; dans le mes_options.php du SPIP (avant l’appel à demarrer_site() donc).

      Si cela ne fonctionne pas, c’est que le problème est ailleurs.

      Par ailleurs aussi, le fait de mettre « creer_user_base = true » alors que ça ne semble pas répondre à votre besoin - si je comprends un peu - est ennuyeux. Peut être faut il ajouter une option « ajouter_user_base » (ou un meilleur nom) qui ne ferait qu’ajouter la permission à un utilisateur existant ?

    • Tout ce que je peux dire c’est que par défaut je me retrouve avec une création du même nom d’utilisateur depuis un hôte portant le nom du serveur MySQL, et que ça ne fonctionne pas !

      Mais bon, ici le DNS est parfois un peu bizarre. Peut-être est-ce l’explication...

      Quoi qu’il en soit, « ajouter_user_base » correspond effectivement à ce j’ai besoin de faire : si vous pouviez étudier cette possibilité dans une future évolution ça éviterait de demander à chaque fois la création d’un utilisateur qui existe déjà, et c’est peut-être aussi ça qui me crée des problèmes.

      J’en sais rien en fait. L’essentiel pour moi étant d’obtenir le résultat recherché dans le temps imparti, je vais me contenter de ça pour l’instant jusqu’à ce que la cause de ce bronx soit isolée.

      Merci en tous cas pour votre disponibilité, et pour ce développement qui permet de voir plus grand.

    • J’ai beau regarder le code, je vois pas où ça pourrait coincer.
      « creer_user_base » sous MySQL remplit bien ce que vous attendez : la requête SQL semble la même si on ajoute un utilisateur à une bdd que si on « crée et ajoute » un utilisateur à une bdd. Les define paraissent corrects également et devraient définir un « user@ip » que vous attendez SI le define est indiqué avant. Je ne vois pas ce qui pourrait clocher dans la mutu et ce que vous avez fait. C’est étrange.

    Répondre à ce message

  • 1
    Maxwell

    il doit le faire automatiquement
    Quant tu va apeller le site http://www.tartenpion.org il va te créer les dossier manquant dans sites/ tartenpion / et quand tu va faire http://intranet.tartenpion.org il va te créer les dossier manquant dans sites/ intranet.tartenpion /
    mais si tu veux faire des sites http://www.tartenpion.org/intranet c carement autre chose

    C’est bon j’ai réussi à faire ce que je voulais !!Ca marche quand je fais http://serveur/spip/intranet ou http://serveur/spip/internet avec la creation des tables utilsant le prefixe intranet et internet.
    J’avais un gros souci avec le fichier mes_options.php.En fait je voulais faire de la mutualisation de répertoire.
    Merci beaucoup de m’avoir aidé :D

    • Christophe Sevin

      Bonjour Maxwell,

      Si tu as réussi à faire de la mutualisation de repertoire avec SPIP 2.0, peux tu faire une contrib qui explique ou bien indiquer les contribs qui t’on été utiles pour le faire car j’aimerais faire la même chose mais je rencontre des difficultés.

      Merci.

    Répondre à ce message

  • Christophe Sevin

    Bonjour, la question peut paraitre stupide mais ou trouve t’on le lien pour télécharger le plugin (j’aimerais l’installer sur une SPIP 2.0.8).

    J’aimerais par ailleurs faire une mutualisation de répertoire, existe t’il une solution à privilégier dans ce cas (en fait j’aimerais simplement que mes utilisateurs ne soit pas déboussolés et gardent les mêmes adresses, mais ça je pourrais le faire grâce à une petite réécriture d’url) ?

    Merci beaucoup à tous les contributeurs ^^.

    Cordialement,

    Christophe Sevin.

    Répondre à ce message

  • 1

    Salut,

    Je vais poser la question con : si on a apache 1 chez notre hébergeur, ça marche toujours ?...

    Voici ma config chez MavenHosting :
    Version Apache : 1.3.41 (Unix)
    Version PHP : 5.2.9
    Version MySQL : 5.0.81-communit

    • Oui sans problème. Sauf que la méthode de configuration n’est pas la même. Mais si tu sais configurer ton apache , alors pas de soucis.

      A la limite copie colle ton httpd.conf pour voir

    Répondre à ce message

  • 2

    Un exemple de bidouille pour permettre à certains webmestres des sites mutualisés de disposer d’un dossier /plugins dans leur instance de site en plus du dossier /plugins du SPIP central est expliqué dans le Carnet Mutualisation : Gestion des dossiers /plugins (ou utiliser _DIR_PLUGINS_SUPPL)

    • cy_altern

      ça marche pas ton truc

    • tt tt tt ! tu ne dis pas « ça marche pas » alors que c’est simplement que tu n’as pas suivi la doc correctement ! (cf discussion sur l’IRC #spip ce matin)

    Répondre à ce message

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom