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 29 octobre 2017

Discussion

46 discussions

  • 1

    Bonjour,
    Il y a a priori une erreur dans la version 1.4.4, ligne 17 et 19 de mutualiser_creer.php : il manque les quotes autour du nom de la constante _SPIP_LOGO_MUTU. Cela entraîne un warning avec la version 7.2 de PHP (et ce sera une erreur fatale avec la 7.3)
    Voici ci-dessous le code corrigé :

    if (find_in_path('images/logo-spip.png')) {
    	define( '_SPIP_LOGO_MUTU',find_in_path('images/logo-spip.png'));
    } else {
    	define( '_SPIP_LOGO_MUTU',find_in_path('images/logo-spip.gif'));
    }

    Cordialement,
    Bruno

    Répondre à ce message

  • 2

    Bonjour à tous,
    J’ai plusieurs sites installés en mutualisation et pour la première fois, je dois en rajouter un nécessitant son propre fichier mes_options.php (à ne pas confondre avec le fichier mes_options.php de la mutu elle-même).
    Mais où placer ce fichier mes_options.php dans le cas d’une mutualisation ?
    Lorsque je le place dans le sous-dossier /config propre à ce site, il ne semble pas pris en compte ?
    Merci.
    PS : j’ai posé la même question sur la liste spip@rezo.net

    • Bonjour,

      Tu as trouvé la solution ?

    • Bonjour,

      Comme évoqué, mettre le fichier dans le sous dossier config propre au site concerné.
      Exemple (avec « sites » comme dossier des différents sites) :
      /sites/mon_site_mutualise/config/mes_options.php

      Normalement, cela fonctionne.

    Répondre à ce message

  • 5

    Bonjour,
    J’utilise spip 3.2.1 avec mutualisation et via le site privé, mes logos d’article sont téléchargés sur ecrire/IMG/LOGOS et sont donc identiques sur tous les sites.
    Puis-je modifier les paramètres de config pour que les logos soient téléchargés sur un sous-dossier de sites/mysite .com pour avoir des logos d’articles différents pour chaque site ?

    • Bonjour,

      On peut voir ton fichier mes_options avec la config de la mutu ?

    • Voila, j’ai supprimé les commentaires et infos privés :

      <?php
              if (!defined("_ECRIRE_INC_VERSION")) return;
              if (!is_readable (_DIR_RACINE.'mutualisation/mutualiser.php')) {
                      echo _L("Fichier 'mutualisation/mutualiser.php' manquant dans la racine " . _DIR_RACINE);
                      exit;
              }
              require _DIR_RACINE.'mutualisation/mutualiser.php';
      
              $site = str_replace('www.', '', $_SERVER['HTTP_HOST']);
              if ($site != $_SERVER['HTTP_HOST'] AND !in_array($site, $www)) {
                      include_spip('inc/headers');
                      $req = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '/';
                      if (isset($_SERVER['HTTPS'])
                      AND test_valeur_serveur($_SERVER['HTTPS']))
                              $protocole = 'https';
                      elseif (!isset($_SERVER["SCRIPT_URI"]) OR !($p = strpos($_SERVER["SCRIPT_URI"], '://')))
                              $protocole = 'http';
                      else $protocole = substr($_SERVER["SCRIPT_URI"],0,$p);
                      redirige_par_entete($protocole . '://' . $site . $req);
              }
      
              if (strpos($site, ':')) {
                      if (preg_match('/:80$/', $site)) $site = substr($site,-3);
                      else $site = str_replace(':', '_', $site);
              }
      
              define ('_INSTALL_SITE_PREF', $site);
              define ('_INSTALL_NAME_DB', 'mytable');
      
              define ('_INSTALL_SERVER_DB', 'mysql');
              define ('_INSTALL_HOST_DB', 'localhost');
              define ('_INSTALL_USER_DB', 'root');  
              define ('_INSTALL_PASS_DB', ''); 
      
              define ('_INSTALL_TABLE_PREFIX', myprefix);
              $cookie_prefix = strtok($site, '.'); 
      
              demarrer_site($site,
                      array(
                              'creer_site' => true,
                              'creer_base' => false,
                              'creer_user_base' => true,
                              'mail' => 'myemail@test.org',
                              'code' => '********',
                              'table_prefix' => false,
                              'cookie_prefix' => false,
                              'repertoire' => 'sites',
                              'url_img_courtes' => false,
                              'url_creer_base' => '',
                              'avant_initialisation' => ''
                      )
              );
      ?>
    • Je vois pas pourquoi cela va dans ecrire/IMG ...
      Pas logique.

      Les docs dans la médiathèque sont identique partout du coup ?
      Ensuite je vois une base pour tous les sites .... pas top si tu as de gros site je pense.

    • J’ai en fait 3 sites distincts mais disons frères jumeaux, ils utilisent la même base de données, et les tables supplémentaires sont identiques pour les 3 sites.
      Les photos des utilisateurs sont enregistré pour les trois sites dans IMG/LOGOS et IMG/INTRO, donc communs aux 3 sites.
      Le problème est juste que pour les logos des articles qui devraient être distincts et non communs.

    • Je sais pas si cela est possible par contre ...

    Répondre à ce message

  • 7

    Bonjour,

    Il m’arrive de surcharger la présentation de certains plugins dans l’espace privé dans par exemple : sites/monsite.com/squelettes/prive/formulaire/...

    Mais en mutualisé cela ne fonctionne plus. Une idée comment corriger ce souci ?

    En attendant, j’ai mis mes fichiers personnalisés à la racine de spip dans le dossier squelettes. Ce qui n’est pas très pratique car je ne peux choisir sur quel sites doit s’appliquer le/les fichiers modifier.

    • Bonsoir

      Est sans le dossier prive ?

      PS : Pourquoi surcharger les configuration de plugins ?

    • Non j’ai déjà essayé. Cela ne fonctionne pas.

      Pour certains plugins je change un peu la présentation html dans l’espace privé.

    • Dans ce cas pourquoi ne pas faire amélioré les plugins ?

    • Parce que ce n’est pas vraiment une amélioration. Voici l’issue d’un plugin que je souhaiterais surcharger :

      https://contrib.spip.net/Identite-Extra#forum487993

    • en effet, j’ai jamais fais ça en mutu.

    • Flute. Pas de solution alors ?

    • Salut,

      Tu peux surcharger le prive dans le dossier squelettes de ton site hein^

      Il est également possible de ne pas mutualiser les plugins... (c’est bien mieux amha en production)

      # desactiver le dossier plugins classique
      define('_DIR_PLUGINS','');
      # Definir un dossier plugins pour chaque site
      define('_DIR_PLUGINS_SUPPL',_DIR_RACINE.'sites/'.$site.'/plugins/'); 
      # Definir un dossier plugin/auto pour chaque site
      define('_DIR_PLUGINS_AUTO',_DIR_RACINE.'sites/'.$site.'/plugins/auto/'); 

      Les plugins-dist et le core de spip restent mutualisés mais chaque site a ses plugins persos

    Répondre à ce message

  • Bonjour,

    Nous mettons à disposition des établissements de notre académie une ferme de SPIP environ 110 hébergements actuellement. Nous utilisons pour cela le plugin mutualisation facile version 1.3.5 stable installé via la gestion des plugins. Nous souhaitons mettre à jour les plugins de l’ensemble des sites via la fonction l’admin de mutualisation « ecrire/ ?exec=mutualisation »

    Le script Upgrader intégrés à la mutualisation et servant à automatiser les mises à jour (extensions et noyau) semble ne pas fonctionner.

    L’option « Upgrader tout » n’a aucune action, le mode débogueur du navigateur nous apporte pas plus d’informations.

    Cependant, d’autres fonctionnalités sont opérationnelles (calcul des volumétries : documents, cache,...).

    Merci par avance de toute aide qui me sera apportée !

    Le plugin couteau suisse Version locale : 1.9.12 Révision : 101356 est aussi installé, nous avons activé L’Ecran de sécurité et mises à jour automatiques. L’écran de sécurité s’installe et se met à jour sans problème ainsi que les mises à jour automatiques.
    Serveur Debian 7.11 wheezy
    Server version : Apache/2.2.22 (Debian)
    php5 vers : 5.4.45-0+deb7u7
    SPIP 3.1.3 [23214]

    Répondre à ce message

  • 1

    J’aime beaucoup l’idée mais en terme de sécurité, cela ne craint pas trop d’avoir tout ses sites sur un seul noyau SPIP ? Si un compte utilisateur ftp est compromis, cela met tout les autres domaines en danger non ?

    • Cela dépend comme tu donnes tes accès ftp.
      Il vaut mieux garder le ftp pour l’admin général et donner des ftp restreint ensuite.

    Répondre à ce message

  • 8

    Bonjour,

    J’ai testé cette procédure en local et tout fonctionne parfaitement. J’ai juste un soucis dans l’espace privé ou tout les styles ont sautés (affichage brute) sur l’ensemble des sites mutualisés. En revanche, coté publique cela fonctionne nickel.

    Est-ce que quelqu’un a déjà eu ce problème ? Une constante dans mes_options.php a définir ?

    J’ai vidé le dossier tmp, vider le cache, supprimer mes plugins, restauré la base de donnée mais rien n’y fait.

    J’utilise php 5.6.30 avec Spip 3.1.3

    Merci pour votre aide.

    • J’ai un peu avancé dans mon problème.

      C’est au moment de la création du dossier « plugins » que le problème arrive.

    • En faite, je crois que j’ai pas bien compris comment définir de nouveaux squelettes dans mes sites mutualisés (différent par site).

      Chacun de mes sites on des dossiers squelettes différents. J’ai donc mis pour chacun, un fichier mes_options.php dans leur dossier config avec des appellations de squelettes différents.

      $GLOBALS['dossier_squelettes'] = _DIR_SITE . 'squelettes' . _DIR_SITE . 'squelettes-01' . _DIR_SITE . 'squelettes-02';

      Mais il semblerait que cela soit faux... :(

    • Bonjour,

      Tu veux faire un squelettes par site ?

      Normalement /sites/site1.example.com/squelettes fonctionne.

    • Ben j’aimerais faire quelque chose du style :

      /site1/config/mes_options.php
      (squelettes, squelettes-abc, squelettes-def)

      /site2/config/mes_options.php
      (squelettes, squelettes-ghi, squelettes-jkl)

      /site3/config/mes_options.php
      (squelettes, squelettes-mno, squelettes-pqr)

      Mon code plus haut fonctionne mais il fait planté mon espace privé.

    • Et sans les _DIR_SITE ?

      L’idée est de proposer plusieurs squelettes par site ?

    • Cela ne marche pas non plus en enlevant les « _DIR_SITE ».

    • Si on se réfère à : http://www.spip.net/fr_article1825.html

      La syntaxe est

      <?php
          $GLOBALS['dossier_squelettes'] = 'mes_skel1:mes_skel2';
      ?>

      Donc la syntaxe serais plutôt :

      1. $GLOBALS['dossier_squelettes'] = _DIR_SITE.'squelette1:'._DIR_SITE.'squelette2';

      @chez moi ça marche,

      cela dit je ne vois pas trop l’intérêt ou le but, moi je m’en sert plutot pour faire de A/B test et passer rapidement d’un skel à un autre avec une ligne par skel et en commentant/dé-commentant.

      Bonne journée

    Répondre à ce message

  • Bonjour,

    J’ai pu configurer sans problème un SPIP 3.1 mutualisé avec 4 sous-domaines. Très intéressant cette méthode. Cependant, j’aurais deux questions :

    1. Est-ce que je peux avoir en commun un dossier « squelettes-all » pour tout mes sous-domaine et partager les mêmes ressources (css, js, img, formulaires, modèles, etc...) ?

    2. Dans ma configuration j’ai ces 4 sites ci-dessous :

    site1.example.com
    site2.exemple.com
    site3.exemple.com
    site4.exemple.com

    Mais quand au site principale : www.exemple.com, est-ce que je peux acquérir les informations de chaque sous-domaines ? Ou chacune des ces ressources sont distinctes.

    Merci, Julien.

    Répondre à ce message

  • Bonjour,
    Je viens de tester sous Spip 3.1 et la dernière version du plugin.
    Quand je crée un nouveau site, tout est parfaitement géré, sauf qu’à la fin il m’envoie vers http://www.example.com/ecrire/ecrire/?exec=install, donc un ecrire/ de trop dans l’url ...

    Répondre à ce message

  • 7

    Ce plugin est-il compatible avec la nouvelle version 3.1 ?

    • Bonsoir,

      Pas encore tester mais tu peux et nous dire si tu as des problèmes.

    • Merci, mais très honnêtement, j’ai plus de vingt sites mutualisés, je ne vois pas commenter tester avec un seul et voir si ça marche ou pas ! je préfère d’autres retours d’expériences que mon crash éventuel... :- !

    • Je te conseil de monter une mutu en 3.1 et modifier tes vhost pour tester.
      perso je passe pas encore en 3.1 car j’ai des plugins non compatible.

    • Ça tombe bien, moi aussi ;-) J’attendrai donc !

    • Bonjour,

      J’ai testé en local ce plugin avec SPIP 3.1 et j’ai des problèmes pour créer de nouveaux sites. A noter que tout fonctionnait parfaitement en 3.0 . Avec les sites déjà installés tout semble OK.

      Les fichiers connect.php et chmod.php ne sont pas créés dans config.

      Tout semble se passer bien jusqu’à la phase d’installation de SPIP c’est à dire :
      -  Activation avec un code OK
      -  Création du répertoire dans sites/ OK
      -  Création des répertoires config, IMG, local et tmp OK
      -  Création de la base de donnée (vide !) OK

      On arrive alors à l’écran indiquant : La base de donnée mu_mondomaine a été créée. Vous pouvez poursuivre l’installation de SPIP.

      On démarre la phase Installation du Système de publication... puis suivant... puis on reste bloqué sur Installation du système de publication à l’étape 1. Dans les logs de SPIP, on a : Pub : !INFO : spip_connect : fichier de connexion ’’ non trouve .

      A suivre !

    • Pour ma part, je suis passé en 3.1 dès juillet 2015. En mutu. Et j’ai créé plusieurs sites sans problème.

      Voici mon config/mes_options.php :

      require _DIR_RACINE.'mutualisation/mutualiser.php';
       
      $site = str_replace('www.', '', $_SERVER['HTTP_HOST']);
      $site = str_replace('ww2.', '', $site);
      $site = str_replace('ww3.', '', $site);
       
      define ('_INSTALL_SERVER_DB', 'mysql');
      define ('_INSTALL_HOST_DB', 'localhost');
      define ('_INSTALL_HOST_DB_LOCALNAME', 'localhost');
      define ('_INSTALL_USER_DB_ROOT', 'root');
      define ('_INSTALL_PASS_DB_ROOT', 'mot2passeroot');
      define ('_INSTALL_NAME_DB', 'mutu_'.prefixe_mutualisation($site));
      define ('_INSTALL_USER_DB', prefixe_mutualisation($site));
      define ('_INSTALL_TABLE_PREFIX', 'spip');
       
      demarrer_site($site,
      	array(
      		'creer_site' => true, 
      		'cookie_prefix' => false, 
      		'table_prefix' => false,
      		'creer_base' => true,
      		'creer_user_base' => true,
      		'code' => 'ecureuil',
      		'mail' => 'mutualisation@domaine.tld',
      		'annonce' => '<h3>SPIP 3.1</h3>',
      		)
      	);
      // Pour bloquer l'installation automatique des plugins
      define('_DIR_PLUGINS_AUTO', '');
      // Pas de log pour gagner en écritures
      #$GLOBALS['nombre_de_logs'] = 0;
      #$GLOBALS['taille_des_logs'] = 0;
      
      # Dans le cadre d'une mutualisation, l'affichage d'une nouvelle version de SPIP est inutile
      function genie_mise_a_jour($t) {
      	effacer_meta('info_maj_spip');
      	return 1;
      }
    • J’ai finalement entièrement réinstallé SPIP sans rien changé à mon fichier mes_options.php et ça marche !

      Désolé pour le bruit !

    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