Matrix


Matrix est un protocole de communication chiffré décentralisé prenant en charge la communication en temps réel, les commmunication vocales ainsi que la visioconférence.
De part son caractère décentralisé, n'importe quel individu est à même de créer et d'heberger sa propre instance Matrix.

Nous installerons ici Matrix sans installer de serveur web sur la machine, le conteneur ou la machine virtuelle sur laquelle sera hébergé le service. Le service Matrix sera en effet acessible via un Reverse Proxy.

server {


    server_name matrix.defis.info;


    listen [::]:443 ssl; # managed by Certbot

    listen 443 ssl; # managed by Certbot

    ssl_certificate /etc/letsencrypt/live/matrix.defis.info/fullchain.pem; # managed by Certbot

    ssl_certificate_key /etc/letsencrypt/live/matrix.defis.info/privkey.pem; # managed by Certbot

    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot

    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot


    location /_matrix {

        proxy_pass http://xxx.xxx.xxx.xxx:8008;

        proxy_set_header X-Forwarded-For $remote_addr;

        # Nginx by default only allows file uploads up to 1M in size

        # Increase client_max_body_size to match max_upload_size defined in homeserver.yaml

        client_max_body_size 10M;

    }


    location / {

        proxy_pass http://xxx.xxx.xxx.xxx:8008;

        proxy_set_header X-Forwarded-For $remote_addr;

    }


}

Installation d'un serveur Matrix

Matrix étant basé sur le lanage de programmation Python, nous allons installer les paquets python necessaire au déploiement du serveur à l'aide de ces trois commandes :

apt install build-essential python3-dev libffi-dev
apt install python3-pip python3-setuptools sqlite3


sqlite3 fait référence au gestionnaire de base de données SQlite, qui sera mobilisé par Matrix.

apt install libssl-dev virtualenv libjpeg-dev libxslt1-dev

La comande suivante va permettre d'installer wget, un logiciel permettant de récupérer du contennu http depuis un terminal, et apt-transport-https, permttant d'utiliser l'https avec le protocole apt.

apt install -y lsb-release wget apt-transport-https
Par défaut, les serveurs Matrix se contactent via l'URL du serveur synapse par le port 8448, "nom.de.domaine.du.serveur.synapse:8448" soit dans notre cas "matrix.defis.info:8448".
Dans ce cas, les identifiants de vos utilisateurs seraient de la forme "@utilisateur:nom.de.domaine.du.serveur.synapse", soit dans notre cas "@utilisateur:matrix.defis.info".
Or vous pourriez préférer que les identifiants soient de la forme "@utilisateur:nom_du_serveur" comme nous avons préféré que les notre soient de la forme "@utilisateur:defis.info".

Pour que cela fonctionne, l'URL https://nom_du_serveur/.well-known/matrix/server accessible sur les port 80 et 443 doit renvoyer une structure JSON contennant la clef m.server comme ceci:

{
    "m.server": "nom.de.domaine.du.serveur.synapse[:votre_numero_de_port]"
}

Dans notre example, cela signifie que l'URL https://www.defis.info/.well-known/matrix/server renvoie :

{
    "m.server": "matrix.defis.info:443"
}

Spécifier un port est optionnel. Si aucun port n'est spécifié, le port par défaut sera définit sur 8448. Si vous souhaitez, comme nous utiliser un reverse proxy nginx, vous devez spécifier le port 443.
Pour arriver à cette fin, vous pouvez créer un fichier json avec ce contenu que vous placez dans des dossiers de façon à ce que ce fichier soit accessible via cette adresse ou bien, vous pouvez le spécifier dans le fichier nginx qui gère votre nom_du_serveur (dans notre cas, "defis.info").
Les deux commandent suivante permettent de récupérer et de vérifier la clef GPG du débot Matrix, afin d'attester de son authenticiter avant de l'ajouter à ses propres dépôts :

wget -O /usr/share/keyrings/matrix-org-archive-keyring.gpg https://packages.matrix.org/debian/matrix-org-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/matrix-org-archive-keyring.gpg] https://packages.matrix.org/debian/ $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/matrix-org.list


Effectuons un update, avant d'installer Matrix sur notre machine :

apt update && apt upgrade
apt install matrix-synapse-py3


Vous vous retrouverez alors face à cette interface :

image Capture_du_20200720_105442.png (24.7kB)

Entrez alors votre nom de domaine, ici defis.info. Il vous sera ensuite demandé si vous shouaitez envoyer des statistiques anonymes aux développeurs de Matrix, répondez soit "Yes" ou "No".

Configuration du serveur

Modifiez le fichier de configuration du serveur Matrix via la commande suivante :

