Serveur de chat · 27 min read · Oct 27, 2025

Comment installer et créer un serveur de chat en utilisant Matrix Synapse et Element sur Rocky Linux 9

Matrix est une norme ouverte pour la communication décentralisée et chiffrée de bout en bout. C’est un ensemble de serveurs et de services qui communiquent entre eux en utilisant une API standardisée qui se synchronise en temps réel. Il utilise des serveurs domestiques pour stocker les informations de compte et l’historique des discussions. Si un serveur domestique tombe en panne, d’autres serveurs peuvent continuer la communication sans problème en raison de la nature de la décentralisation. Vous pouvez utiliser un serveur domestique Matrix hébergé par quelqu’un d’autre ou héberger le vôtre pour garder le contrôle sur vos données.

Dans ce tutoriel, vous apprendrez à installer et à créer un serveur de chat en utilisant Synapse, une implémentation de serveur domestique de Matrix. Element est un client web Matrix construit en utilisant le Matrix React SDK. Cela vous permettra d’offrir un chat Matrix sur le web. Vous pouvez également utiliser le serveur avec n’importe quel autre client Matrix. Nous installerons également le serveur Coturn pour activer les appels vocaux et vidéo. Le service Coturn est optionnel si vous n’êtes pas intéressé à l’utiliser.

Prérequis

  1. Un serveur exécutant Debian 12.
  2. Un utilisateur non-sudo avec des privilèges root.
  3. Le pare-feu simple (UFW) est activé et en cours d’exécution.
  4. Noms de domaine pleinement qualifiés (FQDN) pour Matrix, Element et Coturn pointant vers votre serveur. Nous utiliserons respectivement matrix.example.com, element.example.com et coturn.example.com pour les trois services.
  5. Assurez-vous que tout est à jour. $ sudo dnf update
  • Quelques paquets dont votre système a besoin. $ sudo dnf install wget curl nano unzip yum-utils policycoreutils-python-utils -y Certains de ces paquets peuvent déjà être installés sur votre système.

Étape 1 - Configurer le pare-feu

Avant d’installer des paquets, la première étape consiste à configurer le pare-feu pour ouvrir les ports pour HTTP, HTTPS et Synapse. Rocky Linux utilise le pare-feu Firewalld. Vérifiez l’état du pare-feu.

$ sudo firewall-cmd --state
running

Le pare-feu fonctionne avec différentes zones, et la zone publique est celle par défaut que nous utiliserons. Listez tous les services et ports actifs sur le pare-feu.

$ sudo firewall-cmd --zone=public --list-all

Il devrait afficher la sortie suivante.

public
  target: default
  icmp-block-inversion: no
  interfaces: enp1s0
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

Ouvrez les ports HTTP, HTTPS et Synapse dans le pare-feu.

$ sudo firewall-cmd --zone=public --add-port=8448/tcp
$ sudo firewall-cmd --zone=public --add-service=http
$ sudo firewall-cmd --zone=public --add-service=https

Vérifiez à nouveau l’état du pare-feu.

$ sudo firewall-cmd --zone=public --list-all

Vous devriez voir une sortie similaire.

public
  target: default
  icmp-block-inversion: no
  interfaces: enp1s0
  sources: 
  services: cockpit dhcpv6-client http https ssh
  ports: 8448/tcp
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

Rendez tous les changements permanents et rechargez le pare-feu pour activer les changements.

$ sudo firewall-cmd --runtime-to-permanent
$ sudo firewall-cmd --reload

Étape 2 - Installer et configurer PostgreSQL

Rocky Linux 9 est livré avec PostgreSQL 13 par défaut. Nous utiliserons PostgreSQL 16 de son dépôt officiel.

Installez le dépôt RPM de PostgreSQL.

$ sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm

Désactivez le module PostgreSQL intégré.

$ sudo dnf -qy module disable postgresql

Maintenant, vous pouvez installer PostgreSQL en utilisant la commande suivante.

$ sudo dnf install -y postgresql16-server postgresql16-contrib postgresql16-devel

sudo dnf install postgresql16-devel

export PATH=$PATH:/usr/pgsql-16/bin

Le paquet postgresql-contrib contient quelques utilitaires supplémentaires.

Vérifiez la version.

$ psql --version
psql (PostgreSQL) 16.1

Initialisez la base de données PostgreSQL.

$ sudo /usr/pgsql-16/bin/postgresql-16-setup initdb
Initializing database ... OK

Activez le service PostgreSQL.

$ sudo systemctl enable postgresql-16

Démarrez le service PostgreSQL.

$ sudo systemctl start postgresql-16

Vérifiez l’état du service PostgreSQL.

$ sudo systemctl status postgresql-16
? postgresql-16.service - Serveur de base de données PostgreSQL 16
     Loaded: loaded (/usr/lib/systemd/system/postgresql-16.service; enabled; preset: disabled)
     Active: active (running) since Tue 2024-01-30 11:55:26 UTC; 10s ago
       Docs: https://www.postgresql.org/docs/16/static/
    Process: 9610 ExecStartPre=/usr/pgsql-16/bin/postgresql-16-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
   Main PID: 9615 (postgres)
      Tasks: 7 (limit: 12225)
     Memory: 17.4M
        CPU: 98ms
     CGroup: /system.slice/postgresql-16.service
             ??9615 /usr/pgsql-16/bin/postgres -D /var/lib/pgsql/16/data/
             ??9616 "postgres: logger "
             ??9617 "postgres: checkpointer "
             ??9618 "postgres: background writer "
             ??9620 "postgres: walwriter "
             ??9621 "postgres: autovacuum launcher "
             ??9622 "postgres: logical replication launcher "

