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.
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 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 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 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):
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.
Richard Dern
Échanger autour de ce texte
Si vous souhaitez réagir publiquement, un fil dédié vous attend.
Ouvrir le fil de discussion