nano /etc/matrix-synapse/homeserver.yaml

Une fois dans l'interface de modification du fichier, décommenter public_baseurl (au début du fichier) et ajoutez-y l'URL menant à vôtre instance Matrix, ici "https://matrix.defis.info/" :

public_baseurl: https://matrix.defis.info/

Assurez vous que la partie "listeners" est correctement configurée avec l'adresse ip de votre machine sur laquelel est hébergé Matrix à la ligne bind_addresses: :
listeners:
  - port: 8008
    tls: false
    type: http
    x_forwarded: true
    bind_addresses: ['xxx.xxx.xxx.xxx']

Vous devez également décommenter les lignes registration_shared_secret: et enable_registration:. A la suite de la ligne registration_shared_secret:, écrivez la phrase de passe de votre choix.
Pour ce qui est de la ligne enable_registration:, elle peu prendre deux arguments, true et false. True permetera à des utilisateurs de s'incrire sur l'instance, et false désactivera les inscriptions. Pour la configuration de Défis, ce paramètre est réglé sur True.

registration_shared_secret: phrase de passe
enable_registration: true

Configuration du Reverse Proxy Nginx


La configuration qui vous est présentée ici est celle du serveur Matrix de Défis, installé au sein d'un conteneur qui se trouve derrière un Reverse Proxy qui se trouve dans un autre conteneur, tous les deux gérés par le système de virtualisation Proxmox.

Nous nous connectons au conteneur du Reverse Proxy Nginx.
Afin de créer le fichier de configuration du reverse proxy menant vers le serveur Matrix, nous nous plaçons dans le répertoire /etc/nginx/sites-available/ afin d'y trouver notre fichier modèle contenu modele_avant_certbot.conf :


server {
    location / {
        include proxy_params;
        proxy_pass http://XXX.XXX.XXX.XXX;
    }
    server_name container.defis.info;
    listen [::]:80;
    listen 80;
}

Nous copions et renomons ce fichier de configuration qui va servir de base à la construction du fichier de configuration du service :

cp modele_avant_certbot.conf matrix.defis.info.conf

Puis nous créons un lien symbolique vers le répertoire /etc/nginx/sites-enabled/ :

ln -s /etc/nginx/sites-available/matrix.defis.info.conf /etc/nginx/sites-enabled/matrix.defis.info.conf'

Nous testons la validité de la syntaxe du fichier de configuration grâce à la commande suivante :

nginx -t

Si la commande renvoie quelque chose de similaire, notre fichier de configuration est valide :

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Nous redémarrons nginx afin que les modifications soient prisent prises en compte :

service nginx restart

Afin de sécuriser les connexion entre l'utilisateur et le serveur Defis, nous utilisons Certbot afin de générer un ceritficat TLS, le sucesseur du SSL :

certbot --nginx -d matrix.defis.info

