Installer son propre serveur Mozilla Sync pour Firefox – Saison 03 Episode FINAL

Firefox_Sync_logo

Mise à jour : depuis Firefox 29, l'outil de synchronisation a changé afin de correspondre entre autres, aux besoins de Firefox OS. Du coup avec la méthode décrite ci-dessous, il n'est plus possible synchroniser avec un nouveau navigateur de version 29 et plus. Seule la synchronistaion des navigateurs déjà "attachés" au serveur continuera à fonctionner correctement mais jusqu'à quand, impossible de le savoir. Autant dire que cette méthode est obsolète et revolue. La bonne nouvelle c'est que Mozilla propose son nouveau serveur de synchonisation pour l'auto-hébergement, la mauvaise c'est que je ne suis pas parvenu à relier le navigateur et mon serveur. Pour l'heure, je vais donc confier mes données à Mozilla (si on ne peut pas leur faire confiance, à qui peut-on le faire sur le Web ? ), si d'aventure je parviens à une solution viable cela fera l'objet d'un nouvel article.

 

D’aucuns diront que je fais une fixation sur ce fameux serveur. D’aucuns auront raison car je ne suis pas satisfait de son installation et que ça me reprend les jours fériés. Le point délicat, c’est le serveur Apache dont le virtualhost me cause du soucis, le but était de ne pas utiliser plusieurs serveurs web et tant qu’à faire, de ne pas ouvrir de port supplémentaire dans le firewall (TCP 5000). Mais après un test concluant de la solution native, je me suis résolu à l’appliquer telle quelle (avec MySQL et en ajoutant quelques améliorations quand même), tant pis pour le trou supplémentaire dans mon Iptables et tant mieux pour mes jours fériés.

Pré-requis :

  • Un serveur GNU/Linux (ici Debian Squeeze i386)
  • Base de données MySQL
  • Un navigateur Mozilla Firefox (ici Nightly 11)/IceWeasel PC/Mobile (ici 8 )

Conventions :

  • prompt : # commande : exécuter la commande sous le compte root ou précédée de la commande « sudo »
  • prompt : $ commande : exécuter la commande sous le compte utilisateur

 

1. Installation

– Installer les dépendances :

# apt-get install python-dev mercurial python-virtualenv mysql-server build-essential libmysqlclient-dev

– Créer la base de données sync :

# mysql -u root -p
mysql> create database sync;
mysql> grant all on sync.* to sync identified by 'my_password';
mysql> flush privileges;
mysql> exit;

– Aller dans /var/www et télécharger la dernière version du serveur :

# cd /var/www
# hg clone https://hg.mozilla.org/services/server-full

– Renommer le dossier /var/www/server-full en /var/www/sync :

# mv /var/www/server-full /var/www/sync

– Se placer dans le dossier /var/www/sync et compiler le serveur :

# cd sync
# make build

– Installer Mysql-Python

# bin/easy_install Mysql-Python

– Configurer le fichier /var/www/sync/etc/sync.conf pour MySQL (directives [storage] sqluri et [auth] sqluri), le quota – 25 Mio pour prendre large, le serveur web (directive [auth] fallback_node) et SMTP (directive [smtp] sender) :

# nano /var/www/sync/etc/sync.conf
[global]
clean_shutdown = false

[captcha]
use = false
public_key = 6Le8OLwSAAAAAK-wkjNPBtHD41v5OmoNFANIa1JL
private_key = 6Le8OLwSAAAAAEKoqfc-DmoF4HNswD7RNdGwxRij
use_ssl = false

[storage]
backend = syncstorage.storage.sql.SQLStorage
sqluri = mysql://sync:my_password@localhost/sync
standard_collections = false
use_quota = true
quota_size = 25120
pool_size = 100
pool_recycle = 3600
reset_on_return = true
display_config = true
create_tables = true

[auth]
backend = services.user.sql.SQLUser
sqluri = mysql://sync:my_password@localhost/sync
pool_size = 100
pool_recycle = 3600
create_tables = true
fallback_node = http://my_server.net:5000/

[smtp]
host = localhost
port = 25
sender = my_account@email.net

[cef]
use = true
file = syslog
vendor = mozilla
version = 0
device_version = 1.3
product = weave

– Configurer le fichier /var/www/sync/development.ini pour changer l’emplacement des logs :

# nano /var/www/sync/development.ini
[DEFAULT]
debug = True
translogger = False
profile = False

[server:main]
use = egg:Paste#http
host = 0.0.0.0
port = 5000
use_threadpool = True
threadpool_workers = 60

[app:main]
use = egg:SyncServer
configuration = file:%(here)s/etc/sync.conf

#
# logging
#
[loggers]
keys = root,syncserver

