Cette page est là uniquement pour servir de mémo. C'est une ancienne version qui a servie en interne avant la mise en place du serveur chez Arise. Une meilleure présentation technique est prévue.

Matrix

Protocole de communication décentralisé et fédéré (comme le mail).

Matrix permet de synchroniser un historique de messages sous format JSON entre plusieurs serveurs. Les messages sont regroupés par canaux (ou channels). L'usage principale aujourd'hui est la communication instantanée textuelle et la visio conférence, mais on peut imaginer d'autre chose (IoT, RV, …).

Un serveur publique officiel est disponible à l'adresse matrix.org. Une liste non officielle des serveurs (publics et privés) existe aussi : https://www.hello-matrix.net/public_servers.php. Le serveur Arise arrive bientôt 😉

C'est un protocol fédéré, ce qui veut dire qu'un channel est partagé entre tous les serveurs qui ont au moins un user faisant partie du channel. Imaginons par exemple :

  • je crée le channel #coucou:cervoi.se, sur mon serveur Matrix cervoi.se
  • Alice, utilisatrice du serveur alice.fr, rejoint le channel
  • Bob, utilisateur du serveur bob.com, fait de même

Si mon serveur cervoi.se disparaît, Alice et Bob peuvent toujours communiquer ensemble. Par contre, plus personne ne peut rejoindre le channel vu que son adresse est #coucou:cervoi.se et que cervoi.se ne répond plus. Pas de problème, Alice (ou Bob) peut créer une adresse #nimportequoi:alice.fr rendant de nouveau ce channel accessible depuis l'extérieur.

Concrètement, une adresse (appelé alias dans le jargon Matrix) n'est qu'un pointeur vers un channel, qui dispose d'un identifiant interne (appelé MXID) caché à l'utilisateur. La channel #matrix:matrix.org dispose par exemple de plus de 30 alias différents.

Pour avoir une idée rapide de comment que ça marche, il y a une jolie animation sur http://matrix.org (section How does it work?).

Matrix propose aussi du chiffrement de bout en bout (end to end ou E2E), comme Whatsapp ou Signal.

C'est une techno jeune qui manque encore de certaines fonctionnalités, mais qui est déjà parfaitement utilisable (surtout dans un cadre non professionnel comme le nôtre), évolue très vite et est ouvert à la communauté. En 5 mois d'utilisation j'ai déjà vu plusieurs features s'améliorer de manière significative, et j'ai même contribué au bridge IRC (Moïse, 08/07/2017).

Features

  • protocole open source
  • textes
  • images
  • visio: Matrix sert pour faire du signaling WebRTC
  • chiffrement de bout en bout
  • invitation
  • historique persistent
    • public : pas besoin de rejoindre le channel
    • complet : rejoindre le channel donne accès à tout l'historique
    • depuis la date de l'invitation
    • depuis la date du join
  • gestion des droits
  • accusés de lecture (à la facebook messenger)
  • appli web
  • appli mobile
    • notification push
  • multiples bridges :
    • IRC : le plus gros bridge, grosse communauté derrière
    • slack
    • facebook messenger

Serveur

L'implémentation de référence actuelle est Synapse, un serveur pour Matrix écrit en Python. Un serveur écrit en Go est sur les rails et sera le prochain serveur de référence. Une implémentation par la communauté en Rust avance aussi.

Synapse implémente toute l'API Matrix. Il fonctionne avec une base de données SQLite ou PostgreSQL. Il peut supporter l'authentification auprès d'un LDAP. Un client minimaliste est fourni mais il est recommandé de le désactiver par mesure de sécurité (client et serveur sur le même domaine, c'est pas terrible).

Un dépôt Debian est disponible, ça s'installe tout seul.

Synapse a la réputation d'être assez consommateur en ressources, que ça soit mémoire ou disque. Cependant après 5 mois d'utilisation je trouve sa consommation assez raisonnable (témoignage by Moïse le 08/07/2017)

root@ns3033797:~# du -sh /var/log/matrix-synapse/
1.1G	/var/log/matrix-synapse/
root@ns3033797:~# du -sh /var/lib/matrix-synapse/*
2.7G	/var/lib/matrix-synapse/homeserver.db
3.4G	/var/lib/matrix-synapse/media
4.0K	/var/lib/matrix-synapse/results.txt
8.0K	/var/lib/matrix-synapse/uploads

À noter qu'ici les logs ne sont pas compressés.

Concernant la mémoire et le CPU, je le fais tourner avec 2Go de ram et un processeur Intel(R) Core(TM) i5-2300 CPU @ 2.80GHz qui se touche la nouille.

L'administration est assez minimaliste. Du fait du protocole fédéré, il ne peut pas vraiment y avoir de super utilisateur sur un serveur (les autres serveurs ne le reconnaîtraient pas). La plupart des taches d'administration (supprimer des utilisateurs par exemple) doivent se faire en tapant directement dans la DB pour l'instant. Cependant une API d'administration est apparu dans la release 0.22.0, permettant pour l'instant de supprimer totalement un channel (encore une fois, si le channel était fédéré entre plusieurs serveur, il n'a pas vraiment disparu de l'univers Matrix).