À la fin de cette commande, il est demandé si nous souhaitons forcer la redirection vers le protocole TLS. Nous choisissons de forcer la redirection (l'option numéro 2).

Voici alors le contenu du fichier de configuration matrix.defis.info.conf après l'execution de certbot :

server {
    if ($host = matrix.defis.info) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    server_name matrix.defis.info;
    
    listen [::]:80;
    listen 80;
    return 404; # managed by Certbot
}

server {
    server_name matrix.defis.info;

    listen [::]:443 ssl; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/matrix.defis.info/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/matrix.defis.info/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
    
    location  / {
        include proxy_params;
        proxy_pass http://XXX.XXX.XXX.XXX;
    }
    
}


Cette procédure est la même pour l'installation de presque tous nos services sur notre infrastructure.


Nous modifions ce fichier de configuration à l'aide de la commande suivante :

nano matrix.defis.info.conf

afin d'obtenir le fichier suivant :


proxy_cache_path /tmp/matrix-media-cache levels=1:2 keys_zone=matrix_media_cache:10m max_size=10g
                 inactive=720m use_temp_path=off;

server {
     if ($host = matrix.defis.info) {
         return 301 https://$host$request_uri;
     } # managed by Certbot

     server_name    matrix.defis.info;

     listen         80;
     listen         [::]:80;
     return 404; # managed by Certbot

     # location ~ /\.well-known/acme-challenge {
     #     root /var/lib/letsencrypt/;
     # }
     #location / {
     #  return         301 https://matrix.defis.info;
     #}
}

ssl_session_cache shared:ssl_session_cache:10m;

server {
     server_name matrix.defis.info;

     listen 443 ssl http2;
     listen [::]:443 ssl http2;
     ssl_session_timeout 5m;

     ssl_certificate /etc/letsencrypt/live/matrix.defis.info/fullchain.pem; # managed by Certbot
     ssl_certificate_key /etc/letsencrypt/live/matrix.defis.info/privkey.pem; # managed by Certbot
#     include /etc/letsencrypt/options-ssl-nginx.conf;
     ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

     ssl_protocols TLSv1.2;
     # ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
  ssl_ciphers "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
     ssl_prefer_server_ciphers on;
     ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
     ssl_stapling on;
     ssl_stapling_verify on;

     gzip_vary on;
     gzip_proxied any;
     gzip_comp_level 6;
     gzip_buffers 16 8k;
     gzip_http_version 1.1;
     gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript application/activity+json application/atom+xml;

     client_max_body_size 16m;

     location / {
         proxy_http_version 1.1;
         proxy_set_header Upgrade $http_upgrade;
         proxy_set_header Connection "upgrade";
         proxy_set_header Host $http_host;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

         proxy_pass http://xxx.xxx.xxx.xxx:8008;

         client_max_body_size 16m;
     }

     location ~ ^/(media|proxy) {
         proxy_cache        matrix_media_cache;
         slice              1m;
         proxy_cache_key    $host$uri$is_args$args$slice_range;
         proxy_set_header   Range $slice_range;
         proxy_http_version 1.1;
         proxy_cache_valid  200 206 301 304 1h;
         proxy_cache_lock   on;
         proxy_ignore_client_abort on;
         proxy_buffering    on;
         chunked_transfer_encoding on;
         proxy_pass         http://xxx.xxx.xxx.xxx:8008;
     }
}

Nous vérifions la syntaxe du fichier de configuration :

nginx -t

Si la commande renvoie quelque chose de similaire, notre fichier de configuration est valide :

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful


Redémarrons le Reverse Proxy Nginx afin que les modifications soient prises en compte.

service nginx restart

Si tout a fonctionné, vous devriez voir apparaitre cette interface lorsque vous entrez cette URL, https://nom.de.domaine.du.serveur.synapse/_matrix/static/ dans notre cas https://matrix.defis.info/_matrix/static/ :

image Capture_du_20200720_114240.png (20.4kB)
Il est désirable que votre serveur Matrix aie la capacité d'envoyer des mails. La configuration suivante vous permettera d'envoyer des courriers électroniques de réinitialisation de mot de passe, d'envoyer des mails de vérifications lorsqu'une adresse électronique est ajoutée au compte d'un utilisateur, et d'envoyer des notifications mail aux utilisateurs lorsqu'ils reçoivent de nouveaux messages.

Pour ce faire, modifiez le fichier de configuration Matrix comme ceci :

nano /etc/matrix-synapse/homeserver.yaml

Une fois dans l'interface d'édition du fichier, modifier la section intitulée email, et assurez vous que les champs smtp_host, smtp_port et notif_from sont remplis au minimum. Vous devrez peut-être aussi définir le champ smtp_user, smtp_pass et require_transport_security.

Si le courrier électronique n'est pas configuré, les fonctions de réinitialisation du mot de passe, d'inscription de nouveaux utilisateurs et de notifications par courrier électronique seront désactivées.
Afin d'utiliser les fonctionalités de VOIP avec un client tel qu'Element ou Fluffychat, vous pouvez utiliser le relais Turn implémenté chez matrix.org.
Un serveur coturn sera prochainement implémenté au sein de l'association défis, permettant de passer des appels VOIP via les serveurs de la structure. Si vous shouaitez en savoir plus, vous pouvez cliquer ici, ici ou ici.

Démarage de l'instance

Enfin, pour redémarrer votre instance Matrix, il vous suffit de relancer votre serveur grâce à cette commande :

service matrix-synapse restart

Vérifions si le service est bien actif en lançant la commande :

service matrix-synapse status

Il est possible aussi de vérifiez si le service est bel et bien fonctionnel en tapant dans votre barre d'URL, "https://nom.de.domaine.du.serveur.synapse/_matrix/static/" dans notre cas "https://matrix.defis.info/_matrix/static". Si tout fonctionne, vous devriez voir apparaitre sur cette page :

image Capture_du_20200720_114240.png (20.4kB)

Enfin, il est important de vérifier que le service est fédéré avec les autres instances matrix. Pour cela, il suffit de tester son nom_de_serveur, dans notre cas, "defis.info" ici. Si tout fonctionne, vous devriez voir apparaitre sur cette page :

image Capture_du_20200827_093736.png (43.0kB)

Ci c'est bien le cas, félicitations, votre serveur Matrix est opérationnel ! Il ne vous reste plus qu'à vous y connecter avec votre client de communication préféré (element ou fluffychat par exemple).