Installer Synapse et Element avec Docker
Au sommaire :
- 1-Qu'est-ce que Matrix ?
- 2-Qu'est-ce que Synapse ?
- 3-Qu'est-ce que Element ?
- 4-Anecdotes
- 5-Prérequis
- 6-Déploiement
- 7-Configuration
Si vous cherchez à mettre en place une messagerie collaborative, jetez un œil à ces deux autres tutoriels.
1-Qu'est-ce que Matrix ?
Matrix est un protocole de communication sous licence Apache 2 maintenue par la fondation Matrix.org.
L'idée centrale autour de Matrix est l'interopérabilité. À travers des ponts (bridges), Matrix va vous permettre de converser avec d'autres personnes utilisant d'autres messageries comme lorsque vous envoyez un mail d'une boite Outlook vers une boite Gmail.
En effet, contrairement aux boites mails, les messageries instantanées utilise leur propre protocole de communication, ce qui empêche les gens de converser entre eux s'ils n'ont pas exactement la même application.
Enfin, Matrix est un réseau décentralisée qui propose comme Mastodon, Peertube et d'autres un système de fédération.
Vous avez le choix entre :
- Soit héberger votre propre instance, en local ou sur internet.
- Soit vous fédérer avec d'autres instances.
Si vous souhaitez en savoir plus, visionnez cette vidéo de Paf le Geek qui vulgarise à merveille le sujet.
2-Qu'est-ce que Synapse ?
Synapse est un serveur basé sur le protocole Matrix.
Il est actuellement le seul à être en version stable. Construct, Conduit et Dendrite sont actuellement en version beta.
Il utilise comme base de données SQLite ou PostgreSQL.
3-Qu'est-ce que Element ?
Element est une messagerie collaborative sous licence Apache 2 maintenue par la société du même nom (ex New Vector) concurrente de Slack, Mattermost, Rocket.Chat et MS-Teams.
C'est un client compatible avec le serveur Synapse et donc avec le protocole Matrix.
Connue auparavant sous le nom de Riot, Element a été téléchargé plus de 15 millions de fois et compte plus de 60 millions d'utilisateurs.
C'est de loin le client le plus populaire de l’écosystème Matrix aux cotés de Cinny et Flufflychat.
Pour en savoir plus sur Element et le voir en action, cliquez sur la vidéo-dessous.
4-Anecdotes
Une française derrière Matrix et Element
Derrière la fondation Matrix.org et la société Element, une française, Amandine Le Pape qui à cofondée ces deux entités.
Voici une interview de la cofondatrice qui explique comment sont nées ces deux projet et entres autres, comment Element a vu un boom des téléchargements en Ukraine depuis le début du conflit (un vrais cas d'usage).
Ainsi que cet excellent article de Next INpact.
Le gouvernement français fork Element
Le gouvernement français suite à l'affaire des "Macron Leaks" utilise désormais Tchap, un fork de Element.
Je cite le site Usbek & Rica :
La campagne présidentielle de 2017 avait été marquée par l’affaire dite des « Macron Leaks ». À l’époque le futur président et ses collaborateurs communiquaient par Télégram ou WhatsApp. Une fois au pouvoir, les équipes du président ont cherché une messagerie plus sécurisée, dont les données ne seraient hébergées ni par la Russie, ni par les États-Unis. « Ils cherchaient à avoir une messagerie qui soit à la fois souveraine et qu’ils pourraient déployer eux-mêmes, qui aurait été conçue avec des logiciels libres pour ne pas être rattachée à un vendeur pour toujours, et qui soit chiffrée de bout en bout…Et finalement, il n’y en a pas tant que ça, ils sont rapidement tombés sur nous », raconte Amandine Le Pape.
Aujourd’hui, l’administration française a donc sa messagerie, Tchap, un fork (version dérivée indépendante, ndlr) de Riot (devenue Element par la suite). Et l’État français n’est qu’un client parmi d’autres, puisque l’armée allemande, mais aussi Mozilla et Wikimédia comptent aussi parmi les utilisateurs. Malgré ces clients prestigieux, Amandine Le Pape confie devoir « travailler encore sur l’interface d’Element qui reste, pour l’instant, plus complexe que celle de WhatsApp ».
Bon par contre le fork niveau sécurité.....
5-Prérequis
Il vous faudra une machine virtuelle sous Ubuntu Server 22.04 LTS.
Voici le guide pour ceux qui veulent repartir de zéro.
Si vous voulez gagner du temps, utilisez un template cloud-init.
Ensuite, suivez ce guide pour installer Docker, Docker Compose et préparer vos variables d'environnement.
Enfin, pour exposer l'application sur l'internet public, il vous faudra déployer Traefik.
6-Déploiement
Commencez par créer un dossier "docker" à la racine du dossier utilisateur"
mkdir -p ~/docker
Créez un fichier nommé "compose.yml"
touch ~/docker/compose.yml
Ouvrez le fichier "compose.yml" et copiez cette configuration.
version: "3.9"
networks:
web:
database:
services:
traefik:
container_name: traefik
image: traefik:latest
restart: always
network:
web:
ports:
- 80:80
- 443:443
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ${APPDATA}/traefik/logs:/logs
- ${APPDATA}/traefik/traefik.yml:/traefik.yml
- ${APPDATA}/traefik/dynamic.yml:/dynamic.yml
- ${APPDATA}/traefik/letsencrypt/acme.json:/acme.json
labels:
- traefik.enable=true
- traefik.http.routers.traefik-dash.entrypoints=websecure
- traefik.http.routers.traefik-dash.rule=Host(`traefik.<votredomaine>.ovh`)
- traefik.http.routers.traefik-dash.service=api@internal
- "traefik.http.routers.traefik.middlewares=middlewares-basic-auth@file"
element:
image: vectorim/element-web:latest
container_name: element
restart: unless-stopped
volumes:
- ${APPDATA}/element/config.json:/app/config.json
networks:
- t2_proxy
labels:
- traefik.enable=true
- traefik.http.routers.element.entrypoints=websecure
- traefik.http.routers.element.tls.certresolver=letsencrypt
- traefik.http.routers.element.rule=Host(`<votre_nom_de_domaine>`)
- traefik.http.routers.element.service=element-svc
- traefik.http.services.element-svc.loadbalancer.server.port=80
synapse:
image: matrixdotorg/synapse:latest
container_name: synapse
restart: unless-stopped
volumes:
- ${APPDATA}/synapse:/data
networks:
- web
- database
depends_on:
- synapsedb
labels:
- traefik.enable=true
- traefik.http.routers.synapse.entrypoints=websecure
- traefik.http.routers.synapse.tls.certresolver=letsencrypt
- traefik.http.routers.synapse.rule=Host(`votre_nom_de_domaine`)
- traefik.http.routers.synapse.service=synapse-svc
- traefik.http.services.synapse-svc.loadbalancer.server.port=8008
synapsedb:
image: postgres:latest
container_name: synapsedb
restart: unless-stopped
environment:
- PGUSER=synapse
- POSTGRES_USER=synapse
- POSTGRES_PASSWORD=synapse
- POSTGRES_DB=synapse
- POSTGRES_INITDB_ARGS=--encoding='UTF8' --lc-collate='C' --lc-ctype='C'
volumes:
- ${APPDATA}/synapsedb:/var/lib/postgresql/data
networks:
- database
Si vous avez suivi le guide de Traefik, il vous faudra ajouter les labels adéquat pour pouvoir exposer l'application sur l'internet public.
Suivez les parties 6 et 7 du guide de ce dernier pour ouvrir les ports de votre box internet et ajouter les entrées DNS pour pouvoir accéder à l'application.
On va voir ensemble les spécificités des conteneurs Element, Synapse et PostgreSQL.
Element
C'est le client web. En soit, il n'est pas obligatoire, vous pouvez même le supprimer de la stack docker-compose mais si vous utilisez par exemple un PC professionnel et que vous n'avez aucun droit administrateur pour installer le client bureautique.....use case man, use case.
Commencez par créer un dossier avec droit utilisateur appliqués aux sous dossiers.
mkdir element -p
Puis téléchargez le fichier "config.json" disponible sur le dépôt GitHub.
wget -O ${APPDATA}/element/config.json https://raw.githubusercontent.com/vector-im/element-web/develop/config.sample.json
Si vous ne le faites pas, vous aurez ce joli message d'erreur au déploiement car le conteneur ne trouvera pas le fichier "config.json" (il va pas le créer de lui même, il s'attend à le trouver).
Et si vous vous contentez de créer un fichier "config.json" vide avec la commande "touch", vous aurez ce joli message d'accueil.
Le déploiement du conteneur ne nécessite aucune options en particulier. Il écoute sur le port 80 et sera exposé par Traefik, rien de plus basique.
Synapse
Pour la partie serveur c'est une autre paire de manches, quelques réglages sont nécessaires.
Mais vous allez voir, rien d'insurmontable.
Commencez par créer le dossier "synapse" dans le répertoire de vos applications Docker.
mkdir synapse -p
Puis générez la configuration de Synapse avec la commande suivante.
docker run -it --rm -v ${APPDATA}/synapse:/data -e SYNAPSE_SERVER_NAME=<votre_nom_de_domaine> -e SYNAPSE_REPORT_STATS=no matrixdotorg/synapse:latest generate
Vous allez y trouver le fichier "homeserver.yaml". Modifiez ce dernier.
sudo nano /home/<unsername>/appdata/synapse/homeserver.yaml
Il va falloir faire un choix pour la base de données :
- Soit utiliser SQLite (par défaut).
- Soit utiliser PotsgreSQL.
Si vous utilisez SQLite, laissez la configuration par défaut.
Si vous utilisez PostgreSQL, cochez ou supprimez la configuration de SQLite et copiez cette configuration.
database:
name: psycopg2
txn_limit: 10000
args:
user: synapse
password: synapse
database: synapse
host: synapsedb
port: 5432
cp_min: 5
cp_max: 10
Même si une clé aléatoire de 64 caractères est déjà générée avec la configuration par défaut, vous pouvez en générez une nouvelle via ce site (indiquez 64 dans lenght).
Ou directement sur Linux.
Une fois générée, remplacez là avec la commande suivante.
echo "registration_shared_secret: <votre_clé>" | sudo tee -a ${APPDATA}/synapse/homeserver.yaml > /dev/null
Le serveur de confiance par défaut est matrix.org mais son utilisation génére un avertissement au démarrage.
Ajoutez à la fin du fichier la ligne suivante pour supprimer cet avertissement.
suppress_key_server_warning: true
PostgreSQL
Voici à quoi servent les variables d'environnement :
- PGUSER : compte administrateur de la base de données
- POSTGRES_USER et POSTGRES_PASSWORD : identifiant et mot de passe du compte utilisateur de la base de données Synapse
- POSTGRES_DB : le nom de la base de données
- POSTGRES_INITDB_ARGS : les arguments de la base de données (police de caractères)
Ce sont les mêmes informations qui sont indiqués dans le fichier "homeserver.yml".
environment:
- PGUSER=synapse
- POSTGRES_USER=synapse
- POSTGRES_PASSWORD=synapse
- POSTGRES_DB=synapse
- POSTGRES_INITDB_ARGS=--encoding='UTF8' --lc-collate='C' --lc-ctype='C'
Maintenant qu'on a fait un tour d'horizon de la configuration, il va falloir déployer la stack.
Déployez avec la commande suivante.
docker compose up -d
Ensuite, exécutez la commande suivante pour créer le compte administrateur.
docker exec -it synapse register_new_matrix_user http://<votre_nom_de_domaine> -c /data/homeserver.yaml
Ensuitez, tapez le nom de l'instance web de Element puis cliquez sur "Modifier".
Indiquez l'adresse de votre instance puis cliquer sur "Continuer".
Indiquez l'identifiant et le mot de passe que vous avez créer plus haut puis cliquez sur "Se connecter".
Félicitation!!!! Vous avez votre propre messagerie instantanée désormais.
Dans ce tutoriel, la création des comptes par les utilisateurs est désactivée, ce sera à vous de vous en occuper.
Il y a plusieurs méthodes donc j'en parlerai dans un guide avancée prochainement.
SI le sujet vous intéresse, voici la documentation à ce sujet (partie registration).
7-Sécuriser vos sessions
Par défaut, Element applique le chiffrement de bout en bout (E2EE), ce qui est une très bonne chose.
Dans ce chapitre, nous allons voir comment :
- Générer une clé de sécurité.
- Authentifier une session.
Sur votre navigateur web, allez dans "Home" et cliquez sur "Tous les paramètres".
Vous allez voir qu'à la première connexion, votre session est indiquée comme "vérifiée".
Je vous invite à vous deconnecté et à vous reconnecté, vous allez avoir un joli message qui va s'afficher.
Element indique qu'il lui est impossible de vérifier votre appareil car vous n'avez pas générer de clé de sécurité et que vous n'avez pas d'autre appareil authentifié avec ce compte.
Cliquez sur "Faire la réinitialisation" puis configurez la sauvegarde sécurisée.
Vous avez le choix entre :
- Générer une clé de sécurité
- Saisir une phrase de sécurité et générer une clé de sécurité (optionnel)
Personnellement, la clé de sécurité me suffit mais vous pouvez doubler la sécurité avec le passphrase.
Sélectionnez "Générez une clé de sécurité" et cliquez sur "Continuer".
Cliquez sur "Télécharger" pour avoir une copie de ce dernier puis cliquez sur "Continuer".
Si vous avez suivi mon guide sur Vaultwarden, pensez à copier la clé dans votre coffre par sécurité.
La sauvegarde sécurisée a été réalisée avec succès, vous pouvez cliquer sur "Terminé".
Maintenant voyons voir comment ajouter un nouvel appareil (Iphone pour l'exemple).
Sur votre smartphone, installez l'application, indiquez l'adresse de l'instance et votre compte utilisateur puis valider par "Se connecter".
Vous aurez ce message vous indiquant que Element a besoin de vérifier votre session pour accéder aux discussions précédentes.
Allez sur votre navigateur et cliquez sur "Vérifier la session".
Scanner le QR Code ou cliquez sur "Commencer" (deuxième choix pour l'exemple).
Sur les deux appareils, cliquez et validez avec "Ils correspondent".
Le smartphone est authentifié avec succès.
Déconnectez-vous de nouveau du navigateur web.
Vous avez maintenant un nouvel appareil authentifié ainsi qu'une clé de sécurité pour authentifier votre session.
Vous avez le choix entre vérifier avec un autre appareil (le smartphone) ou avec une clé de sécurité.
On va opter pour vérifier avec un autre appareil.
Sur votre smartphone, vous allez devoir valider la session du navigateur web. Sélectionnez "Vérifier".
La session web est actuellement en rouge.
Selectionnez "Vous ne lui faites pas confiance".
Et sélectionnez avec "Vérifier de façon interactive".
Retournez sur votre navigateur web puis cliquez sur "Vérifier la session".
Cliquez sur "Commencer" pour comparer les émojis.
Validez sur le navigateur web et le smartphone.
La session web est désormais authentifiée.