Carnet Wiki

Service d’hébergement mutualisé

Version 3 — Octobre 2007 NicolasR

Consulter au préalable « La mutualisation facile »

La mise en place d’un service d’hébergement nécessite un panneau de gestion des utilisateurs et des services associés. Cette note a pour objet d’exploiter l’excellente « mutualisation facile de sites spip » pour la mise en place d’un service d’hébergement mutualisé de sites spip.

  • Chaque utilisateur (propriétaire d’un site spip) est stocké en BD, l’activation de son espace spip s’effectue sur la base d’un code d’activation qui lui est propre.
  • La gestion des utilisateurs en base de données permet de proposer un accès ftp individuel.
  • Le développement d’un panel ou d’un composant à intégrer à une solution existante (alternc, vhffs, etc..) permet d’ajouter ou modérer un nouveau site

Ce qui est proposé ici :

  • r14833 sur le pseudo plugin de mutualisation facile : chaque site dont l’url est stocké en BD dispose de son propre code d’activation, les sites non activés et non présents en BD renvoie vers une page de type erreur 404
  • un exemple de BD pour stocker les utilisateurs (et les modérateurs) ;
  • un exemple de panel minimal pour modérer les espaces spip mutualisés.

Prérequis

  • Un serveur avec une adresse IP fixe
  • Avoir installé la version de dev de spip quelque part, par exemple dans /var/www/spip
  • Avoir installé le pseudo plugin de mutualisation facile quelque part, par exemple dans /var/www/spip/mutualisation (>= release 14833)
  • Développer un panneau d’administration (alias panel) pour insérer en base de données les informations liées aux propriétaires d’un site et permettre à un serveur ftp de taper dedans pour s’authentifier, et se rendre dans le bon répertoire. En outre, en cas de problème (spams, piratage, etc...) on sait sur qui taper !

Paramétrage DNS / cas d’un domaine dédié à la mutualisation

Pour héberger des sous-domaine en mondomain.tld, il suffit d’insérer dans la zone DNS un enregistrement utilisant le joker pour faire pointer tous les sous-domaines vers l’adresse IP x.x.x.x

* 10800 IN A x.x.x.x

Ainsi tous les sous-domaines en mondomain.tld pointent vers un spip potentiel.

Configuration de spip

Configuration de spip/config/mes_options.php

<?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('_DIR_PLUGINS', _DIR_RACINE . 'spip/' . $site . '/plugins/');


define ('_INSTALL_SERVER_DB', 'mysql');
        define ('_INSTALL_HOST_DB', 'localhost');
        define ('_INSTALL_USER_DB_ROOT', 'root');
        define ('_INSTALL_PASS_DB_ROOT', '*******');
        define ('_INSTALL_NAME_DB', 'mu_'.prefixe_mutualisation($site));
        define ('_INSTALL_TABLE_PREFIX', 'spip');
	
	define ('_INSTALL_PANEL_HOST_DB', 'localhost');
	define ('_INSTALL_PANEL_USER_DB', 'root');
	define ('_INSTALL_PANEL_PASS_DB', '********');
	define ('_INSTALL_PANEL_NAME_DB', 'mutualisation_spip');
	define ('_INSTALL_PANEL_NAME_TABLE', 'utilisateurs');
	define ('_INSTALL_PANEL_FIELD_SITE', 'url');
	define ('_INSTALL_PANEL_FIELD_PASS', 'password');
	define ('_INSTALL_PANEL_FIELD_CODE', 'code');


demarrer_site($site,
                array(
                        'creer_site' => true,
                        'creer_base' => true,
                        'creer_user_base' => true,
                        'repertoire' => 'spip',
                        'mail' => 'moi@chezmoi.com',
			'utiliser_panel' => true
                )
        );


?>

La seconde section de définition des _INSTALL_PANEL_* permet de spécifier la BD, la table et les champs où on récupère les informations des utilisateurs, à savoir le domaine (_INSTALL_PANEL_FIELD_SITE), le mot de passe mysql/ftp (_INSTALL_PANEL_FIELD_PASS) et le code permettant au propriétaire du site d’activer son espace (_INSTALL_PANEL_FIELD_CODE).

Panel de gestion des espaces

Le code d’un panel minimal est donné ici en exemple. Son mode de fonctionnement correspond à un service d’hébergement de type communautaire et non marchand. Des modérateurs invitent des personnes à disposer d’un site spip. Une fois identifié, le modérateur spécifie le prénom, nom et email du propriétaire du site. Il spécifie l’URL (toto.mondomain.tld ou encore autredomaine.tld) et le mot de passe ftp/mysql. Arbitrairement, on laisse à la mutualisation facile de définir les identifiants mysql et ftp mais on choisit le mot de passe (rien de plus pénible qu’un mot de passe consistant en une suite de caractère aléatoire). Lors du choix de l’url, une vérification de la disponibilité de l’url est effectuée. On effectue aussi un ping pour voir si le sous-domaine ou le domaine pointe bien vers le serveur d’hébergement.

Le futur propriétaire du site reçoit un courrier automatique l’annonçant que untel l’a invité à disposer du site machin.mondomain.tld et précise code d’activation, identifiants mysql et ftp.

Cet exemple de panel est proposé sans prétention : c’est juste pour donner des idées. Par fainéantisme, il s’appuie sur les librairies pear Auth, QuickForm, Mail et Ping.

Installation des librairies pear

apt-get install pear
pear install Auth
pear install HTML_Common HTML_QuickForm
pear install HTML_QuickForm_Renderer_Tableless
pear install HTML_QuickForm_DHTMLRulesTableless
pear install Mail
pear install Net_Ping

Structure de la base

-- Structure de la table <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bW9kZXJhdGV1cnM8L2NvZGU+"></span>


CREATE TABLE <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bW9kZXJhdGV1cnM8L2NvZGU+"></span> (
  <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+dWlkPC9jb2RlPg=="></span> bigint(21) NOT NULL auto_increment,
  <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bG9naW48L2NvZGU+"></span> varchar(20) NOT NULL,
  <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+cGFzc3dvcmQ8L2NvZGU+"></span> varchar(35) NOT NULL,
  <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+cHJlbm9tPC9jb2RlPg=="></span> varchar(50) NOT NULL,
  <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bm9tPC9jb2RlPg=="></span> varchar(50) NOT NULL,
  <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZW1haWw8L2NvZGU+"></span> varchar(50) NOT NULL,
  PRIMARY KEY  (<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+dWlkPC9jb2RlPg=="></span>)
) ENGINE=MyISAM;


-- Structure de la table <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+dXRpbGlzYXRldXJzPC9jb2RlPg=="></span>


CREATE TABLE <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+dXRpbGlzYXRldXJzPC9jb2RlPg=="></span> (
  <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bG9naW48L2NvZGU+"></span> varchar(20) NOT NULL,
  <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+cGFzc3dvcmQ8L2NvZGU+"></span> varchar(35) NOT NULL,
  <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+dXJsPC9jb2RlPg=="></span> varchar(50) NOT NULL,
  <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZGlyZWN0b3J5PC9jb2RlPg=="></span> varchar(250) NOT NULL,
  <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+cHJlbm9tPC9jb2RlPg=="></span> varchar(50) NOT NULL,
  <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bm9tPC9jb2RlPg=="></span> varchar(50) NOT NULL,
  <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+ZW1haWw8L2NvZGU+"></span> varchar(50) NOT NULL,
  <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bW9kZXJhdGV1cjwvY29kZT4="></span> bigint(21) NOT NULL,
  <span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+Y29kZTwvY29kZT4="></span> varchar(20) NOT NULL,
  PRIMARY KEY  (<span class="base64" title="PGNvZGUgY2xhc3M9InNwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lIiBkaXI9Imx0ciI+bG9naW48L2NvZGU+"></span>)
) ENGINE=MyISAM;

Les modérateurs sont à ajouter à la main via phpMyAdmin en utilisant la fonction md5 pour les mots de passe.

Codes de l’exemple de panel

Le fichier etc/config.inc.php est à adapté de manière similaire à ce que vous avez fait pour spip/config/mes_options.php

panel.zip

Configuration du serveur ftp

Tout serveur ftp disposant d’une extension mysql pour aller chercher les utilisateurs fait affaire. A titre d’exemple, de par sa robustesse et sa simplicité, nous utilisons ici pure-ftpd

apt-get install pure-ftpd-mysql

Editer /etc/pure-ftpd/db/mysql.conf pour l’adapter à vos besoins :

MYSQLUser       root
MYSQLPassword  ******
MYSQLDatabase   mutualisation_spip
MYSQLCrypt      md5
MYSQLGetPW      SELECT password FROM utilisateurs WHERE login="\L"
MYSQLDefaultUID 33
MYSQLDefaultGID 33
MYSQLGetDir     SELECT directory FROM utilisateurs  WHERE login="\L"

En outre :

  • Editer /etc/pure-ftpd/auth/70pam pour y mettre : no
  • Editer /etc/pure-ftpd/conf/Umask pour y mettre : 022 022 (ou le mask adapté à vos besoins)
  • Editer /etc/pure-ftpd/conf/ChrootEveryone pour y mettre : Yes (Très important ! Pour éviter qu’un utilisateur puisse remonter dans l’arborescence et accéder aux espaces personnels des autres utilisateurs.

Tester en local avant de le faire sur un serveur

Un moyen simple pour tester en local sans se prendre la tête à mettre en place un serveur DNS et à configurer vos propres zones locales et d’ajouter des hostnames dans /etc/hosts comme par exemple :

127...1 toto.chezmoi.com
127...1 titi.chezmoi.com
127...1 tutu.chezmoi.com

Pour peux qu’apache pointe vers le bon répertoire (par exemple DocumentRoot /var/www//spip/ vous pourrez tester l’activation des sites toto.chezmoi.com, titi.chezmoi.com, etc...

Retours, critiques, etc... sont les bienvenues !