Installer sa propre instance StatusNet avec PHP-FPM et Nginx

Jean Baptiste FAVRE

Juillet 2011

English version is available here: Install you own StatusNet with PHP-FPM and Nginx

Dans l'épisode précédent

En fait, rien vu que c'est le premier. La liste sera mise à jour au fur et à mesure des publications:

Je ferai appel, sans rentrer dans les détails, à des éléments de configuration déjà abordés:

Néanmoins, les éléments purement liés à la configuration de StatusNet sont abordables, même si vous utilisez d'autres serveurs web.

Introduction

StatusNet est un logiciel de micro-blogging. Il constitue une alternative ouverte à Twitter par exemple. Il est développé en PHP, utilise MySQL pour le stockage persistent et peut utiliser les technologies NoSQL, telles que memcache pour améliorer les performances. De nombreux plugins sont en outre disponibles pour enrichir les fonctionnalités du produit.

StatusNet repose sur l'utilisation de protocoles ouverts permettant de fédérer l'information au sens large. Il s'agit principalement de oStatus et oAuth.

La principale plate-forme à faire fonctionner ce logiciel est identi.ca avec près de 450000 utilisateurs. Une version cloud pointe le bout de nez. Il s'agit de status.net. Ces 2 plate-formes sont opérées par l'entreprise qui développe le système, statusnet.

L'un des principaux avantages de StatusNet, outre le fait qu'il soit distribué sous licence libre, réside dans la décentralissation qu'il peut apporter. Lorsque Twitter a le hoquet, le fameux "Fail Whale", c'est un pan entier d'Internet qui disparaît. Dans le cas de StatusNet, c'est différent: qu'une instance plante, et seuls les utilisateurs de cette instance sont coupés du réseau mais le service demeure globalement fonctionnel. Évidemment, lorsque c'est identi.ca qui rencontre des problèmes, ce sont 450000 utilisateurs qui sont coupés du Net. D'où l'intérêt d'installer sa propre instance. Vous participerez alors à la résilience au "réseau" StatusNet et, cerise sur le gâteau, vous garderez le contrôle de vos données.

Voyons donc comment apporter notre pierre à l'édifice StatusNet en installant notre propre instance avec Nginx et PHP-FPM. Je suppose ici que vous disposez de votre propre serveur, physique ou virtuel peu importe, mais surtout que vous disposez d'un accès en ligne de commande. En effet, nous allons installer StatusNet en ligne de commande. Grâce à cela, vous découvrirez des aspects méconnus du logiciel.

Mieux, cela simplifiera la configuration de NGinx.

Avant de se lancer dans la technique

StatusNet propose une option importante qui peut impacter le fonctionnement de l'application. Il s'agit du mode "SingleUser". Avant de commencer, il faut donc d'abord répondre à cette question: Envisagez-vous d'accueillir d'autres utilisateurs que vous ? Si non, vous pouvez envisager le mode "SingleUser". Dans le cas contraire, ou dans le doute, abstenez-vous.