Clients

Web

Le client web de référence est Riot. On peut y accéder sur l'instance officielle https://riot.im/app/ qui permet de se connecter à n'importe quel serveur, ou l'installer (c'est une page statique, full js).

Features :

  • apperçu des liens (si feature activée sur le serveur, nécessaire à cause du CORS)
  • envoie d'image, vidéos, fichiers audios, fichiers quelconques
  • visio conférence
  • chiffrement
  • hilight
  • notification : tous les messages, les mentions et hilights, ou aucun messages, réglable par chan
  • traqueur du dernier message non lu pour y remonter

La plupart des paramètres du client sont sauvegardés sur le serveur matrix de l'utilisateur (c'est un mécanisme de l'API), ce qui permet une synchronisation entre les différents clients (y compris le client mobile).

Points négatifs :

  • le design est très espacé, quand on vient d'IRC on a l'impression qu'il y a 10 fois moins d'info affichée à l'écran. Espérons qu'un thème plus condensé arrive un jour. il y a maintenant un mode compact
  • les hilights (autre que la mention du nom de l'utilisateur) ne sont pas encore très bien gérés, notamment l'indicateur des notifs ne s'affiche pas sur le chan quand c'est seulement un hilight (bien que ça soit le cas dans la barre de titre)

Mobile

Le client mobile de référence est Riot.im. Disponible pour Android et IOS (à confirmer).

Features :

  • envoie d'image, vidéo, fichiers audios, fichiers quelconques
  • partage depuis n'importe quelle appli
  • chiffrement
  • hilight
  • notification push : tous les messages, les mentions et hilights, ou aucun messages, réglable par chan
  • traqueur du dernier message non lu
  • possibilité d'ignorer un utilisateur (feature pas qui fonctionne aussi sur la version web mais qu'on ne peut configurer que depuis l'appli mobile pour l'instant)

Points négatifs :

  • le traqueur du dernier message non lu est une feature récente qui semble ne pas être synchro avec le traqueur sur la version web (pour avoir lu quelques discussions sur le sujet, c'est une galère technique horrible, mais ça a déjà énormément progressé en quelques mois sur la version web, ça va sûrement s'améliorer sur la version mobile aussi) c'est fixé

Bridges

Les développeurs de Matrix ont mis l'accent très tôt sur les bridges (ou passerelles en bon français). Leur idée n'est pas d'imposer Matrix à tout le monde, mais plutôt de pouvoir fédérer tous les différents moyens de communication existent grâce à Matrix (d'où le nom). Si vous vous rappelez ce xkcd, voici la réponse de Matrix :

L'ajout d'un bridge à un serveur Matrix nécessite d'être administrateur du serveur, puisqu'il faut procéder à un échange de clef (étape manuelle).

IRC

Le bridge IRC est le bridge le plus utilisé et développé.

Features :

  • une connexion par utilisateur côté IRC : c'est donc totalement transparent pour les utilisateurs d'IRC
  • transfert des fichiers uploadés depuis matrix sur IRC (au moyen d'un message /me uploaded a file <url>)
  • synchronisation des droits : permet d'op un user matrix depuis IRC (encore expérimental)
  • bridge static des channels : permet de bridger un channel arbitraire côté Matrix avec un autre channel arbitraire côté IRC
  • bridge dynamique des channels : rejoindre #irc_monchannel sur matrix me fera rejoindre #monchannel sur IRC (regex configurable)
  • possibilité d'empêcher la fédération des channels bridgés, qui seront donc inaccessible depuis un autre serveur Matrix : je ne vois pas trop l'intérêt, mais pourquoi pas

Dans les features manquants / problèmes :

  • dans Matrix, n'importe qui ne peut pas éditer le topic (contrairement à IRC avec /mode -t)
  • il n'y a pas de message de kick côté Matrix, et les kicks sont vu comme étant exécuté par le bot représentant le bridge et non le vraiment auteur du kick (du a un problème de gestion des droits côté Matrix)
  • quand les gens parlent trop vite (typiquement quand un user interagit avec un bot qui répond quasi instantanément) les messages peuvent arriver dans le désordre côté Matrix (l'asynchrone c'est cool, mais ça a aussi ses limites…) : dans la pratique ça n'arrive que très peu de fois
  • les couleurs font un peu n'importe quoi (et vu que c'est spécifique au client côté IRC, c'est pas simple à gérer)

Le serveur officiel du projet (matrix.org) propose plusieurs bridges IRC, cependant il nous faudra installer notre propre bridge (et serveur) si l'ont veut bridger irc.iiens.net avec Matrix. C'est une appli nodejs qui s'installe en 2 commandes, la seule contrainte étant d'avoir une IP sur laquelle le serveur Matrix peut nous joindre (ça peut se faire sur le réseau local dans notre cas, ou sur un réseau nommé Docker dans la mise en place Docker).

Doc