Jan 30 11:55:26 matrix.example.com systemd[1]: Starting PostgreSQL 16 database server...
Jan 30 11:55:26 matrix.example.com postgres[9615]: 2024-01-30 11:55:26.482 UTC [9615] LOG:  redirecting log output to logging collector process
Jan 30 11:55:26 matrix.example.com postgres[9615]: 2024-01-30 11:55:26.482 UTC [9615] HINT:  Future log output will appear in directory "log".
Jan 30 11:55:26 matrix.example.com systemd[1]: Started PostgreSQL 16 database server.

Vous pouvez voir que le service est activé et en cours d’exécution par défaut.

Connectez-vous au compte système postgres.

$ sudo -su postgres

Créez un nouvel utilisateur de base de données et une base de données pour PostgreSQL. Vous serez invité à entrer un mot de passe lors de la création de l’utilisateur.

$ createuser --pwprompt synapse
$ createdb --encoding=UTF8 --locale=C --template=template0 --owner=synapse synapsedb

Quittez le compte postgres.

$ exit

Étape 3 - Installer Matrix Synapse

Matrix Synapse n’a pas de paquet préconstruit pour les distributions basées sur CentOS comme Rocky Linux. Par conséquent, nous allons l’installer en tant que module Python depuis PyPI.

La première étape consiste à installer les prérequis nécessaires au fonctionnement de Synapse. Nous avons également besoin du dépôt EPEL qui inclut le paquet python3-virtualenv.

$ sudo dnf install epel-release
$ sudo dnf install --enablerepo=crb libtiff-devel libjpeg-devel libzip-devel \
                 freetype-devel libwebp-devel libxml2-devel libxslt-devel \
                 libpq-devel  python3-virtualenv libffi-devel openssl-devel \
                 python3-devel libicu-devel
$ sudo dnf groupinstall "Development Tools"
$ sudo dnf install postgresql16-devel

Créez un répertoire pour Synapse.

$ mkdir -p ~/synapse

Créez un environnement virtuel Python dans ledit répertoire.

$ virtualenv -p python3 ~/synapse/env

Activez l’environnement virtuel.

$ source ~/synapse/env/bin/activate

Assurez-vous que vous avez la dernière version de pip et setuptools.

(env) $ pip install --upgrade pip
(env) $ pip install --upgrade setuptools

Installez Matrix Synapse.

(env) $ pip install "matrix-synapse[postgres]"

Cela téléchargera Synapse depuis PyPI et l’installera, ainsi que les bibliothèques Python qu’il utilise dans un environnement virtuel sous le dossier ~/synapse/env. Il installera également la bibliothèque Python PostgreSQL requise pour que Synapse se connecte au serveur PostgreSQL. La commande ci-dessus est une combinaison des commandes pip install matrix-synapse et pip install psycopg2.

L’étape suivante consiste à générer un fichier de configuration avec quelques paramètres de base. Passez au répertoire Synapse.

(env) $ cd ~/synapse

Exécutez la commande suivante pour générer le fichier de configuration.

(env) $ python -m synapse.app.homeserver \
    --server-name matrix.example.com \
    --config-path homeserver.yaml \
    --generate-config \
    --report-stats=[yes|no]

La valeur de la variable --server-name fait partie de votre ID Matrix. Entrez votre nom de domaine Matrix comme valeur. Cela agira comme votre adresse de serveur domestique.

Vous pouvez choisir si vous souhaitez ou non envoyer des statistiques anonymisées concernant votre serveur domestique à Matrix via la variable --report-stats. Choisissez yes ou no selon votre choix.

Vous obtiendrez la sortie suivante.

Generating config file homeserver.yaml
Generating log config file /home/navjot/synapse/matrix.example.com.log.config which will log to /home/navjot/synapse/homeserver.log
Generating signing key file /home/navjot/synapse/matrix.example.com.signing.key
A config file has been generated in 'homeserver.yaml' for server name 'matrix.example.com'. Please review this file and customise it to your needs.

Vous pouvez modifier ces paramètres plus tard dans le fichier ~/synapse/homeserver.yaml ou /home//synapse/homeserver.yaml. Les clés générées par la commande ci-dessus permettront à votre serveur domestique de s’identifier auprès d’autres serveurs domestiques.

Il est temps de faire fonctionner le serveur Matrix. Assurez-vous d’être dans le répertoire Synapse et que l’environnement virtuel est actif.

Démarrez le serveur domestique.

(env) $ synctl start

Vous devriez voir une sortie similaire.

This server is configured to use 'matrix.org' as its trusted key server via the
'trusted_key_servers' config option. 'matrix.org' is a good choice for a key
server since it is long-lived, stable and trusted. However, some admins may
wish to use another server for this purpose.

To suppress this warning and continue using 'matrix.org', admins should set
'suppress_key_server_warning' to 'true' in homeserver.yaml.
--------------------------------------------------------------------------------
started synapse.app.homeserver(homeserver.yaml)

Pour arrêter le serveur, exécutez la commande suivante.

(env) $ synctl stop

Désactivez l’environnement virtuel.

(env) $ deactivate

Étape 4 - Installer Nginx

Pour l’environnement de production, il est recommandé d’exécuter le serveur Synapse en utilisant un proxy Nginx.

Rocky Linux 9 est livré avec une version plus ancienne de Nginx. Vous devez utiliser le dépôt officiel de Nginx pour installer la dernière version.

Créez et ouvrez le fichier /etc/yum.repos.d/nginx.repo pour l’édition.

