Installer Synapse et Element avec Docker

Guide d'installation de Synapse et Element sous Docker.

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.

Installer Rocket.Chat avec Docker
Guide d’installation de Rocket.Chat sous Docker.
Installer Mattermost avec Docker
Guide d’installation de Mattermost sous Docker.

1-Qu'est-ce que Matrix ?

Matrix est un protocole de communication sous licence Apache 2 maintenue par la fondation Matrix.org.

matrix.org
A new basis for open, interoperable, decentralised real-time communication - 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.

Bridges
Matrix, the open protocol for secure decentralised communications

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.

GitHub - matrix-org/synapse: Synapse: Matrix homeserver written in Python/Twisted.
Synapse: Matrix homeserver written in Python/Twisted. - GitHub - matrix-org/synapse: Synapse: Matrix homeserver written in Python/Twisted.

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.

Element
We make Element, a decentralised encrypted comms app for the Matrix.org ecosystem - Element

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.

FluffyChat Official Website
The cutest messenger in the Matrix network
Cinny
A Matrix client where you can enjoy the conversation using simple, elegant and secure interface protected by e2ee with the power of open source.

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).

Matrix, le protocole décentralisé made in France qui cartonne en Ukraine
Matrix et Element sont respectivement un protocole et une application sécurisés et décentralisés. Avec le conflit ukrainien, ces technologies ont connu un certain succès auprès des utilisateurs. Mais qu’ont-elles de spécifiques ? On a rencontré Amandine Le Pape, la co-fondatrice de ces services…

Ainsi que cet excellent article de Next INpact.

À la découverte de Riot, l’outil libre derrière la future messagerie de l’État français
À l’été, le gouvernement français compte disposer de sa propre messagerie en ligne, pour reprendre la main sur certaines conversations sensibles. Derrière ce projet se cache Riot, un système de communication libre en développement…

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 ».

Tchap, la messagerie instantanée des agents de la fonction publique
Tchap est ouvert à tous les agents de la fonction publique, quel que soit leur statut.
Tchap secure app | French government | Matrix
Tchap is the French government’s digital sovereign secure messaging and collaboration app. It is a Matrix-based, on-premise messenger and collaboration platform. The group messenger and collaboration tool supports more than 300,000 users across the French civil service.

Bon par contre le fork niveau sécurité.....

«Tchap», la messagerie chiffrée du gouvernement, déjà victime d’une faille de sécurité
Quelques heures après son lancement, un chercheur en sécurité informatique a réussi à accéder à cette plateforme censée être réservée à l’Et

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.

Virtualiser Ubuntu Server 22.04 LTS sur Proxmox VE
Guide d’installation de Ubuntu Server 22.04 LTS sur Proxmox VE avec mes meilleurs réglages.

Si vous voulez gagner du temps, utilisez un template cloud-init.

Initialiser vos machines virtuelles avec Cloud-init sur Proxmox VE
Guide d’installation de Cloud-Init qui va vous permettre d’automatiser vos déploiements

Ensuite, suivez ce guide pour installer Docker, Docker Compose et préparer vos variables d'environnement.

Installer Docker
Guide d’installation de Docker.

Enfin, pour exposer l'application sur l'internet public, il vous faudra déployer Traefik.

Installer Traefik avec Docker
Guide d’installation de 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).

Random Alphanumeric Generator 🄰 - Get a random alphanumeric sequence
Produce a random alphanumeric string from the English alhpabet or any other alphabet of your choosing (custom input). ➤ The alphanumeric strings can be from any alphabet (German, French, Spanish, Russian, etc.). Random letter and number generator. The random string generator can produce random alpha…

Ou directement sur Linux.

Generating Secure Values - Reference
A reference guide on generating secure values such as password hashes, password strings, and cryptography keys

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).

Configuration Manual - Synapse

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é.

(Docker) Vaultwarden
Au sommaire : * 1-Qu’est-ce que Vaultwarden ? * 2-Prérequis * 3-Déploiement * 4-Configuration * 5-Authentification 2FA 1-Qu’est-ce que Vaultwarden ? Vaultwarden est un fork de Bitwarden, le célèbre gestionnaire de mots de passe, connu auparavant sous le nom de Bitwarden _RS. C’est un serveur backend compatible avec l’API de Bitwarden, ce qui fait qu’il est compatible avec

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.

Sources