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

Dernière modification de cette page le 9 février 2019

Discussion

47 discussions

  • 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

  • 1
    Maxwell

    Bonjour,

    Merci beaucoup pour toutes vos réponses,

    Alors tu as fait une connerie, tu me vide le dossiers sites au plus vites

    Spip te les créera (c pour ça les chmod 777)mais un conseil ne les apelle pas pareils

    J’ai fait comme vous avez dit.Comment je dois faire dans ce cas, pour qu’il me crée un dossier intranet par exemple dans sites ??Quand je lance l’url http://serveur/spip/intranet il me crée en fait un dossier portant le nom de mon serveur dans sites.C’est pas vraiment cela que je souhaiterai avoir.J’ai du raté une étape ou je n’ai pas compris le principe.
    Merci d’avance
    Bonne journée !!

    Répondre à ce message

  • 1
    Maxwell

    Oui c’est bien cela.Pour l’instant je teste ca sur un serveur de développement.
    C’est plus pratique pour la maintenance des sites de mutualiser.Il suffit de mettre à jour une seule fois.

    « Sinon Tu mets spip dans un dossier spip, tu rajoute le plugins mutualisation et sites chmod 777) dans ce meme dossiers spip »

    Ceci a été fait.

    J’ai crée dans sites 2 dossiers intranet et internet avec chacun 4 dossiers( tmp,local,IMG et config)
    Ce que je comprend pas, c’est que lorsque je lance l’url http://serveur/spip/ ou http://serveur/spip/intranet
    il me demande de créer un répertoire et du coup me crée un dossier serveur(nom du serveur) dans sites.
    Il y aurait un systeme de redirection à mettre en place non ??

    • Alors tu as fait une connerie, tu me vide le dossiers sites au plus vites

      Spip te les créera (c pour ça les chmod 777)mais un conseil ne les apelle pas pareils

    Répondre à ce message

  • 1
    Maxwell

    Bonjour à tous

    Je souhaiterai me créer un intranet et un internet en utilisant la mutualisation
    Je possede un serveur : je lance mes appli web par exemple par l’url http://serveur/appli1...http://serveur/appli2

    Je me suis installé un SPIP dans http://serveur/spip
    J’ai installé le plugin mutualisation dans la racine de spip
    J’ai crée un dossier sites/ dans la racine spip avec acces ecriture
    J’aimerai pour lancer mes sites mutualisés de cette facon :
    http://serveur/intranet et http://serveur/internet
    Je n’y arrive pas du tout.Je n’arrive pas à configurer mon fichier mes_options.php
    Est ce que quelqu’un pourrait m’apporter un peu d’aide ??
    Merci d’avance

    • Bonjour

      Si je comprens bien tu vas monter 2 intrénet sur le même serveur ? Je trouve ça bizard mais bon, si c que pour deux site ne fais pas de mutualisation a mon goût

      Sinon
      Tu mets spip dans un dossier spip, tu rajoute le plugins mutualisation et sites chmod 777) dans ce meme dossiers spip

      Les dossier tmp, IMG et local doivent être supprimer. POur le mes_options a tu bien lu nos indications ?

    Répondre à ce message

Ajouter un commentaire

Qui êtes-vous ?

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