$ sudo nano /etc/yum.repos.d/nginx.repo

Collez le code suivant dedans.

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

Une fois que vous avez terminé, enregistrez le fichier en appuyant sur Ctrl + X et en entrant Y lorsque vous y êtes invité.

Nous allons installer la version principale de Nginx, donc activez le paquet pour cela.

$ sudo dnf config-manager --enable nginx-mainline

Installez Nginx.

$ sudo dnf install nginx -y

Vérifiez l’installation.

$ nginx -v
nginx version: nginx/1.25.3

Activez et démarrez le service du serveur Nginx.

$ sudo systemctl enable nginx --now

Vérifiez l’état du service.

$ sudo systemctl status nginx
? nginx.service - nginx - serveur web haute performance
     Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: disabled)
     Active: active (running) since Tue 2024-01-30 12:50:34 UTC; 4s ago
       Docs: http://nginx.org/en/docs/
    Process: 10810 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
   Main PID: 10811 (nginx)
      Tasks: 3 (limit: 12225)
     Memory: 3.1M
        CPU: 24ms
     CGroup: /system.slice/nginx.service
             ??10811 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
             ??10812 "nginx: worker process"
             ??10813 "nginx: worker process"

Étape 5 - Installer SSL

Nous devons installer Certbot pour générer le certificat SSL. Nous utiliserons le gestionnaire de paquets Snapd pour cela. Comme Rocky Linux ne l’inclut pas, installez le gestionnaire Snapd. Il nécessite le dépôt EPEL (Extra Packages for Enterprise Linux) pour fonctionner. Mais comme nous l’avons déjà installé à l’étape 3, nous pouvons directement avancer.

Installez le paquet Snapd.

$ sudo dnf install snapd -y

Activez et démarrez le service Snap.

$ sudo systemctl enable snapd --now

Installez le paquet de base Snap, et assurez-vous que votre version de Snapd est à jour.

$ sudo snap install core
$ sudo snap refresh core

Créez les liens nécessaires pour que Snapd fonctionne.

$ sudo ln -s /var/lib/snapd/snap /snap
$ echo 'export PATH=$PATH:/var/lib/snapd/snap/bin' | sudo tee -a /etc/profile.d/snapd.sh

Installez Certbot.

$ sudo snap install --classic certbot

Utilisez la commande suivante pour vous assurer que la commande Certbot peut être exécutée en créant un lien symbolique vers le répertoire /usr/bin.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Vérifiez la version de Certbot.

$ certbot --version
certbot 2.8.0

Exécutez la commande suivante pour générer un certificat SSL.

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d matrix.example.com

La commande ci-dessus téléchargera un certificat dans le répertoire /etc/letsencrypt/live/matrix.example.com sur votre serveur.

Générez un certificat de groupe Diffie-Hellman.

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Vérifiez le service de planification de renouvellement de Certbot.

$ systemctl list-timers

Vous trouverez snap.certbot.renew.service comme l’un des services programmés pour s’exécuter.

NEXT                        LEFT         LAST                        PASSED      UNIT                         ACTIVATES                   ----------------------------------------------------------------------------------------------------------------------------------  
Tue 2024-01-30 14:37:50 UTC 29min left   Tue 2024-01-30 13:05:13 UTC 1h 3min ago dnf-makecache.timer          dnf-makecache.service
Tue 2024-01-30 15:13:00 UTC 1h 4min left -                           -           snap.certbot.renew.timer     snap.certbot.renew.service
Wed 2024-01-31 00:00:00 UTC 9h left      Tue 2024-01-30 06:35:44 UTC 7h ago      logrotate.timer              logrotate.service

Faites un essai à blanc du processus pour vérifier si le renouvellement SSL fonctionne correctement.

$ sudo certbot renew --dry-run

Si vous ne voyez pas d’erreurs, vous êtes prêt. Votre certificat se renouvellera automatiquement.

Étape 6 - Configurer SELinux

SELinux vous empêche d’exécuter un service système dont le binaire se trouve dans le répertoire personnel d’un utilisateur. Pour cette raison, si nous créons un fichier de service pour Synapse, il sera bloqué par SELinux. Pour contourner ce problème, nous devons exécuter la commande suivante pour permettre au binaire Python d’être exécuté en tant que service système.

$ sudo chcon -R -t bin_t /home/username/synapse/env/bin/python

Appliquez la politique pour permettre les connexions aux hôtes externes.

$ sudo setsebool -P httpd_can_network_connect 1

Appliquez la politique pour permettre à Nginx d’accéder à PostgreSQL.

$ sudo setsebool -P httpd_can_network_connect_db 1

Étape 7 - Créer un service Systemd pour Matrix

L’état du service Synapse ne se sauvegarde pas après un redémarrage, ce qui signifie que si vous redémarrez le serveur, vous devrez démarrer le serveur manuellement. Pour contourner ce problème, nous devons créer le fichier Systemd pour cela.

Avant de procéder, assurez-vous que le service Synapse est arrêté.

$ cd ~/synapse
$ source env/bin/activate
(env) $ synctl stop
(env) $ deactivate

Créez et ouvrez le fichier matrix-synapse.service dans le répertoire /etc/systemd/system/ pour l’édition.

$ sudo nano /etc/systemd/system/matrix-synapse.service

Collez le code suivant dedans. Remplacez la variable username par votre utilisateur système Linux sous lequel vous avez installé Synapse.

# Cela suppose que Synapse a été installé par un utilisateur nommé username.
# Cela suppose que Synapse a été installé dans un environnement virtuel dans
# le répertoire personnel de l'utilisateur : `/home/username/synapse/env`.