[handlers]
keys = global,syncserver,syncserver_errors

[formatters]
keys = generic

[logger_root]
level = WARNING
handlers = global

[logger_syncserver]
qualname = syncserver
level = ERROR
handlers = syncserver,syncserver_errors
propagate = 0

[logger_syncserver_errors]
qualname = syncserver
level = ERROR
handlers = syncserver_errors
propagate = 0

[handler_global]
class = StreamHandler
args = (sys.stderr,)
level = DEBUG
formatter = generic

[handler_syncserver]
class = StreamHandler
args = (sys.stderr,)
level = INFO
formatter = generic

[handler_syncserver_errors]
class = handlers.RotatingFileHandler
args = ('/var/log/sync/sync-error.log',)
level = ERROR
formatter = generic

[formatter_generic]
format = %(asctime)s,%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
datefmt = %Y-%m-%d %H:%M:%S

– Créer le dossier des logs /var/log/sync :

# mkdir /var/log/sync

– Créer un group sync :

# groupadd sync

– A ce stade, une petite modification par rapport au précédent tutoriel car nous allons cette fois créer un utilisateur weave que nous ajoutons à ce groupe (car le compte sync existait déjà sur mon serveur et étant lié à un exécutable du même nom, il mettait le bazar dans mes scripts) :

# useradd -d /var/www/sync -g sync -r -s /bin/bash weave

– Donner les droits sur les dossiers /var/www/sync et /var/log/sync à l’utilisateur/groupe sync :

# chown -R weave:sync /var/www/sync
# chown -R weave:sync /var/log/sync

– Ajouter une règle IPTABLES ouvrant le port TCP 5000 :

# iptables -A INPUT -p tcp -m tcp --dport 5000 -j ACCEPT

– Démarrer le serveur sync en arrière-plan pour le tester :

$ cd /var/www/sync
$ bin/paster serve development.ini &

– Si tout fonctionne, créer un script pour démarrer automatiquement le service :

# nano /etc/init.d/sync-server.sh
#!/bin/bash 

### BEGIN INIT INFO
# Provides:          Mozilla Sync HomeServer
# Required-Start:    $syslog $network
# Required-Stop:     $syslog $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Mozilla Sync HomeServer initscript
# Description:       Mozilla Sync HomeServer
### END INIT INFO
 
MESSAGELOG=/var/log/sync/sync-messages.log
PID=`pidof -x -o %PPID paster`
 
case "$1" in
  start)
    echo "Starting Mozilla Sync HomeServer"
    [ ! -d $MESSAGEDIR ] && mkdir -p $MESSAGEDIR
    su weave -c "cd /var/www/sync/ && bin/paster serve development.ini &>$MESSAGELOG &"
    ;;
  stop)
    echo "Stopping Mozilla Sync HomeServer"
    kill $PID &>/dev/null
    ;;
  restart)
    $0 stop
    $0 start
    ;;
  *)
    echo "usage: $0 {start|stop|restart}"
esac
exit 0

– Rendre le script exécutable et ajouter le service :

# chmod 755 /etc/init.d/sync-server.sh
# insserv sync-server.sh

Pour le reste, référez-vous à l’article précédent.

Sources :

 

