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.
Si un compte
matrix
du serveur defis.info
est connecté à un salon matrix.org
avec plusieurs milliers d'utilisateur, ceci ralentit très fortement les performances du serveur defis.info
voire même empêche son bon fonctionnement. Il serait possible de contourner ce souci:- soit en demandant au compte de se désincrire des salons en questions
- soit en s'inspirant de https://github.com/matrix-org/synapse/issues/14492
Configuration Reverse Proxy
server { server_name matrix.defis.info; listen [::]:443 ssl; # managed by Certbot listen 443 ssl; # managed by Certbot # For the federation port listen 8448 ssl http2 default_server; listen [::]:8448 ssl http2 default_server; 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|\/_synapse\/client) { proxy_pass http://xxx.xxx.xxx.xxx:8008; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $host; client_max_body_size 100M; } location /.well-known/matrix/client { return 200 '{"m.homeserver": {"base_url": "https://matrix.defis.info"},"im.vector.riot.jitsi": {"preferredDomain": "videochat.defis.info"}}'; default_type application/json; add_header Access-Control-Allow-Origin *; } }
Installation d'un serveur Matrix
Installation des paquets
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 :
sqlite3 fait référence au gestionnaire de base de données SQlite, qui sera mobilisé par Matrix.
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 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
Délégation .well-known
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
Dans notre example, cela signifie que l'URL
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").
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.
Déploiement de Matrix
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 :
Effectuons un update, avant d'installer Matrix sur notre machine :
Vous vous retrouverez alors face à cette interface :
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".
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 :
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
Configuration de base
Modifiez le fichier de configuration du serveur Matrix via la commande suivante :
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/" :
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
Vous devez également décommenter les lignes
Pour ce qui est de la ligne
ATTENTION : en cas d'ajout du paramètre
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
ATTENTION : en cas d'ajout du paramètre
ressources
pour un port, comme l'exemple ci-ssous, NE SURTOUT PAS METTRE DE LIGNE VIDE- port: 8008 tlm: false type: http x_forwarded: true bind_addresses; ['...','...'] resources: - names: client; federation compresse: false
Configuration Nginx
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
:Fichier modèle du reverse proxy
server { location / { include proxy_params; proxy_pass http://XXX.XXX.XXX.XXX; } server_name container.defis.info; listen [::]:80; listen 80; }
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
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 :Certbot et Let's encrypt
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 :
Fichier de configuration Reverse Proxy Nginx
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; } }
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/ :
Configuration Mail
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 :
Une fois dans l'interface d'édition du fichier, modifier la section intitulée
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.
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.
Configuration VOIP
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.
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 :
Vérifions si le service est bien actif en lançant la commande :
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 :
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 :
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).
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 :
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 :
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).