[Unit]
Description=Serveur domestique Synapse Matrix
After=postgresql-16.service

[Service]
Type=notify
NotifyAccess=main
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-abort

WorkingDirectory=/home/username/synapse
ExecStart=/home/username/synapse/env/bin/python -m synapse.app.homeserver --config-path=/home/username/synapse/homeserver.yaml
SyslogIdentifier=matrix-synapse

# ajustez le facteur de cache si nécessaire
# Environment=SYNAPSE_CACHE_FACTOR=2.0

[Install]
WantedBy=multi-user.target

Une fois terminé, enregistrez le fichier en appuyant sur Ctrl + X et en entrant Y lorsque vous y êtes invité.

Rechargez le démon de service.

$ sudo systemctl daemon-reload

Activez le service Matrix Synapse.

$ sudo systemctl enable matrix-synapse

Démarrez le service Matrix Synapse.

$ sudo systemctl start matrix-synapse

Vérifiez l’état du service.

$ sudo systemctl status matrix-synapse

Vous devriez voir la sortie suivante.

? matrix-synapse.service - Serveur domestique Synapse Matrix
     Loaded: loaded (/etc/systemd/system/matrix-synapse.service; enabled; preset: disabled)
     Active: active (running) since Tue 2024-01-30 14:20:20 UTC; 5s ago
   Main PID: 14687 (python)
      Tasks: 8 (limit: 12225)
     Memory: 77.6M
        CPU: 3.527s
     CGroup: /system.slice/matrix-synapse.service
             ??14687 /home/navjot/synapse/env/bin/python -m synapse.app.homeserver --config-path=/home/navjot/synapse/homeserver.yaml

Jan 30 14:20:16 matrix.example.com systemd[1]: Starting Synapse Matrix homeserver...
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: This server is configured to use 'matrix.org' as its trusted key server via the
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: 'trusted_key_servers' config option. 'matrix.org' is a good choice for a key
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: server since it is long-lived, stable and trusted. However, some admins may
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: wish to use another server for this purpose.
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: To suppress this warning and continue using 'matrix.org', admins should set
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: 'suppress_key_server_warning' to 'true' in homeserver.yaml.
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: --------------------------------------------------------------------------------
Jan 30 14:20:20 matrix.example.com systemd[1]: Started Synapse Matrix homeserver.

Étape 8 - Configurer Matrix Synapse

Avant de continuer, créez d’abord une clé de partage d’enregistrement secrète. La clé doit être sécurisée car elle permettra à quiconque d’enregistrer un nouvel utilisateur, même si l’enregistrement est désactivé.

$ echo "registration_shared_secret: '$(cat /dev/urandom | tr -cd '[:alnum:]' | fold -w 256 | head -n 1)'"
registration_shared_secret: '1y75ja0RUxvbWcS6SdZhakenukUwHHEjOXWC9Mu3FpO0QenOnpKRsc6NBZSxuzPcHYsOEuIQziwVjSZcP87dlWK4ZkIGYniurMqNsCYL4xg5xXs4bJDuTJH2CUXab4U9liv399lmkIZFaMpJCLxV9lVWB9mKHILYsjeLgGY5wAARv1SiK07bFsQOwKJGFqIvsUXmxymx5QCNDzTHw8R4ShqZ7elnnZrbdYk4r2f7qogERNHvQaRV7IEYUIOtMhVP'

Copiez la sortie de la ligne ci-dessus et enregistrez-la.

Vous pouvez configurer le serveur Matrix via le fichier /home/username/synapse/homeserver.yaml. Ouvrez-le pour l’édition.

$ nano ~/synapse/homeserver.yaml

Collez la sortie de la commande de clé d’enregistrement au bas du fichier.

Par défaut, Synapse est configuré pour utiliser la base de données SQLite. Nous devons le modifier pour ajouter les informations d’identification PostgreSQL.

Trouvez la section suivante dans le fichier et commentez-la comme indiqué.

#database:
#  name: sqlite3
#  args:
#    database: /home/navjot/synapse/homeserver.db

Ajoutez la section suivante en dessous. Remplacez le champ your-password par le mot de passe de l’utilisateur PostgreSQL que vous avez créé à l’étape 3. Remplacez localhost par l’adresse IP de votre serveur, si vous hébergez la base de données ailleurs.

database:
  name: psycopg2
  args:
    user: synapse
    password: 'your-password'
    database: synapsedb
    host: localhost
    cp_min: 5
    cp_max: 10

Par défaut, Synapse active les indicateurs de présence qui montrent si une personne est en ligne. Cela peut entraîner une utilisation élevée du CPU, vous pouvez donc le désactiver. Collez la ligne suivante au bas.

presence:
  enabled: false

Une fois terminé, enregistrez le fichier en appuyant sur Ctrl + X et en entrant Y lorsque vous y êtes invité.

Créez un nouvel utilisateur Matrix. Vous serez invité à entrer votre nom d’utilisateur et votre mot de passe. Comme c’est le premier utilisateur que nous créons, tapez yes lorsqu’on vous demande si vous souhaitez faire de l’utilisateur un administrateur. Vous devrez activer l’environnement virtuel pour créer l’utilisateur.

$ cd ~/synapse
$ source env/bin/activate
(env) $ register_new_matrix_user -c homeserver.yaml http://localhost:8008
New user localpart [navjot]: navjot
Password: 
Confirm password: 
Make admin [no]: yes
Sending registration request...
Success!
(env) $ deactivate

Vous pouvez voir que nous avons utilisé le port 8008 dans la commande ci-dessus. C’est parce que c’est le port par défaut sur lequel Matrix Synapse écoute.