22 commentaires

  1. J’utilise la version avec virtualHost Apache SSL depuis quelques mois et je n’ai pas rencontré de problèmes particuliers.

    Est-ce que tu peux détailler les soucis que tu rencontres ?

    Sinon il doit être possible aussi de transformer un virtualHost en reverse-proxy pour éviter de faire des trous dans le firewall.

    1. Salut skc,

      le problème vient en partie du fait qu’apache ne supporte officiellement qu’un seul certificat par nom de domaine et que je ne peux donc pas utiliser un autre certificat dans un virtualhost.

      L’idée d’utiliser HTTPS pour Sync est un réflexe de sécurité naturel. Dans le cas présent, les données étant chiffrées sur le client avant d’être envoyées au serveur, le seul risque de sécurité correspond au couple login/password qui voyage en clair, il faut donc penser à utiliser un couple unique.

      Maintenant, mes virtualhosts ne sont probablement pas parfaites, si tu peux poster une copie de ta config, je te remercie d’avance !

      Le reverse-proxy est une bonne idée, j’y jetterai un oeil un de ces jours.

      1. Hello,

        C’est effectivement un problème que j’ai rencontré bien avant d’installer un serveur sync.

        J’ai pris la solution de facilité parce que tous mes virtualHost sont dans le même domaine et que je n’ai pas les moyens ni l’envie de payer un certificat: j’ai installé un certificat wildcard. Mon certificat correspond donc à tous les virtualHost SSL que je fais fonctionner.

        Depuis, j’ai découverts deux autres pistes que je n’ai pas essayé.

        * La première consiste à passer la couche sécurité de OpenSSL à GnuTLS; qui supporte le SNI ( http://en.wikipedia.org/wiki/Server_Name_Indication ) mais ne fonctionne pas sous IE/XP. Il semblerait que ce soit aussi possible avec OpenSSL.

        * La seconde consiste à mettre tous les noms des virtualHost dans le champ subjectAltName du certificat, c’est un peu laborieux avec OpenSSL, les manipulations sont décrites sur http://linux-attitude.fr/post/virtualhost-ssl

        1. Très intéressant, surtout l’utilisation de GnuTLS qui s’il pouvait poser problème il y a 2-3 ans avec encore une prédominance IE6-XP, ne doit plus en être un à l’heure actuelle. Une bonne idée pour un futur article 🙂

  2. Voilà ! Testé et approuvé ! ^^

    Peut-être juste un problème à signaler : chez moi le fichier /var/log/sync/sync-error.log existait déjà d’une ancienne installation et appartenait à root:root. C’est la commande sudo su weave -c "cd /var/www/sync/ && bin/paster serve development.ini" qui m’a mis sur la piste.

    Et sinon, pour ceux qui comme moi utilisent Ubuntu, un patch qui résoud le message d’erreur renvoyé par sudo insserv sync-server.sh : https://bugs.launchpad.net/ubuntu/+source/insserv/+bug/467000

    Après ces péripéties, ça fonctionne bien et ça se lance au démarrage !

  3. Je me permet une petite proposition de mise à jour concernant le script de démarrage.

    MESSAGEDIR=/var/log/sync
    MESSAGELOG=/var/log/sync/sync-messages.log
    PID=`pidof -x -o %PPID paster`

    case "$1" in
    start)
    echo "Starting Mozilla Sync HomeServer"
    [ ! -d $MESSAGEDIR ] && mkdir -p $MESSAGEDIR
    su weave -c "cd /var/www/sync/ && bin/paster serve development.ini &>$MESSAGELOG &"
    ;;
    stop)
    echo "Stopping Mozilla Sync HomeServer"
    kill $PID &>/dev/null
    ;;
    restart)
    $0 start
    $0 stop
    ;;
    *)
    echo "usage: $0 {start|stop|restart}"
    esac
    exit 0

    En effet, si le répertoire sync n’existe pas, il le créer.

  4. Bonjour

    Nickel !!!

    J’ai essayé de modifier le backend de [auth]
    => backend = services.auth.ldap.LDAPAuth
    et fait un :
    ./bin/easy_install python-ldap
    mais au lancement j’ai :

    KeyError: « Unknown fully qualified name for the backend: ‘services.auth.ldap.LDAPAuth’, or error in the module: No module named ldap »

    Une idée ?

    Merci

  5. Salut Laurent, merci pour tes remarques :

    – effectivement c’est la méthode services.user.sql.SQLUser qui est privilégiée par Mozilla actuellement, bien que mon serveur perso fonctionne toujours avec services.auth.sql.SQLAuth

    – bien vu pour le restart, je modifie tout ça de ce pas !

    A+

    Doc

  6. Ca sert à quoi de coller tout ça dans /var/www ? il y a une interface HTTP visible via navigateur ? je ne vois aucuns fichiers php/html ….

    1. Bonjour Caemir,

      rien ne t’oblige à utiliser /var/www, si tu préfères /opt, /srv ou /mon_super_serveur_de_synchro_firefox_qui _y _a_que_moi_qui_le_met_là , c’est toi qui voit.

      Personnellement, je place tout ce qui utilise un serveur web dans /var/www, question d’organisation. Je serai curieux de savoir pourquoi seuls les sites « visibles » peuvent être placés dans /var/www ?

      Doc

  7. Hello,
    j’ai mis en place cette solution, merci pour ce tuto, il était très clair 🙂
    Par contre, quand j’utilise ton script pour lancer le serveur sync, j’ai toujours la sortie (les logs) du serveur sync dans ma ligne de commande, as-tu le même problème ?

    1. Salut,

      merci pour la précision, je dois passer mon serveur sous Wheezy dans les semaines qui viennent, je tâcherai de mettre à jour l’article.

      Doc

  8. Sinon j’ai changé cette ligne : grant all on sync.* to sync identified by ‘my_password’;
    par grant all on sync.* to ‘sync’@’localhost’ identified by ‘my_password’;

    j’avais une erreur de type :
    sqlalchemy.exc.OperationalError: (OperationalError) (1045, « Access denied for user ‘sync’@’localhost’ (using password: YES) ») None None
    @+

Répondre à badmaniak Annuler la réponse

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *