Installer son propre serveur Firefox sync avec PHP-FPM et Nginx

Jean Baptiste FAVRE

Février 2011

English version is available here: Install you own Firefox Sync server with PHP-FPM and Nginx

Introduction

La fondation Mozilla propose depuis quelques temps une fonctionnalité de synchronisation pour Firefox. Celà permet de retrouver son environnement de navigation sur différentes instances de Firefox. S'il est possible de stocker ses sauvegardes chez Mozilla, il est également possible de le faire chez soi, en installant sa propre instance du serveur sync.

Les plus paranoïaques d'entre nous y verrons le moyen de protéger leur vie privée des vélléités inquisitrices de la fondation Mozilla. Perso, je n'y crois pas: d'une part, toutes les informations sont chiffrées, d'autre part, ce n'est vraiment pas dans l'esprit du logiciel libre que défend becs et ongles la fondation.

En revanche, déployer et maintenir une infrastructure pour accueillir les sauvegardes des millions d'utilisateurs de Firefox sync coûte de l'argent, beaucoup d'argent. En installant votre propre serveur Firefox sync, vous conservez le contrôle de vos données bien sûr, mais vous ferez potentiellement faire quelques économies à la fondation Mozilla.

Pour ma part, de la même façon, que j'opère mon propre serveur Web, mail, jabber, etc..., je trouve intéressant d'avoir mon propre serveur Sync. Une histoire d'indépendance en quelque sorte :)

Préparation

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

La configuration de référence est décrite là:

Dans cet exemple, nous allons paramétrer un pool applicatif. Cela veut dire que Firefox Sync 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/fsync/{config,docroot,logs,private,tmp}
addgroup --system --gid 10001 fsync
adduser --home /var/www/apps/fsync --shel /bin/false --no-create-home \
     --uid 10001 --gid 10001 --disabled-password --disabled-login fsync
chmod 7777 /var/www/apps/fsync/tmp
chown appname: /var/www/apps/fsync/private
chmod -R u=rwX,g=rX,o= /var/www/apps/fsync/private

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

cat /var/www/apps/fsync/config/fpm-pool.conf
[fsync]
    listen                 = 127.0.0.1:10001
    listen.backlog         = -1
    listen.allowed_clients = 127.0.0.1
    listen.owner           = fsync
    listen.group           = fsync
    listen.mode            = 0666

    user  = fsync
    group = fsync

    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_fsync_status

    ping.path     = /fsync_ping
    ping.response =  fsync_pong
 
    request_terminate_timeout = 5
    request_slowlog_timeout   = 2
    slowlog                   = /var/www/apps/fsync/logs/php-slow.log
 
    ;rlimit_files = 1024
    ;rlimit_core = 0
 
    chroot = /var/www/apps/fsync/
    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]       = on
    php_admin_value[error_log]     = /logs/php_err.log
    php_admin_flag[log_errors]     = on
    php_admin_value[memory_limit]  = 2M

Oui, vous avez bien lu, Firefox Sync minimal server peut être cloisonné dans un chroot. Bonheur :)

La version minimaliste du serveur nécessite le support de SQlite dans PHP:

Installation de php5-sqliteaptitude install php5-sqlite

Voilà pour PHP. Il est temps de s'atteler à Nginx. Le fichier README propose, pour apache, de créer un Alias. En fait, il s'agit de faire en sorte que toutes les requêtes soient réécrites pour pointer sur index.php avec PATH_INFO. Voilà ce que ça donne sous NGinx:

cat /etc/nginx/apps-available/fsync
location /fsync {

    root /var/www/apps/fsync/docroot;

    #error_log /var/www/apps/fsync/logs/error.log debug;

    rewrite ^/[^/]+/(.*)$ /docroot/index.php$request_uri break;

    fastcgi_split_path_info ^(.+\.php)([^?]*).*$;
    # A handy function that became available in 0.7.31 that breaks down
    # The path information based on the provided regex expression
    # This is handy for requests such as file.php/some/paths/here/

    fastcgi_pass   127.0.0.1:10001;
    # Forward request to "fsync" pool

    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_intercept_errors         on;

    include /etc/nginx/conf.d/fastcgi.conf;
}