Par défaut, l’enregistrement de nouveaux utilisateurs est désactivé, ce qui signifie que vous devez enregistrer chaque utilisateur manuellement comme ci-dessus. Si vous souhaitez ouvrir les enregistrements publics, vous pouvez le faire en modifiant le fichier homeserver.yaml.

Ouvrez-le à nouveau pour l’édition.

$ nano ~/synapse/homeserver.yaml

Collez la ligne suivante au bas.

enable_registration: true

Par défaut, Synapse ne permet pas les enregistrements sans vérification par e-mail. Pour activer la vérification par e-mail, collez les lignes suivantes.

registrations_require_3pid:
  - email

email:
  smtp_host: mail.example.com
  smtp_port: 587

  # Si le serveur de messagerie n'a pas d'authentification, sautez ces 2 lignes
  smtp_user: '[email protected]'
  smtp_pass: 'password'

  # Optionnel, exiger le chiffrement avec STARTTLS
  require_transport_security: true

  app_name: 'HowtoForge Example Chat'  # définit la valeur pour %(app)s dans notif_from et le sujet de l'e-mail
  notif_from: "%(app)s <[email protected]>"

Pour désactiver la vérification par e-mail, collez la ligne suivante à la place.

enable_registration_without_verification: true

Une fois terminé, enregistrez le fichier en appuyant sur Ctrl + X et en entrant Y lorsque vous y êtes invité.

Redémarrez Synapse pour appliquer la configuration.

$ sudo systemctl restart matrix-synapse

Étape 9 - Configurer Nginx

Ouvrez le fichier /etc/nginx/nginx.conf pour l’édition.

$ sudo nano /etc/nginx/nginx.conf

