{"id":365,"date":"2013-06-29T23:27:31","date_gmt":"2013-06-29T21:27:31","guid":{"rendered":"https:\/\/crudelis.fr\/sblog\/?p=365"},"modified":"2013-06-29T23:27:31","modified_gmt":"2013-06-29T21:27:31","slug":"utiliser-son-propre-serveur-de-synchronisation-firefox-sync","status":"publish","type":"post","link":"https:\/\/crudelis.fr\/site\/sblog\/2013\/06\/utiliser-son-propre-serveur-de-synchronisation-firefox-sync\/","title":{"rendered":"Utiliser son propre serveur de synchronisation firefox Sync"},"content":{"rendered":"<p>Bien que Mozilla soit sans doute respectueux de la vie priv\u00e9e, l'id\u00e9e d'un serveur centralis\u00e9 stockant mes donn\u00e9es personnelles me d\u00e9range toujours. Puisque Mozilla permet d'utiliser un serveur Sync chez soi, profitant en pour garder nos marques pages \u00e0 la maison. Tout en s\u00e9curisant les \u00e9changes via SSL.<\/p>\n<p>Apr\u00e8s 3 essais infructueux pour installer ce serveur \"simple\" d'installation, j'en ressors victorieux \u00e0 la 4e tentative. Cette m\u00e9thode d'installation, si elle n'est pas \"simple\", permet d'avoir un serveur Sync fonctionnel et s\u00e9curis\u00e9.<br \/>\n<!--more--><\/p>\n<p>Tout d'abord, histoire de savoir de quoi on parle, rendons-nous chez <a href=\"https:\/\/support.mozilla.org\/fr\/kb\/firefox-sync-emporter-infos-perso\" target=\"_blank\">Mozilla<\/a> pour quelques explications sur le service.<br \/>\nEt, comme je n'ai rien invent\u00e9, voila la source principale de tout ce que je vais expliquer ici: le how-to de <a href=\"http:\/\/docs.services.mozilla.com\/howtos\/run-sync.html\" target=\"_blank\">Mozilla<\/a>.<\/p>\n<p>A pr\u00e9sent nous pouvons commencer.<br \/>\nComme \u00e0 l'habitude, nous allons supposer que nous disposons d\u00e9j\u00e0 d'un serveur apache fonctionnel exploitant SSL. (Sinon: <a href=\"http:\/\/www.lafermeduweb.net\/billet\/tutorial-creer-un-serveur-web-complet-sous-debian-1-apache-160.html#InstApache2\" target=\"_blank\">Tutoriel apache.<\/a>)<\/p>\n<blockquote><p>Je n'ai pas test\u00e9 l'usage d'un certificat auto-sign\u00e9, mais je pense que c'est possiblement probl\u00e9matique. Un retour serait utile.<\/p><\/blockquote>\n<h2>Installation et compilation<\/h2>\n<p>Nous allons commencer par installer les paquets n\u00e9cessaires:<\/p>\n<pre>sudo apt-get install python-virtualenv python-dev mercurial build-essential<\/pre>\n<p>Nous utiliseront ici mysql pour supporter la base de donn\u00e9e, qui sera plus facile \u00e0 manipuler lorsqu'il s'agira de g\u00e9rer les utilisateurs.<\/p>\n<pre>sudo apt-get install libmysqlclient-dev mysql-server<\/pre>\n<p>En cas d'usage de sqlite (le choix par d\u00e9faut), il faudra remplacer les paquets pr\u00e9c\u00e9dents par celui-ci. Toutefois, nous n'explorerons pas cette possibilit\u00e9.<\/p>\n<pre>sudo apt-get install sqlite3<\/pre>\n<p>Les d\u00e9pendances satisfaites, nous allons pouvoir commencer l'installation.<br \/>\nIl nous faut d'abord choisir le dossier dans lequel nous installerons le serveur Sync. Il est pr\u00e9f\u00e9rable \u00e0 ce moment d'\u00e9viter d'utiliser un dossier situ\u00e9 apr\u00e8s le .htaccess de votre site principal. Mieux vaut placer le serveur Sync \u00e0 l'\u00e9cart, afin d'\u00e9viter toute interf\u00e9rence.<\/p>\n<blockquote><p>Attention, apr\u00e8s t\u00e9l\u00e9chargement, le dossier ne doit pas \u00eatre d\u00e9plac\u00e9 sous peine de fausser les chemins enregistr\u00e9s par mercurial.<\/p><\/blockquote>\n<p>On se place donc dans le dossier choisi, afin de t\u00e9l\u00e9charger les sources du serveur Sync \u00e0 l'aide de mercurial.<\/p>\n<pre>hg clone https:\/\/hg.mozilla.org\/services\/server-full\/ DOSSIER_SERVEUR_SYNC<\/pre>\n<blockquote><p>hg clone cr\u00e9era lui-m\u00eame le dossier DOSSIER_SERVEUR_SYNC.<\/p><\/blockquote>\n<p>Puis on se place dans le dossier, pour compiler le serveur.<\/p>\n<pre>cd DOSSIER_SERVEUR_SYNC\nmake build<\/pre>\n<p>Enfin, afin de permettre \u00e0 python d'exploiter mysql, nous allons installer Mysql-Python.<\/p>\n<pre>bin\/easy_install Mysql-Python<\/pre>\n<p>Sync utilisant un environnement python d\u00e9di\u00e9, Mysql-Python sera install\u00e9 \u00e0 l'int\u00e9rieur du dossier de Sync, dans DOSSIER_SERVEUR_SYNC\/lib\/python2.7\/site-packages\/<br \/>\nMySQL_python-1.2.4-py2.7-linux-i686.egg<\/p>\n<h2>Cr\u00e9ation de la base de donn\u00e9e de Sync<\/h2>\n<p>Nous faisons le choix ici d'une base de donn\u00e9e mysql. Mais il est possible \u00e9galement d'utiliser sqlite ou postgres.<br \/>\nIl est nettement pr\u00e9f\u00e9rable de cr\u00e9er un utilisateur avec un mot de passe g\u00e9n\u00e9r\u00e9 al\u00e9atoirement qui aura acc\u00e8s uniquement \u00e0 la base de donn\u00e9e de Sync. Ceci afin d'\u00e9viter de corrompre d'autres bases de donn\u00e9es si le mot de passe, inscrit en clair dans le fichier de config, venait \u00e0 \u00eatre connu.<br \/>\nIl y a 2 mani\u00e8re de cr\u00e9er la base de donn\u00e9es et son utilisateur d\u00e9di\u00e9.<\/p>\n<p>En utilisant phpmyadmin:<br \/>\nNous nous rendrons dans l'onglet <em>Privil\u00e8ges<\/em> pour <em>Ajouter un utilisateur<\/em>. Apr\u00e8s avoir nomm\u00e9 l'utilisateur et lui avoir donn\u00e9 un mot de passe, nous choisiront de <em>Cr\u00e9er une base portant son nom et donner \u00e0 cet utilisateur tous les privil\u00e8ges sur cette base<\/em>. Nous aurons ainsi une base de donn\u00e9e au nom de son utilisateur.<\/p>\n<p>En ligne de commande:<\/p>\n<pre>mysql -u root -p\n\nmysql&gt; CREATE DATABASE <em>BDD_NAME<\/em>;\nmysql&gt; GRANT ALL PRIVILEGES ON <em>BDD_NAME<\/em>.* TO <em>USER<\/em>@localhost  IDENTIFIED BY '<em>MOTDEPASSE<\/em>';\nmysql&gt; quit<\/pre>\n<h2>Configuration du serveur Sync<\/h2>\n<p>Le fichier de configuration de Sync est DOSSIER_SERVEUR_SYNC\/etc\/sync.conf<br \/>\nNous allons modifier les lignes suivantes:<\/p>\n<pre>sqluri = mysql:\/\/USER:MOTDEPASSE@localhost\/BDD_NAME<\/pre>\n<p>Cette ligne se pr\u00e9sente \u00e0 3 reprises, qui doivent toute \u00eatre modifi\u00e9es et point\u00e9es sur la m\u00eame base de donn\u00e9es.<br \/>\nCelle-ci stockera les utilisateurs ainsi que les donn\u00e9es synchronis\u00e9es.<\/p>\n<pre>quota_size = 25120<\/pre>\n<p>Le quota par d\u00e9faut est de seulement 5mo, ce qui pourrait \u00eatre contraignant. Augmenter cette limite permettra de ne pas avoir de probl\u00e8mes avec \u00e7a.<\/p>\n<pre>fallback_node = https:\/\/www.monsite.fr\/sync\/<\/pre>\n<p>C'est sans doute la principale source d'erreur de Sync, celle qui renvoi le plus souvent \u00e0 l'erreur \"URL invalide\".<br \/>\nCette option indique au client \u00e0 quelle adresse il doit se connecter. Il est important que cette adresse soit identique \u00e0 celle utilis\u00e9e pour contacter le serveur apache qui se placera devant Sync.<\/p>\n<pre>#allow_new_users = false<\/pre>\n<p>Cette ligne devra \u00eatre d\u00e9comment\u00e9e d\u00e9s lors que les utilisateurs d\u00e9sir\u00e9s seront enregistr\u00e9s. Sans quoi nous nous exposerons au risque de voir le serveur Sync squatt\u00e9 par n'importe qui.<\/p>\n<pre>use_ssl = false<\/pre>\n<p>Bien \u00e9videmment, on voit SSL, \u00e7a attire l\u2019\u0153il. Toutefois, ceci ne concerne que la connexion \u00e0 reCaptcha. Dans notre cas, \u00e7a n'a pas d'importance.<\/p>\n<p>Sync est \u00e0 pr\u00e9sent configur\u00e9.<br \/>\nNous allons donc nous int\u00e9resser \u00e0 la communication avec l'ext\u00e9rieur. Sync utilise un mini-serveur standalone \u00e9coutant sur le port 5000. Mais utiliser ce serveur tel quel nous obligerait \u00e0 ouvrir le port 5000, ce qui nous couperait la possibilit\u00e9 de passer par SSL. Nous allons donc ins\u00e9rer apache entre Sync et l'ext\u00e9rieur.<\/p>\n<h2>Configuration d'apache en reverse-proxy<\/h2>\n<p>Bien qu'on pourrait se battre des heures sans succ\u00e8s avec wsgi pour substituer apache au serveur standalone de Sync, on va lui pr\u00e9f\u00e9rer un reverse-proxy efficace et rapide \u00e0 mettre en place. <\/p>\n<p>Nous allons donc pr\u00e9parer apache en lui ajoutant les 2 modules n\u00e9cessaires, mod_proxy et mod_proxy_http.<\/p>\n<pre>sudo a2enmod proxy\nsudo a2enmod proxy_http<\/pre>\n<p>Puis modifier le virtualhost du domaine en ajoutant, dans la section servant sous le port 443, les lignes suivantes:<\/p>\n<pre>#Reverse proxy pour le mini-server standalone de Firefox sync\n        ProxyRequests Off\n        &lt;Proxy *monsite.fr\/sync\/*&gt;\n                Order deny,allow\n                Allow from all\n        &lt;\/Proxy&gt;\n        ProxyPass \/sync\/ http:\/\/localhost:5000\/\n        ProxyPassReverse \/sync\/ http:\/\/localhost:5000\/<\/pre>\n<blockquote><p>Attention, si le proxy n'est pas servi sous SSL en 443 mais sur le port 80, il faut modifier en cons\u00e9quence la ligne fallback_node du fichier DOSSIER_SERVEUR_SYNC\/etc\/sync.conf en retirant le s de https.<\/p><\/blockquote>\n<blockquote><p>Voyons en d\u00e9tails les r\u00e9glages du proxy:<\/p>\n<pre>ProxyRequests Off<\/pre>\n<p>Interdit l'usage du serveur en tant que proxy ouvert. Cela restera donc un proxy limit\u00e9 \u00e0 l'usage fait ci-apr\u00e8s.<\/p>\n<pre>&lt;Proxy&gt;<\/pre>\n<p>Limite la port\u00e9e des commandes plac\u00e9es entres les balises au proxy.<\/p>\n<pre>ProxyPass<\/pre>\n<p>C'est LA fonction de reverse proxy, qui va rediriger la requ\u00eate re\u00e7u par apache sur monsite.fr\/sync\/ vers le serveur sync, \u00e0 localhost:5000.<\/p>\n<pre>ProxyPassReverse<\/pre>\n<p>Assure les redirections du serveur Sync plac\u00e9 derri\u00e8re le proxy, en corrigeant les adresses renvoy\u00e9s par ce dernier.<\/p><\/blockquote>\n<p>Ainsi configur\u00e9, apache renverra les connexions sur https:\/\/www.monsite.fr\/sync\/ vers http:\/\/localhost:5000\/. Ainsi, les connexions entrantes seront contraintes au SSL sur 443 avant de contacter, en local, le serveur sync qui, lui, n'est pas s\u00e9curis\u00e9.<\/p>\n<p>&nbsp;<\/p>\n<p>On peut d\u00e9s \u00e0 pr\u00e9sent tester le fonctionnement du serveur Sync.<br \/>\nNous allons commencer par red\u00e9marrer apache pour prendre en compte les modifications du virtualhost.<\/p>\n<pre>sudo \/etc\/init.d\/apache2 restart<\/pre>\n<p>Et enfin d\u00e9marrer le serveur Sync afin qu'il r\u00e9ponde aux requ\u00eates renvoy\u00e9es par apache.<\/p>\n<pre>bin\/paster serve development.ini<\/pre>\n<p>A pr\u00e9sent, il suffit de cr\u00e9er un compte \u00e0 l'aide de Sync sur firefox, en choisissant \u201dUtiliser un serveur personnalis\u00e9\u201d au lieu de \u201dserveur Mozilla Firefox Sync\u201d. On indiquera alors https:\/\/www.monsite.fr\/sync\/<\/p>\n<p>Si tout va bien, aucun message d'erreur n'est mentionn\u00e9. Ce que l'ont peut \u00e9galement v\u00e9rifier en se rendant sur <a href=\"sync-log\" target=\"_blank\">about:sync-log<\/a>.<\/p>\n<p>Toutefois, le serveur Sync doit encore \u00eatre d\u00e9marr\u00e9 manuellement, ce qui est bien \u00e9videmment probl\u00e9matique pour un usage courant. Nous allons donc faire d\u00e9marrer Sync comme un service afin qu'il soit automatiquement d\u00e9marr\u00e9 avec la machine.<\/p>\n<h2>D\u00e9marrage automatique de Sync<\/h2>\n<p>L'ajout d'un programme au d\u00e9marrage de la machine en tant que service passe par le programme upstart.<br \/>\nNous allons donc commencer par \u00e9crire un script upstart pour Sync.<br \/>\nCela se passe dans \/etc\/init.d\/.<\/p>\n<blockquote><p>Pour simplifier, le script upstart peut-\u00eatre t\u00e9l\u00e9charg\u00e9 directement et copi\u00e9 \u00e0 sa place. <a href=\"https:\/\/crudelis.fr\/fichiers\/div\/fsync\" target=\"_blank\">Script upstart fsync.<\/a><\/p><\/blockquote>\n<p>Nous allons copier le fichier skeleton avant de le modifier.<\/p>\n<pre>sudo cp \/etc\/init.d\/skeleton \/etc\/init.d\/fsync<\/pre>\n<p>Les lignes \u00e0 \u00e9diter sont les suivantes:<\/p>\n<pre># Short-Description: Serveur Sync de Firefox\n# Description:       Serveur de synchronisation de marques-pages, etc, fourni par Mozilla,\n#\t\t     ayant pour but de remplacer le serveur centralis\u00e9 de Mozilla.\n[...]\n# Author: Maniack Crudelis \n[...]\nDESC=\"Serveur Sync de Firefox\"\nNAME=fsync\n[...]\nDAEMON_ARGS=\"\"\n[...]\nstart-stop-daemon --start --quiet --background --pidfile $PIDFILE --exec $DAEMON --test &gt; \/dev\/null \nr\n[...]\nstart-stop-daemon --start --quiet --background --pidfile $PIDFILE --exec $DAEMON -- <\/pre>\n<p>Le script termin\u00e9, nous allons le rendre ex\u00e9cutable.<\/p>\n<pre>sudo chmod +x \/etc\/init.d\/fsync<\/pre>\n<p>Cela fait, nous allons cr\u00e9er le raccourci fsync auquel nous faisons mention dans le script upstart.<br \/>\nRetour donc au dossier DOSSIER_SERVEUR_SYNC pour y cr\u00e9er un script bash qui se chargera de l'ex\u00e9cution du serveur Sync. Script nomm\u00e9 fsync.sh, contenant ces commandes:<\/p>\n<pre>#!\/bin\/sh\nCHEMIN=\"\/CHEMIN\/DU\/SERVEUR\/SYNC\/DOSSIER_SERVEUR_SYNC\/\"          \n$CHEMIN\/bin\/paster serve $CHEMIN\/development.ini<\/pre>\n<p>Script que nous allons rendre ex\u00e9cutable.<\/p>\n<pre>chmod +x fsync.sh<\/pre>\n<p>Cela \u00e9tant, notre script upstart ne va pas chercher le script sh \u00e0 sa place. Pour un r\u00e9sultat propre, nous allons cr\u00e9er un lien symbolique dans \/usr\/sbin pointant sur le script sh.<\/p>\n<pre>sudo ln -s \/CHEMIN\/DU\/SERVEUR\/SYNC\/DOSSIER_SERVEUR_SYNC\/fsync.sh \/usr\/sbin\/fsync<\/pre>\n<p>Il suffit maintenant d'un<br \/>\nsudo \/etc\/init.d\/fsync start pour lancer le serveur Sync. Pour qu'il soit d\u00e9marr\u00e9 en tant que service, nous allons cr\u00e9er les raccourcis dans rcX.d<\/p>\n<pre>sudo update-rc.d fsync defaults 99<\/pre>\n<p>&nbsp;<\/p>\n<p>Il ne reste plus qu'\u00e0 red\u00e9marrer la machine pour profiter du serveur de synchronisation Sync.<br \/>\nSans oublier de d\u00e9commenter allow_new_users = false afin d'interdire toute inscription \u00e0 votre serveur Sync.<\/p>\n<blockquote><p>Lors d'un ajout ult\u00e9rieur d'un nouvel utilisateur, le serveur sync (parfaitement bien cod\u00e9...) r\u00e9pondra par un limpide \"Erreur inconnue\" si l'inscription de nouveaux utilisateurs n'est pas autoris\u00e9. De quoi s'arracher les cheveux pendant un moment, puisqu'aucun message ne l'indiquera dans les log. Il sera donc important de commenter allow_new_users = false ET de red\u00e9marrer le serveur sync.<\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Bien que Mozilla soit sans doute respectueux de la vie priv\u00e9e, l'id\u00e9e d'un serveur centralis\u00e9 stockant mes donn\u00e9es personnelles me d\u00e9range toujours. Puisque Mozilla permet d'utiliser un serveur Sync chez soi, profitant en pour garder nos marques pages \u00e0 la maison. Tout en s\u00e9curisant les \u00e9changes via SSL. Apr\u00e8s 3 essais infructueux pour installer ce [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_links_to":"","_links_to_target":""},"categories":[3,7],"tags":[19,37,40],"class_list":["post-365","post","type-post","status-publish","format-standard","hentry","category-home-server","category-synchronisation-2","tag-firefox","tag-serveur","tag-synchronisation"],"_links":{"self":[{"href":"https:\/\/crudelis.fr\/site\/sblog\/wp-json\/wp\/v2\/posts\/365","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/crudelis.fr\/site\/sblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/crudelis.fr\/site\/sblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/crudelis.fr\/site\/sblog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/crudelis.fr\/site\/sblog\/wp-json\/wp\/v2\/comments?post=365"}],"version-history":[{"count":1,"href":"https:\/\/crudelis.fr\/site\/sblog\/wp-json\/wp\/v2\/posts\/365\/revisions"}],"predecessor-version":[{"id":858,"href":"https:\/\/crudelis.fr\/site\/sblog\/wp-json\/wp\/v2\/posts\/365\/revisions\/858"}],"wp:attachment":[{"href":"https:\/\/crudelis.fr\/site\/sblog\/wp-json\/wp\/v2\/media?parent=365"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/crudelis.fr\/site\/sblog\/wp-json\/wp\/v2\/categories?post=365"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/crudelis.fr\/site\/sblog\/wp-json\/wp\/v2\/tags?post=365"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}