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 renvoient 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-domaines 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 lui 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 à adapter de manière similaire à ce que vous avez fait pour spip/config/mes_options.php
Configuration du serveur FTP
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 :
- 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 est d’ajouter des hostnames dans /etc/hosts
comme par exemple :
127.0.0.1 toto.chezmoi.com
127.0.0.1 titi.chezmoi.com
127.0.0.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 !