--- comments_url: https://com.richard-dern.fr/post/547 date: "2016-02-22 22:22:28" links: - lang: fr name: Page d'origine sur LinuxFr url: https://linuxfr.org/users/richarddern/journaux/installer-un-serveur-firefox-accounts-et-firefox-sync tags: - Firefox Sync - Auto-hébergement - Firefox title: Installer un serveur Firefox Accounts et Firefox Sync weather: humidity: 78 illuminance: 0.0 precipitations: false pressure: 1010.1 source: - open-meteo temperature: 8.4 wind_direction: 238 wind_speed: 22.5 --- > Depuis longtemps Firefox, comme d'autres navigateurs, permet de stocker ses données dans le Cloud pour pouvoir les sauvegarder et facilement les partager entre plusieurs instances du navigateur. > Et en plus, on peut l'auto-héberger ! > Suivez le guide. ## Pré-requis globaux On va partir du principe qu'on veut un backend sous MySQL. - git - [node](https://nodejs.org/en/download/) - [bower](http://bower.io/) - mysql ou équivalent Je recommande de tout mettre dans _/opt_, mais vous êtes libres de faire comme bon vous semble. L'ensemble préfère naturellement les connexions chiffrées. Équipez-vous donc de certificats (personnellement, j'opte pour un par serveur accessible de l'extérieur), faut de quoi votre serveur de synchronisation ne fonctionnera pas correctement. ## Backend MySQL On récupère les sources: ``` git clone https://github.com/mozilla/fxa-auth-db-mysql.git cd fxa-auth-db-mysql npm install ``` On créé le fichier de configuration: ``` nano config/prod.json ``` ``` { "master": { "host": "127.0.0.1", "user": "root", "password": "", "database": "fxaccounts" }, "slave": { "host": "127.0.0.1", "user": "root", "password": "", "database": "fxaccounts" } } ``` Notez que comme _fxa-auth-server_ et _fxa-content-server_ que nous verrons plus loin, _fxa-auth-db-mysql_ fait appel à [convict](https://github.com/mozilla/node-convict) pour la gestion de la configuration. Si vous avez besoin d'autres paramètres de configuration que ceux que nous venons de créer, regardez le fichier _config/config.js_, et modifiez le fichier _config/prod.json_ en conséquence. Notez également que la base de données n'a pas besoin d'être créée à l'avance. Vous pouvez ensuite démarrer le serveur et vous assurer que tout va bien: ``` npm start ``` ## fxa-auth-server ``` cd /opt git clone https://github.com/mozilla/fxa-auth-server.git cd fxa-auth-server npm install ``` Lancez une première fois le serveur pour générer les clés de chiffrement: ``` npm start ``` Vous devriez voir la sortie suivante: ``` > npm start > fxa-auth-server@1.56.0 start /opt/fxa-auth-server > NODE_ENV=dev scripts/start-local.sh 2>&1 Generating keypair Secret Key saved: /opt/fxa-auth-server/config/secret-key.json Public Key saved: /opt/fxa-auth-server/config/public-key.json fxa-auth-server.INFO: [...] ``` Arrêtez ensuite le serveur en faisant Control + C Modifiez le fichier de configuration: ``` nano .env.dev ``` ``` PUBLIC_URL=https://ffaccounts.example.org IP_ADDRESS=0.0.0.0 CONTENT_SERVER_URL=https://ffcontent.example.org [...] USE_TLS=true TLS_KEY_PATH=/etc/ssl/private/ffaccounts.key TLS_CERT_PATH=/etc/ssl/private/ffaccounts.crt ``` Dans le cas présent, remplacez les domaines par les vôtres. Notez que l'on va [reverse-proxyfier](https://fr.wikipedia.org/wiki/Proxy_inverse) tout ça, donc dans votre serveur web préféré, il faudra configurer un reverse proxy pour _ffaccounts.example.org_ pointant sur l'adresse de votre serveur (127.0.0.1 si le serveur web et le serveur de comptes firefox sont sur la même machine) et sur le port 9000. De même, le reverse proxy de _ffcontent.example.org_ pointera sur le serveur de contenu (voir plus bas) sur le port 3030. Démarrez le serveur afin de vous assurer que tout va bien: ``` npm start ``` Vous devriez voir un bloc JSON avec votre configuration. ## fxa-content-server ``` cd /opt git clone https://github.com/mozilla/fxa-content-server.git cd fxa-content-server npm install ``` Si vous installez _fxa-content-server_ en tant que root, entrez la commande suivante: ``` bower --allow-root update --config.interactive=false -s ``` Si vous ne l'installez pas en tant que root: ``` npm postinstall ``` Lancez le serveur: ``` npm start ``` Ce qui aura pour effet de créer le fichier _server/config/local.json_. Il se peut que cette commande s'arrête brusquement: ``` fxa-content-server.CRITICAL: uncaughtException Error: ENOENT: no such file or directory, open '/opt/fxa-content-server/node_modules/express-able/node_modules/able/bundle.js' ``` Lancez la commande suivante pour corriger le problème: ``` cd /opt/fxa-content-server/node_modules/express-able/node_modules/able/ npm run bundle ``` Puis, relancez le serveur: ``` cd /opt/fxa-content-server npm start ``` Cette fois, il ne devrait plus y avoir d'erreur. Arrêtez le serveur avec Control + C, il faut maintenant le configurer. ``` nano server/config/local.json ``` ``` { "public_url": "https://ffcontent.example.org", "fxaccount_url": "https://ffaccounts.example.org", "oauth_client_id": "98e6508e88680e1a", "oauth_url": "http://127.0.0.1:9010", "profile_url": "http://127.0.0.1:1111", "profile_images_url": "http://127.0.0.1:1112", "client_sessions": { "cookie_name": "session", "secret": "YOU MUST CHANGE ME", "duration": 86400000 }, "env": "development", "use_https": false, "static_max_age" : 0, "i18n": { "supportedLanguages": ["af", "an", "ar", "as", "ast", "az", "be", "bg", "bn-BD", "bn-IN", "br", "bs", "ca", "cs", "cy", "da", "de", "dsb", "el", "en", "en-GB", "en-ZA", "eo", "es", "es-AR", "es-CL", "es-MX", "et", "eu", "fa", "ff", $ }, "route_log_format": "dev_fxa", "logging": { "fmt": "pretty", "level": "debug" }, "static_directory": "app", "allowed_parent_origins": ["http://127.0.0.1:8080"], "csp": { "enabled": true, "reportUri": "/_/csp-violation" } } ``` Le plus important est de changer l'URL public pour qu'il corresponde à la variable _CONTENT_SERVER_URL_, que l'on a spécifié dans la configuration de _fxa-auth-accounts_. Assurez-vous aussi de rajouter _fxaccount_url_ puisque ce paramètre n'existe pas dans la configuration générée automatiquement. Une fois la configuration faite, on relance le serveur: ``` npm start ``` On devrait maintenant pouvoir se connecter, créer son compte et le valider par mail. Accédez à votre serveur avec l'adresse `_https://ffcontent.example.org_` (en remplaçant bien sûr par votre propre domaine), et créez le compte. Une fois la validation par mail effectuée, une "erreur inattendue" apparaitra. Je ne sais pas à quoi elle est dûe, mais ne semble pas affecter négativement la suite. On ne s'en soucie donc pas pour l'instant, mais si quelqu'un a une explication/solution, je suis preneur ! ## Serveur de synchronisation Enfin, dernière pièce de notre puzzle, le serveur de synchronisation. La [page dédiée](http://docs.services.mozilla.com/howtos/run-sync-1.5.html) de la documentation fournie par Mozilla est plus accessible et plus à jour que celles concernant le serveur Firefox Accounts. Voici tout de même mon guide, par soucis de centralisation et d'exhaustivité. Les paquets suivants sont requis: ``` python-dev git-core python-virtualenv g++ ``` On récupère les sources et on compile: ``` cd /opt git clone https://github.com/mozilla-services/syncserver cd syncserver make build ``` On configure: ``` nano syncserver.ini ``` ``` [syncserver] public_url = https://ffsync.example.org/ sqluri = pymysql://root:motdepasse@127.0.0.1/fxsync force_wsgi_environ = true [browserid] backend = tokenserver.verifiers.LocalVerifier audiences = https://ffsync.example.org ``` Contrairement à _fxa-auth-db-mysql_, ici la base de données doit être créée avant de lancer le serveur. Dans mon cas, je l'ai nommée _fxsync_. Là aussi, on va créer un reverse proxy dans son serveur web préféré, pour _ffsync.example.org_ vers l'adresse du serveur de synchronisation, sur le port 5000. On place la variable _force_wsgi_environ_ à _true_ pour éviter que le scheme ne pose problème avec le reverse proxy (qui est en HTTPs) et ce serveur (qui est en HTTP). Mettez à jour la valeur de _secret_, comme indiqué en commentaire dans le fichier. On peut lancer le serveur: ``` make serve ``` ## Configuration de firefox Maintenant que tout est installé, reste à configurer firefox pour prendre en compte notre propre serveur de synchronisation. Fiez-vous à la capture d'écran suivante pour ajuster vos paramètres (dans _about:config_): ![firefox](images/ff.jpeg "Source : https://www.athaliasoft.com/images/original/da2017a3d7a98884e569104479c12fc0/ff.jpeg") Remplacez les domaines par les vôtres, bien entendu. Remarquez qu'une option _identity.fxaccounts.allowHttp_ a été créée. Si vous voulez vous aventurer à créer un serveur de synchronisation sans chiffrement, positionnez cette valeur à _true_. Enfin, rendez-vous dans les options, onglet "Sync", et connectez-vous avec le compte précédemment créé. Firefox devrait pouvoir se synchroniser sans problème. À noter que si vous cliquez sur le lien "Gérer le compte" une fois configuré, vous aurez la même erreur inattendue que précédemment, ce qui m'incite à croire qu'elle est liée à l'absence d'un serveur d'identité. Mais je laisse ça à un hypothétique futur article.