Version 8 — Décembre 2010 — olivier
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.
Ce qui est proposé ici :
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/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
).
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éantise, 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_SMTP
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
Tout serveur FTP disposant d’une extension MySQL pour aller chercher les utilisateurs fait l’affaire. A titre d’exemple, par sa robustesse et sa simplicité, nous utilisons ici pure-ftpd
apt-get install pure-ftpd-mysql
Éditer /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 :
/etc/pure-ftpd/auth/70pam
pour y mettre : no
/etc/pure-ftpd/conf/Umask
pour y mettre : 022 022
(ou le mask adapté à vos besoins)/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.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 peu 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 !