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
- Un serveur exécutant Debian 12.
- Un utilisateur non-sudo avec des privilèges root.
- Le pare-feu simple (UFW) est activé et en cours d’exécution.
- Noms de domaine pleinement qualifiés (FQDN) pour Matrix, Element et Coturn pointant vers votre serveur. Nous utiliserons respectivement
matrix.example.com,element.example.cometcoturn.example.compour les trois services. - 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 -yCertains 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/. 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.

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

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.

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.

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.

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

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

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.

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.

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.

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.

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.
Recevez de nouveaux articles dans votre boîte de réception.
Aucun spam. Désabonnez-vous à tout moment.