Attention à la directive fastcgi_split_path_info. Dans la documentation nginx, la regex est ^(.+\.php)(.*)$. Malheureusement pour nous, le client Sync effectue un requête du type /1.0/user/username/info/collections?v=1.6.2. Avec la regex par défaut, les paramètres de requête (QUERY_STRING) ?v=1.6.2 sont alors inclus dans la variable PATH_INFO provoquant un échec de la première synchro. Ceci n'empêche a priori pas de synchroniser les informations entre le navigateur et le serveur, mais vous empêchera, par exemple, de consulter la liste des onglets ouverts sur un autre Firefox. Génant :-/

La regex ^(.+\.php)([^?]*).*$; corrige donc ce comportement en incluant dans la variable PATH_INFO tout ce qui vient après .php et ce jusqu'à un éventuel "?".

Il ne reste plus qu'à l'inclure dans les fichiers de configuration de domaines que vous souhaitez. Par exemple:

cat /etc/nginx/sites-enabled/domain.tld
server {
        listen 80;
        server_name domain.tld *.domain.tld;
        root /var/www/domains/domain.tld;

        ########## Log definition ##########
        access_log /var/www/domains/domain.tld/logs/access.log vhosts;
        error_log /var/www/domains/domain.tld/logs/error.log info;
        ########## SSL settings ##########
        listen 443;
        ssl on;
        ssl_certificate /var/www/domains/domain.tld/config/domain.tld.pem;
        ssl_certificate_key /var/www/domains/domain.tld/config/domain.tld.pem;
        ssl_session_timeout 5m;
        ssl_protocols SSLv3 TLSv1;
        ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
        ssl_prefer_server_ciphers on;

[...]

        ##### Enabled PHP apps support for specific subdomain #####
        include /etc/nginx/apps-available/fsync;

[...]

}

Installation de Firefox Sync minimal server

Il est maintenant temps de télécharger le code et de l'installer dans docroot.

Installation du serveur
cd /tmp/
wget //people.mozilla.org/~telliott/weave_minimal.tgz
tar xzf weave_minimal.tgz
mv weave_minimal/* /var/www/apps/fsync/docroot/
rm -rf weave_minimal.tgz weave_minimal
cd /var/www/apps/fsync/docroot/
chown fsync: .

La dernière commande est importante: en effet, la base de données sqlite sera stockée dans ce répertoire. Il faut donc que le script PHP puisse écrire dans le répertoire. Libre à vous de restreindre les droits par la suite.

Initialisation de la base

La base de donnée sera créée lors de la première requète. Comme l'indique le fichier README, utilisez votre navigateur préféré (qui a dit Chrome O_o ?) et connectez-vous à l'adresse //fsync.domain.tld/1.0/blah/info/collection avec l'identifiant blah et le mot de password garbage. En fait, il semble que n'importe quel login/mot de passe fasse l'affaire. La première authentification va échouer, mais ce n'est pas bien grave: l'important est de constater la présence du fichier weave_db côté serveur.

La dernière étape côté serveur consiste à créer les utilisateurs:

Création d'un compte Sync
cd /var/www/apps/fsync/docroot/
php create_user
(c)reate, (d)elete or change (p)assword: c
Please enter username: username
Please enter password: password

Simple, mais efficace.

Il est maintenant temps de configurer votre Firefox et de profiter de votre propre serveur Sync. N'oubliez de choisir l'option Custom Sync Server en indiquant l'URL de votre propre instance. La modification d'un Sync existant semble ne pas fonctionner. Je vous conseille donc de désactiver Sync pour le reconfigurer de zéro.

Have fun !

Sources et références

Firefox sync

Firefox Sync
  • //mozillalabs.com/sync/
  • https://wiki.mozilla.org/Labs/Weave/Sync/1.0/API
Minimal server
  • //tobyelliott.wordpress.com/2009/09/11/weave-minimal-server/
  • //rabenau.org/blog/posts/creating-your-own-firefox-sync-server
  • //gege2061.homecomputing.fr/content/installation-dun-serveur-firefox-sync/

NGinx

fastcgi_split_path_info
  • //nginx-maillist.blogspot.com/2011/01/re-fastcgisplitpathinfo-capture-group_20.html
  • //forum.nginx.org/read.php?2,168078,168097#msg-168097

À 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. Introduction
  2. Préparation
  3. Installation de Firefox Sync minimal server
  4. Initialisation de la base
  5. Sources et références
  6. À propos ...
  7. License