En théorie, il est possible de changer la mnière dont StatusNet va gérer les URLs. Dans la pratique, il vaut mieux éviter. En effet, toute mise à jour de votre profil (et le changement d'URL en est une) est propagée par le protocole oStatus. Cependant, il existe visiblement des effets de bord.

Préparation

Il s'agit donc d'installer une instance StatusNet sur son serveur web. En l'occurence, celui-ci utilise Nginx et PHP-FPM.

Dans cet exemple, nous allons paramétrer un pool applicatif. Cela veut dire que StatusNet sera potentiellement disponible pour plusieurs domaines et bien sûr plusieurs utilisateurs.

D'abord, il faut créer l'arborescence sur le disque dur:

Création de l'environnement applicatif
mkdir -p /var/www/apps/statusnet/{config,docroot,logs,private,tmp} 
addgroup --system --gid 10001 statusnet 
adduser --home /var/www/apps/statusnet --shel /bin/false --no-create-home \
     --uid 10001 --gid 10001 --disabled-password --disabled-login statusnet 
chmod 7777 /var/www/apps/statusnet/tmp 
chown statusnet: /var/www/apps/statusnet/private 
chmod -R u=rwX,g=rX,o= /var/www/apps/statusnet/private

Une fois l'environnement créé, il faut préparer la configuration de PHP-FPM.

Configuration de PHP-FPM

cat /var/www/apps/statusnet/config/fpm-pool.conf
[fsync]
    listen                 = 127.0.0.1:10001
    listen.backlog         = -1
    listen.allowed_clients = 127.0.0.1
    listen.owner           = statusnet
    listen.group           = statusnet
    listen.mode            = 0666
 
    user  = statusnet
    group = statusnet
 
    pm                   = dynamic
    pm.max_requests      = 0
    pm.max_children      = 10
    pm.start_servers     = 5
    pm.min_spare_servers = 5
    pm.max_spare_servers = 5
    pm.status_path       = /php_pool_statusnet_status
 
    ping.path     = /statusnet_ping
    ping.response =  statusnet_pong
 
    request_terminate_timeout = 5
    request_slowlog_timeout   = 2
    slowlog                   = /var/www/apps/statusnet/logs/php-slow.log
 
    ;rlimit_files = 1024
    ;rlimit_core = 0
 
    ;chroot = /var/www/apps/statusnet/
    ;chdir = /docroot/
 
    catch_workers_output = yes
 
    env[HOSTNAME] = $HOSTNAME
    env[TMP]      = /tmp
    env[TMPDIR]   = /tmp
    env[TEMP]     = /tmp
 
    ;   php_value/php_flag             - you can set classic ini defines which can
    ;                                    be overwritten from PHP call 'ini_set'. 
    ;   php_admin_value/php_admin_flag - these directives won't be overwritten by
    ;                                     PHP call 'ini_set'
    php_flag[display_errors]       = off
    php_admin_value[error_log]     = /var/www/apps/statusnet/logs/php_err.log
    php_admin_flag[log_errors]     = on
    php_admin_value[memory_limit]  = 32M

StatusNet nécessite quelques extensions PHP pour fonctionner.

Installation des extensions PHP nécessaires à StatusNet
aptitude install php5-curl php5-gd php5-mysql

Voilà pour la configuration de PHP-FPM. Passons à la configuration de NGinx.

Configuration du pool applicatif NGinx

Nous allons paramétrer un pool applicatif pour NGinx, comme décrit dans mes précédentes publications.

cat /home/hosting/www/apps/status/config/nginx.conf
location ~* ^/status(.*)\.(ico|css|js|gif|png|jpg|bmp|JPG)$ {
    root /home/hosting/www/apps/status/docroot;
    rewrite ^/[^/]+/(.*)$ /$1 break;
    access_log off;
    expires max;
}
location /status {
        root /home/hosting/www/apps/status/docroot;
        rewrite ^/[^/]+/(.*)$ /index.php/$1 break;

        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_connect_timeout          15;
        fastcgi_send_timeout             15;
        fastcgi_read_timeout             15;
        fastcgi_buffer_size              128k;
        fastcgi_buffers                4 256k;
        fastcgi_busy_buffers_size        256k;
        fastcgi_temp_file_write_size     256k;

        fastcgi_index  index.php;
        fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
        fastcgi_param  SERVER_SOFTWARE    nginx;
        fastcgi_param  QUERY_STRING       $query_string;
        fastcgi_param  REQUEST_METHOD     $request_method;
        fastcgi_param  CONTENT_TYPE       $content_type;
        fastcgi_param  CONTENT_LENGTH     $content_length;
        fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
        fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
        fastcgi_param  REQUEST_URI        $request_uri;
        fastcgi_param  DOCUMENT_URI       $document_uri;
        fastcgi_param  DOCUMENT_ROOT      $document_root;
        fastcgi_param  SERVER_PROTOCOL    $server_protocol;
        fastcgi_param  SERVER_ADDR        $server_addr;
        fastcgi_param  SERVER_PORT        $server_port;
        fastcgi_param  SERVER_NAME        $server_name;
        fastcgi_param  REMOTE_ADDR        $remote_addr;
        fastcgi_param  REMOTE_PORT        $remote_port;
        fastcgi_param  PATH_INFO          $fastcgi_path_info;

        fastcgi_pass   127.0.0.1:10001;
}

Si la requête concerne un fichier statique dont l'extension est listée, il sera servi depuis la première directive location. Dans le cas contraire, nous considérons qu'il s'agit d'une URL réécrite. Il faut alors passer la requète à PHP via le second bloc location.

L'inconvénient de cette méthode, c'est que vous ne pourrez pas utiliser le script d'installation web puisque toutes les requètes ne concernant pas des fichiers statiques sont réécrites en /index.php/$uri et transférées à PHP. L'avantage, c'est qu'aucun appel direct à un fichier PHP, tel que config.php, n'est possible, ce qui est toujours une bonne chose.

Dans la mesure où StatusNet dispose d'un point d'entrée unique index.php et que nous avons la possibilité d'installer l'instance en ligne de commande, ce n'est pas dramatique de ne pas pouvoir utiliser l'installeur web.

Paramétrage de MySQL

Enfin, préparons MySQL:

Création de la base MySQL et de l'utilisateur statusnet
mysql -uroot -p -Be "create database statusnet;"
mysql -uroot -p -Be "grant all on statusnet.* to 'statusnet'@'localhost' identified by 'statusnet_password';"

Notez bien ces informations, vous en aurez besoin pour créer votre instance.

Installation de StatusNet

Il ne reste plus qu'à récupérer l'archive contenant le code de StatusNet et à mettre en place tout ça.

Installation de StatusNet
cd /tmp/ 
wget //status.net/statusnet-0.9.7fix1.tar.gz 
tar xzf statusnet-0.9.7fix1.tar.gz
mv statusnet-0.9.7fix1/* /var/www/apps/statusnet/docroot/
rm -rf statusnet-0.9.7fix1.tar.gz statusnet-0.9.7fix1 
cd /var/www/apps/statusnet/docroot/
chown -R root:statusnet .
chmod -R ug=rwX,o=rX avatar background file

La dernière commande est importante: StatusNet a besoin de pouvoir écrire dans ces répertoires. Ils servent à stocker les éléments de personnalisation des utilisateurs.

Initialisation de l'instance

Il est maintenant temps de créer votre instance. Pour cela, nous allons exécuter une commande "magique":

Création de l'instance StatusNet
cd /var/www/apps/statusnet/docroot/scripts
php install_cli.php \
	-sstatus.domain.tld \
	--server='status.domain.tld' \
	--sitename="Yet another StatusNet instance"  \
	--fancy='yes'  \
	--dbtype='mysql'  \
	--host='localhost'  \
	--database='statusnet'  \
	--username='statusnet'  \
	--password='statusnet_password'  \
	--admin-nick='your_nickname'  \
	--admin-pass='your_password'  \
	--admin-email='your_email@domain.tld'  \
	--admin-updates='no'
Starting installation...
Checking database...
Changing to database...
Running database script...
Adding SMS carrier data to database...
Adding notice source data to database...
Adding foreign service data to database...
Writing config file...
An initial user with the administrator role has been created.
StatusNet has been installed at //status.domain.tld/
DONE! You can visit your new StatusNet site (login as 'your_nickname'). If this is your first StatusNet install, you may want to poke around our Getting Started guide.

Simple, mais efficace. Naturellement, vous veillerez à remplacer les valeurs en gras par les valeurs adaptées à votre environnement.

Vous pouvez maintenant prendre part au réseau StatusNet. Abonnez-vous à d'autres utilisateurs, sur identi.ca ou non. Bien entendu, vous pouvez également communiquer votre nom d'utilisateur: your_nickname@status.domain.tld ou votre URL StatusNet: //status.domain.tld/your_nickname.

SingleUser mode

Vous vous souvenez de l'introduction ? Si vous pensez toujours être le seul utilisateur de votre instance, vous pouvez activer le mode SingleUser en modifiant le fichier de configuration de StatusNet:

cat /var/www/apps/statusnet/docroot/config.php
<?php
if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }

$config['site']['name'] = 'Yet another StatusNet instance';

$config['site']['server'] = 'status.domain.tld';
$config['site']['path'] = NULL; 

$config['site']['fancy'] = true;

$config['db']['database'] = 'mysqli://statusnet:statusnet_password@localhost/statusnet';

$config['db']['type'] = 'mysql';

$config['singleuser']['enabled'] = true;
$config['singleuser']['nickname'] = 'your_nickname';

Une fois la modification effectuée, il faut mettre à jour toutes les URL de profils. Vous pouvez le faire directement dans la base de données, mais le mieux est encore d'utiliser le script prévu pour:

Mise à jour de tous les profils utilisateurs après un changement de configuration
php /var/www/apps/statusnet/docroot/scripts/updateprofileurl.php -a

Dans ce cas de figure, votre ID StatusNet est toujours your_nickname@status.domain.tld mais l'URL est plus simple: //status.domain.tld/

À bientôt, pour d'autres aventures avec StatusNet. Nous verrons notamment comment optimiser votre instance, comment la sécuriser et comment la connecter à Twitter et bien d'autres choses.

Stay tuned and have fun !

Sources et références

StatusNet

StatusNet
  • //status.net/open-source/
  • //status.net/wiki/
Installation
  • //status.net/wiki/Installation
Getting started
  • //status.net/wiki/Take_a_tour
  • //status.net/wiki/NoticeSymbols

NGinx

Official website
  • //www.nginx.org/
  • ////wiki.nginx.org/

PHP-FPM

Official website
  • //www.php-fpm.org
  • //fr2.php.net/manual/en/install.fpm.php

À propos de Jean Baptiste FAVRE

Je passe le plus clair de mon temps libre sur Internet à travailler sur GNU/Linux avec Debian ou CentOS, la virtualisation avec Xen et KVM et les technologies cluster avec Corosync et OpenAIS. Particulièrement intéressé par Linux, Netfilter, la virtualisation, le monitoring et les clusters, la plupart de mes travaux personnels sont publiés sur ce site et les autres ne sauraient tarder.
A titre professionnel, j'administre des serveurs sous RedHat ou CentOS ainsi qu'une ferme de serveurs VMware ESXi version 4.
De temps, à autre, je parviens à lâcher mon clavier pour lire un bon bouquin tout en écoutant de la musique, mais ça ne dure jamais longtemps.

License

Creative Commons License Cette publication est publiée sous contrat Creative Common by-nc-sa

Valid XHTML 1.0 Strict |  Valid CSS |  contrat Creative Common by-nc-sa

Table des matières

  1. Dans l'épisode précédent
  2. Introduction
  3. Before diving into technical stuff
  4. Preparation
  5. PHP-FPM setup
  6. NGinx configuration as application pool
  7. MySQL setup
  8. StatusNet installation
  9. StatusNet initialisation
  10. SingleUser mode setup
  11. Sources and references
  12. About ...
  13. License