Ajoutez la ligne suivante avant la ligne include /etc/nginx/conf.d/*.conf;.

server_names_hash_bucket_size 64;

Enregistrez le fichier en appuyant sur Ctrl + X et en entrant Y lorsque vous y êtes invité.

Créez et ouvrez le fichier /etc/nginx/conf.d/synapse.conf pour l’édition.

$ sudo nano /etc/nginx/conf.d/synapse.conf

Collez le code suivant dedans.

# appliquer HTTPS
server {
    # Port client
    listen 80;
    listen [::]:80;
    server_name matrix.example.com;
    return 301 https://$host$request_uri;
}

server {
    server_name matrix.example.com;

    # Port client
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;

    # Port de fédération
    listen 8448 ssl default_server;
    listen [::]:8448 ssl default_server;

    access_log  /var/log/nginx/synapse.access.log;
    error_log   /var/log/nginx/synapse.error.log;

    # Configuration TLS
    ssl_certificate /etc/letsencrypt/live/matrix.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/matrix.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/matrix.example.com/chain.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;
    ssl_prefer_server_ciphers on;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;
    resolver 1.1.1.1 1.0.0.1 [2606:4700:4700::1111] [2606:4700:4700::1001] 8.8.8.8 8.8.4.4 [2001:4860:4860::8888] [2001:4860:4860::8844] valid=60s;
    resolver_timeout 2s;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;

    tcp_nopush on;
    gzip on;

    location ~ ^(/_matrix|/_synapse/client) {
            proxy_pass http://localhost:8008;
            proxy_http_version 1.1;

            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header Host $host;

            # Nginx par défaut n'autorise que les téléchargements de fichiers jusqu'à 1M en taille
            # Augmentez client_max_body_size pour correspondre à max_upload_size défini dans homeserver.yaml
            client_max_body_size 50M;
    }
}

Enregistrez le fichier en appuyant sur Ctrl + X et en entrant Y lorsque vous y êtes invité. La configuration ci-dessus fonctionne sur l’hypothèse que l’adresse IP des domaines example.com et matrix.example.com pointe vers le même serveur. S’ils ne le font pas, utilisez le fichier de configuration suivant pour le serveur example.com.

server {
    server_name example.com;

    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    # Configuration TLS
    ssl_certificate /etc/letsencrypt/live/matrix.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/matrix.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/matrix.example.com/chain.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;
    ssl_prefer_server_ciphers on;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;
    resolver 1.1.1.1 1.0.0.1 [2606:4700:4700::1111] [2606:4700:4700::1001] 8.8.8.8 8.8.4.4 [2001:4860:4860::8888] [2001:4860:4860::8844] valid=60s;
    resolver_timeout 2s;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;

    # Redirection
    location ~ ^(/_matrix|/_synapse/client) {
            return 301 "https://matrix.example.com$request_uri";
    }

    # Découverte automatique du serveur domestique client
    location /.well-known/matrix/client {
        default_type application/json;
        add_header Access-Control-Allow-Origin *;

        return 200 '{ "m.homeserver": { "base_url": "https://matrix.example.com" } }';
    }

    # Délégation de domaine
    location /.well-known/matrix/server {
        default_type application/json;
        add_header Access-Control-Allow-Origin *;

        return 200 '{ "m.server": "matrix.example.com" }';
    }
}

Vérifiez la syntaxe du fichier de configuration Nginx.

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Redémarrez le service Nginx.

$ sudo systemctl restart nginx

Étape 10 - Installer Coturn

Vous aurez besoin d’installer un serveur Traversal Using Relays around the NAT (TURN) pour activer les appels vocaux et vidéo. À cette fin, nous allons installer le paquet Coturn. Si vous n’avez pas besoin de cette fonctionnalité, vous pouvez sauter cette étape.

Installez Coturn.

$ sudo dnf install coturn

Ouvrez les ports TURN et UDP.

$ sudo firewall-cmd --zone=public --add-port=3478/{tcp,udp}
$ sudo firewall-cmd --zone=public --add-port=5349/{tcp,udp}
$ sudo firewall-cmd --zone=public --add-port=49152-65535/udp
$ sudo firewall-cmd --runtime-to-permanent
$ sudo firewall-cmd --reload

Générez un certificat SSL pour Turn ( coturn.example.com).

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d coturn.example.com

Générez un secret d’authentification pour Coturn.

$ echo "static-auth-secret=$(cat /dev/urandom | tr -cd '[:alnum:]' | fold -w 256 | head -n 1)"
static-auth-secret=u3ksgJ9X876sFMO00A8KabXwZvzVwCmV30wWvZ7DzGiepRwNRYSCTYzf2E8olNzdDHu7oO3XpT3l5bv5mVdhXEQ3pnoTWBquSVPFFBJtyD6y9gBxiMaD2TYTD2WohQLE9s7OKJVpkDeKTnZQnkmjrFadE3M9DRxPL1W5Lgdg6XLLKABgb5XGkutRgkJOV0JRH4sBYsot63fWq9mcGTm6nAMdIycvDVDOs7vhoeqRzcTbMF0wsfAHVJNhXpGGFDyZ

Ouvrez le fichier de configuration pour l’édition.

$ sudo nano /etc/coturn/turnserver.conf

Nous allons parcourir le fichier et activer les paramètres dont nous avons besoin. Tout d’abord, activez la méthode d’authentification en décommentant la ligne use-auth-secret.

# Soyez conscient que use-auth-secret remplace certaines parties de lt-cred-mech.
# La fonctionnalité use-auth-secret dépend en interne de lt-cred-mech, donc si vous définissez
# cette option, elle active automatiquement lt-cred-mech en interne
# comme si vous aviez activé les deux.
#
# Notez que vous ne pouvez utiliser qu'un seul mécanisme d'authentification à la fois ! C'est parce que,
# les deux mécanismes effectuent la validation du nom d'utilisateur et du mot de passe de différentes manières.
#
# Utilisez soit lt-cred-mech soit use-auth-secret dans la conf
# pour éviter toute confusion.
#
use-auth-secret

Ensuite, nous allons configurer la variable static-auth-secret avec la valeur que nous avons créée ci-dessus. Nous aurons également besoin de ce secret pour configurer Synapse plus tard.

# Valeur de secret d'authentification 'statique' (une chaîne) uniquement pour l'API REST TURN.
# Si non défini, alors le serveur turn
# essaiera d'utiliser la valeur 'dynamique' dans la table turn_secret
# dans la base de données utilisateur (si présente). La valeur stockée dans la base de données peut être changée à la volée
# par un programme séparé, donc c'est pourquoi ce mode est considéré comme 'dynamique'.
#
static-auth-secret=u3ksgJ9X876sFMO00A8KabXwZvzVwCmV30wWvZ7DzGiepRwNRYSCTYzf2E8olNzdDHu7oO3XpT3l5bv5mVdhXEQ3pnoTWBquSVPFFBJtyD6y9gBxiMaD2TYTD2WohQLE9s7OKJVpkDeKTnZQnkmjrFadE3M9DRxPL1W5Lgdg6XLLKABgb5XGkutRgkJOV0JRH4sBYsot63fWq9mcGTm6nAMdIycvDVDOs7vhoeqRzcTbMF0wsfAHVJNhXpGGFDyZ

La prochaine valeur que nous devons changer est le realm. Il fait référence au domaine que nous avons choisi pour Coturn.

# Le domaine par défaut à utiliser pour les utilisateurs lorsque aucune relation explicite
# origine/domaine n'est trouvée dans la base de données, ou si le serveur TURN
# n'utilise aucune base de données (juste les paramètres de ligne de commande
# et le fichier userdb). Doit être utilisé avec le mécanisme d'authentification à long terme
# ou avec l'API REST TURN.
#
# Note : Si le domaine par défaut n'est pas spécifié, alors le domaine tombe en retour au nom d'hôte.
#       Si la chaîne de nom de domaine est vide, ou définie sur '(None)', alors elle est initialisée comme une chaîne vide.
#
realm=coturn.example.com

Ensuite, définissez le quota de sessions et de sessions par utilisateur. Choisissez une valeur qui fonctionne pour votre serveur.

# Quota d'allocation par utilisateur.
# la valeur par défaut est 0 (aucun quota, nombre illimité de sessions par utilisateur).
# Cette option peut également être définie via la base de données, pour un domaine particulier.
#
user-quota=12

# Quota d'allocation total.
# la valeur par défaut est 0 (aucun quota).
# Cette option peut également être définie via la base de données, pour un domaine particulier.
#
total-quota=1200

Ensuite, nous devons désactiver TCP car VOIP utilise UDP.

# Décommentez si aucun point de relais TCP n'est autorisé.
# Par défaut, les points de relais TCP sont activés (comme dans RFC 6062).
#
no-tcp-relay

Nous devons également configurer l’emplacement des certificats que nous avons créés pour Coturn.

# Fichier de certificat.
# Utilisez un chemin absolu ou un chemin relatif au
# fichier de configuration.
# Utilisez le format de fichier PEM.
#
cert=/etc/letsencrypt/live/coturn.example.com/fullchain.pem

# Fichier de clé privée.
# Utilisez un chemin absolu ou un chemin relatif au
# fichier de configuration.
# Utilisez le format de fichier PEM.
#
pkey=/etc/letsencrypt/live/coturn.example.com/privkey.pem

Ensuite, nous devons désactiver le trafic vers les plages d’adresses IP privées et interdire les pairs sur les adresses multicast pour améliorer la sécurité.

# Drapeau qui peut être utilisé pour interdire les pairs sur des adresses de diffusion bien connues (224.0.0.0 et au-dessus, et FFXX:*).
# C'est une mesure de sécurité supplémentaire.
#
no-multicast-peers

...............

# Option pour autoriser ou interdire des adresses IP spécifiques ou des plages d'adresses IP.
# Si une adresse IP est spécifiée à la fois comme autorisée et interdite, alors l'adresse IP est
# considérée comme autorisée. Cela est utile lorsque vous souhaitez interdire une plage d'adresses IP,
# sauf pour quelques IP spécifiques dans cette plage.
#
# Cela peut être utilisé lorsque vous ne voulez pas que les utilisateurs du serveur TURN puissent accéder
# aux machines accessibles par le serveur TURN, mais qui seraient autrement inaccessibles depuis
# Internet (par exemple, lorsque le serveur TURN est derrière un NAT)
#
# Exemples :
# denied-peer-ip=83.166.64.0-83.166.95.255
# allowed-peer-ip=83.166.68.45

denied-peer-ip=0.0.0.0-0.255.255.255
denied-peer-ip=10.0.0.0-10.255.255.255
denied-peer-ip=100.64.0.0-100.127.255.255
denied-peer-ip=127.0.0.0-127.255.255.255
denied-peer-ip=169.254.0.0-169.254.255.255
denied-peer-ip=172.16.0.0-172.31.255.255
denied-peer-ip=192.0.0.0-192.0.0.255
denied-peer-ip=192.0.2.0-192.0.2.255
denied-peer-ip=192.88.99.0-192.88.99.255
denied-peer-ip=192.168.0.0-192.168.255.255
denied-peer-ip=198.18.0.0-198.19.255.255
denied-peer-ip=198.51.100.0-198.51.100.255
denied-peer-ip=203.0.113.0-203.0.113.255
denied-peer-ip=240.0.0.0-255.255.255.255
denied-peer-ip=::1
denied-peer-ip=64:ff9b::-64:ff9b::ffff:ffff
denied-peer-ip=::ffff:0.0.0.0-::ffff:255.255.255.255
denied-peer-ip=100::-100::ffff:ffff:ffff:ffff
denied-peer-ip=2001::-2001:1ff:ffff:ffff:ffff:ffff:ffff:ffff
denied-peer-ip=2002::-2002:ffff:ffff:ffff:ffff:ffff:ffff:ffff
denied-peer-ip=fc00::-fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
denied-peer-ip=fe80::-febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff

Une fois terminé, enregistrez le fichier en appuyant sur Ctrl + X et en entrant Y lorsque vous y êtes invité.

Redémarrez Coturn pour appliquer la configuration.

$ sudo systemctl restart coturn

Ouvrez la configuration Synapse ( homeserver.yaml) pour ajouter les paramètres Coturn.

$ nano ~/synapse/homeserver.yaml

Collez les lignes suivantes dedans. Remplacez la valeur turn_shared_secret par la valeur de static-auth-secret du fichier etc urn urnserver.conf.

turn_uris: [ "turn:coturn.example.com?transport=udp", "turn:coturn.example.com?transport=tcp" ]
turn_shared_secret: 'static-auth-secret'
turn_user_lifetime: 86400000
turn_allow_guests: True

# vim:ft=yaml

Enregistrez le fichier en appuyant sur Ctrl + X et en entrant Y lorsque vous y êtes invité.

Redémarrez Synapse pour appliquer les changements.

$ sudo systemctl restart matrix-synapse

Étape 11 - Accéder à Matrix

Vous pouvez accéder à Matrix Chat en utilisant le client web d’Element à l’adresse https://app.element.io. Cliquez sur le bouton Se connecter pour continuer.

Page de connexion Web d'Element

Cliquez sur le lien Modifier sous Serveur domestique. Entrez matrix.example.com comme votre serveur domestique.

Client Element Serveur domestique personnalisé

Si le client détecte correctement votre serveur domestique, la bordure et le texte deviendront verts, sinon ils seront affichés en rouge. Cliquez sur Continuer pour procéder.

Connexion au serveur domestique personnalisé d'Element

Entrez le nom d’utilisateur et le mot de passe que vous avez créés à l’étape 8 lors de la configuration de Synapse. Cliquez sur le bouton Se connecter pour vous connecter. Vous serez invité à créer une sauvegarde sécurisée et chiffrée.

Sauvegarde sécurisée Matrix

Sélectionnez l’option Entrer une phrase de sécurité pour créer une phrase de sécurité qui sera requise chaque fois que vous vous connectez. Cliquez sur Continuer pour procéder.

Phrase de sécurité d'Element

Entrez une phrase de sécurité et cliquez sur le bouton Continuer pour procéder. Vous serez invité à la confirmer à nouveau à l’écran suivant.

Confirmer la phrase de sécurité d'Element

Entrez à nouveau la phrase et cliquez sur le bouton Continuer pour procéder.

Popup de clé de sécurité d'Element

Vous recevrez un ensemble de clés de sécurité que vous pouvez utiliser si vous oubliez votre phrase de sécurité. Cliquez sur le bouton Télécharger pour les enregistrer.

Cliquez sur le bouton Continuer pour procéder.

Vérification du mot de passe d'Element

On vous demandera votre mot de passe de compte. Entrez le mot de passe et cliquez sur le bouton Continuer pour terminer la configuration de la sauvegarde chiffrée.

Tableau de bord du client Web d'Element

Nous avons créé une salle de chat de groupe nommée HowtoForge en utilisant le bouton Créer un chat de groupe sur la page d’accueil. Vous obtiendrez le popup suivant lorsque vous cliquerez sur le bouton.

Créer une salle privée dans Matrix

Vous pouvez restreindre les membres au domaine en développant le menu avancé et en sélectionnant l’option. Terminez la création de la salle en cliquant sur le bouton Créer la salle.

Étape 12 - Installer Element

Créez un répertoire pour Element.

$ sudo mkdir -p /var/www/html/element

Créez un nouveau fichier pour récupérer la dernière version d’Element.

$ sudo nano /var/www/html/element/update.sh

Ajoutez les lignes suivantes dedans.

#!/bin/sh
set -e

install_location="/var/www/html/element"
latest="
$(curl -I https://github.com/element-hq/element-web/releases/latest | awk -F '/' '/^location/ {print  substr($NF, 1, length($NF)-1)}')"

cd "$install_location"

[ ! -d "archive" ] && mkdir -p "archive"
[ -d "archive/element-${latest}" ] && rm -r "archive/element-${latest}"
[ -f "archive/element-${latest}.tar.gz" ] && rm "archive/element-${latest}.tar.gz"

wget "https://github.com/element-hq/element-web/releases/download/${latest}/element-${latest}.tar.gz" -P "archive"
tar xf "archive/element-${latest}.tar.gz" -C "archive"

[ -L "${install_location}/current" ] && rm "${install_location}/current"
ln -sf "${install_location}/archive/element-${latest}" "${install_location}/current"
ln -sf "${install_location}/config.json" "${install_location}/current/config.json"

Enregistrez le fichier en appuyant sur Ctrl + X et en entrant Y lorsque vous y êtes invité.

Rendez le fichier exécutable.

$ sudo chmod +x /var/www/html/element/update.sh

Exécutez le script pour télécharger Element.

$ sudo /var/www/html/element/update.sh

Étape 13 - Configurer Element

Copiez le même fichier de configuration d’Element.

$ sudo cp /var/www/html/element/current/config.sample.json /var/www/html/element/config.json

Ouvrez le fichier de configuration pour l’édition.

$ sudo nano /var/www/html/element/config.json

Trouvez les lignes suivantes.

"m.homeserver": {
    "base_url": "https://matrix-client.matrix.org",
    "server_name": "matrix.org"
},

Changez l’adresse du serveur domestique Matrix par défaut en votre serveur domestique et supprimez la variable server_name.

"m.homeserver": {
    "base_url": "https://matrix.example.com",
    "server_name": "example.com"
},

Si vous souhaitez utiliser votre nom au lieu d’Element dans le titre du site Web, changez le nom de la marque.

"brand": "HowtoForge Example Chat",

Définissez la variable disable_guests sur true pour interdire aux invités d’utiliser Element.

"disable_guests": true,

Enregistrez le fichier en appuyant sur Ctrl + X et en entrant Y lorsque vous y êtes invité.

Générez un certificat SSL pour le client Element.

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d element.example.com

Créez et ouvrez le fichier /etc/nginx/conf.d/element.conf pour l’édition.

$ sudo nano /etc/nginx/conf.d/element.conf

Collez les lignes suivantes dedans.

server {
    listen 80;
    listen [::]:80;
    server_name element.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;

    server_name element.example.com;

    root /var/www/html/element/current;
    index index.html;

    access_log  /var/log/nginx/element.access.log;
    error_log   /var/log/nginx/element.error.log;

    add_header Referrer-Policy "strict-origin" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Frame-Options "SAMEORIGIN" always;

    # Configuration TLS
    ssl_certificate /etc/letsencrypt/live/element.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/element.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/element.example.com/chain.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;
    ssl_prefer_server_ciphers on;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;
    resolver 1.1.1.1 1.0.0.1 [2606:4700:4700::1111] [2606:4700:4700::1001] 8.8.8.8 8.8.4.4 [2001:4860:4860::8888] [2001:4860:4860::8844] valid=60s;
    resolver_timeout 2s;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
}

Enregistrez le fichier en appuyant sur Ctrl + X et en entrant Y lorsque vous y êtes invité.

Vérifiez la syntaxe du fichier de configuration Nginx.

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Redémarrez le service Nginx.

$ sudo systemctl restart nginx

Nous devons configurer les paramètres SELinux avant d’accéder à Element. Exécutez les commandes suivantes pour permettre à Element de fonctionner.

$ sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/element(/.*)?"
$ sudo restorecon -Rv /var/www/html/element/

Vous pouvez accéder au client Element via l’URL https://element.example.com dans votre navigateur. Connectez-vous, et vous serez dirigé vers le tableau de bord de l’application. Vous serez invité à vérifier l’application avec le https://app.element.io d’abord, assurez-vous que vous êtes connecté à l’application Element originale et vous serez invité à faire correspondre les caractères emoji. Une fois que vous êtes vérifié, vous obtiendrez le tableau de bord suivant.

Tableau de bord Element auto-hébergé

Conclusion

Cela conclut notre tutoriel sur l’installation du serveur de chat Matrix Synapse avec Coturn et le client web Element en utilisant Nginx comme serveur proxy sur une machine Debian 12. Si vous avez des questions, postez-les dans les commentaires ci-dessous.

Share: X/Twitter LinkedIn

Recevez de nouveaux articles dans votre boîte de réception.

Aucun spam. Désabonnez-vous à tout moment.