blog-image

Installer un serveur Synapse - Matrix/ Client Riot.im - Messagerie instantanée décentralisée - Arm64 - Rock64

  • dHENRY
  • 23/04/2019
  • (Durée de lecture : 23 mn)

Update 20/03/2020 Pour activer la VoIP

Update 05/11/2019 J’utilise ce service sur des unités de production (Rock64/Raspberry PI) depuis plusieurs mois maintenant. Je dispose d’un serveur Rock64 pour Matrix et un serveur Rock64 pour le SGBDR Postgres. Mon instance est fédérée à une autre instance qui est hébergé sur un seul Rock64 (Matrix-Posgresql). Aucun défaut n’a été constaté, nous sommes une dizaine à l’utiliser quotidiennement. Vous trouverez ici quelques données de télémétrie

Update 23/05/2019 - Exposez votre service Matrix-Synapse sur internet, dans le cadre d’un auto-hébergement. Je vous renvoi à ce billet : https://www.mytinydc.com/index.php/2019/05/23/nextcloud-exposez-votre-instance-sur-internet/ dont le contenu est facilement adaptable à ce service.

Update 18/05/2019 - La compilation de Synapse-Matrix fonctionne sur un Raspberry PI3 armhf : la procédure est identique à celle du Rock64 (temps de compilation > 20 minutes). Cette opération a été réalisée dans le cadre d’un test de répartition de charge avec HAPROXY. Ces tests ont révélé qu’il est impossible d’utiliser deux serveurs simultanément pour une même base de données, attention ceci à endommagé l’intégrité de la base, certains salons sont devenus rapidement inaccessibles.


Le service Matrix/Riot.im (https://matrix.org) est un service de messagerie instantanée, tel que Slack, Whatsapp, Messenger, Hangout, mais entièrement opensource et décentralisé. Vous en avez certainement entendu parler, puisqu’il s’agit de la messagerie choisie par le gouvernement Français, en vue de remplacer Whatsapp et qui a été “hackée” dès son lancement (http://www.leparisien.fr/high-tech/tchap-la-messagerie-chiffree-du-gouvernement-deja-victime-d-une-faille-de-securite-18-04-2019-8056314.php). Codé en Python, la solution est très rapide et peut être installée sur un rock64 (plateforme arm64), voir un Raspberry mais je ne l’ai pas testé. Les concepteurs préconisent 1 Go de RAM pour une utilisation confortable. Ce post est donc relatif à l’installation du service Matrix sur une plateforme arm64 (Rock64).

Cette vidéo montre le fonctionnement et l’utilisation de l’ensemble Matrix/Riot.im : https://youtu.be/TUgQ7Qh754

Topologie proposée

La topologie que je propose est celle que j’utilise, la messagerie est très véloce (10 utilisateurs simultanés et fédéré à deux autres domaines), la charge de l’ensemble est minime, accessible du monde entier 24/7.
Mon Datacenter est composé de 6 unités. La consommation électrique instantanée de l’ensemble, comprenant un ventilateur de 80mm, est de 25 watts.
L’ensemble fonctionne dans un environnement assez rude, 33 degrés Celsius pouvant dépasser 38 degrés, et 80% d’humidité, sans climatiseur, pour le “proof of concept”, depuis 18 mois sans interruptions de service.
Activiste pour la décentralisation de l’internet, cette installation prouve aussi que l’on peut se passer de WhatsApp, Hangout, Messenger et autres messageries détenues par les grands ténors de l’internet.
Et entièrement chiffré de bout en bout dont vous seuls (comprenant vos interlocuteurs), détenez les clés de chiffrage, et l’intégralité du stockage des données.

La topologie présentée ici, met en œuvre 3 unités (serveurs) :

  • Serveur Haproxy
    • Adresse IP : 192.168.1.10
    • Raspberry PI3 ou Rock64
  • Serveur Postgresql 9.6 :
    • Adresse IP : 192.168.1.11
    • Raspberry PI3 ou Rock64
  • Serveur Matrix :
    • Adresse IP : 192.168.1.12
    • Rock64 (arm64) dans cette topologie
  • L’installation de l’application web Riot-web est optionnelle, puisque les clients “mobile et Desktop” n’ont pas besoin de support HTML. Si vous décidez d’installer Riot-web, c’est que vous souhaitez accéder à votre messagerie au travers d’un navigateur web.

Installation du service Postgresql

Rien de bien compliqué, j’utiliserai le compte “synapse", mot de passe “synapse” (je vous conseille un mot de passe plus robuste), pour accéder à la base de données “synapse". Connecté root au serveur, tapez les instructions suivantes :

Installation du service

apt install postgresql-9.6  
su - postgres  
#Création de l'utilisateur synapse et de la base synapse  
createuser synapse  
psql  
ALTER USER synapse WITH ENCRYPTED password 'synapse';  
sys:> # 1 seule ligne  
CREATE DATABASE synapse ENCODING 'UTF8' LC_COLLATE='C' LC_CTYPE='C' template=template0 OWNER synapse;  
# 1 seule ligne  
\q  
exit

Paramétrage de l’adresse d'écoute Postgreql

Si vous hébergez le service Postgresql sur le même serveur utilisé pour héberger le service Matrix-Synapse, passez cette étape.
Par défaut Postgresql écoute sur l’adresse : localhost:5432. Si vous souhaitez exposer ce service sur votre réseau vous allez devoir modifier cette configuration. Si votre serveur dispose de l’adresse IP : 192.168.1.11

 vi /etc/postgresql/9.6/main/postgresql.conf  

Chercher la ligne : listen_addresses = ‘localhost’ et commentez cette ligne :

#listen_addresses = 'localhost'  

Ajoutez (adaptez à votre configuration)

listen_addresses = '192.168.1.11'  

Enregistrer et quitter vi : ESC : wq

Redémarrer Postgresql

 systemctl restart postgresql  

Paramétrage de l’accès au service postgresql

Vous utilisez deux serveurs distinct - Matrix et Serveur postgresql - Accès réseaux

Le paramétrage des accès au service postgresql, se fait au travers de paramètres situés dans le fichier /etc/postgresql/9.6/main/pg_hba.conf

vi /etc/postgresql/9.6/main/pg_hba.conf  

Ajouter à la fin du fichier

host    synapse           synapse             192.168.1.12/32            md5  

(*) 192.168.1.12 est l’adresse IP de l’unité qui hébergera le service Matrix/Synapse - adaptez selon votre configuration

Vous utilisez un seul et même serveur pour les deux services - Matrix et Serveur postgresql - Accès local

Juste après cette ligne

local   all             postgres                                peer  

Ajoutez cette ligne

local   synapse         synapse                                 md5

Recharger la configuration Postgresql

systemctl reload postgresql

Schéma de la base de données postgresql

Le service Matrix se charge d’importer le schéma de la base de données.

HAPROXY et Chiffrage SSL

Si vous ne savez pas à quoi correspond l’application HAPROXY dans votre architecture, passez ce chapitre.
Vous remarquerez que les accès HAPROXY au serveur finaux (Matrix et Apache2) sont configurés pour le protocole “http” et non “https”, alors que les url d’accès sont de type “https”. Dans ma topologie, c’est le serveur HAPROXY qui fait le support https, la communication entre le serveur HAPROXY et les serveurs finaux restent “en clair”, puisque dans mon cas la zone est “sûre”.
Ceci est fait dans un soucis d’optimisation, essayer toujours de chiffre une seule fois sur la chaîne de communication, dans la mesure du possible. Ceci évite les charges serveurs inutiles et peut avoir un impact non négligeable sur les coûts d’utilisation de ressources Cloud. Le chiffrage n’est pas une opération anodine pour un micro-processeur.

Installation et paramétrage du service HAPROXY

Si vous ne savez pas à quoi correspond l’application HAPROXY dans votre architecture, passez ce chapitre.
Je ne rentre pas dans les détails concernant ce service, la documentation est très riche sur internet, le paramétrage qui suit correspond à un service de reverse proxy (Layer 7), pour le service Matrix, et l’application web Riot.im (Optionnel).

Installation de HAPROXY

apt install haproxy  

Ajouter le reverse proxy pour le service matrix et riot, vous devez au préalable disposer des nom de domaines relatifs a ces services.
Dans cet exemple j’ai choisi : matrix.mondomaine.com et riot.mondomain.com et vous devrez disposer des certificats SSL correspondant, au format HAPROXY (pem)

vi /etc/haproxy/haproxy.cfg  

et ajouter ce contenu en l’adaptant à votre configuration :

frontend 192.168.1.10:443https  
   acl matrix.mondomaine.comssl  hdr(host) -i matrix.mondomaine.com  
   acl riot.mondomaine.comssl hdr(host) -i riot.mondomaine.com  
   use_backend matrix.mondomaine.comssl if matrix.mondomaine.comssl  
   use_backend riot.mondomaine.comssl if riot.mondomaine.comssl  
  backend matrix.mondomaine.comssl  
        mode http  
        enabled  
        balance roundrobin  
        server matrix 192.168.1.12:8008 check weight 10 maxconn 500  
   backend riot.mondomaine.comssl  
       mode http  
      enabled  
     balance roundrobin  
     server riot 192.168.1.12:80 check weight 10 maxconn 500

Installation du service Synapse/Matrix

Compilation du projet

La compilation du projet se déroule comme indiqué dans la documentation officielle

Préparation de l’environnement

Installer les paquets nécessaires :

apt -y install build-essential make python3 python3-dev python3-virtualenv python3-pip python3-setuptools libffi-dev libpq-dev postgresql-server-dev-9.6 python3-cffi zlib1g-dev libxml2-dev libxml2 libxslt1-dev libssl-dev libjpeg-dev python3-lxml virtualenv
mkdir -p /opt/synapse
virtualenv -p python3 /opt/synapse/env
cd /opt/synapse
source /opt/synapse/env/bin/activate
pip install --upgrade pip
pip install --upgrade setuptools
pip install matrix-synapse[all]

Résultat attendu :

Collecting matrix-synapse[all]
[...]
Successfully installed matrix-synapse-0.99.3.2

Génération du fichier de configuration pour synapse-matrix

Cette commande va créer le fichier : /opt/synapse/homeserver._yaml

python3 -m synapse.app.homeserver --server-name matrix.mondomaine.com --config-path homeserver.yaml --generate-config --report-stats=no

deactivate

Configuration du service

Tout les paramétrage Matrix s’opère dans le fichier /opt/synapse/homeserver.yaml

Attention la syntaxe YAML ne supporte pas les tabulations

vi /opt/synapse/homeserver.yaml  

Adapter ces paramètres aux vôtres :

[..]
server_name: "matrix.mondomaine.com"
[..]
#Paramètres d'écoute IP :
listeners:
- port: 8008
    tls: false
    # Remplacez l'adresse IP 192.168.1.12 par celle du serveur utilisé pour exécuter Matrix-Synapse  
    bind_addresses: ['192.168.1.12']
    # Ou bien pour toutes les interfaces : bind_addresses: ['0.0.0.0']
    type: http
    x_forwarded: true
    resources:
       - names: [client, federation]
         compress: false
#Paramètres base de données :
[..]
##Commenter la partie sqlite3 :
#The database engine name
#name: "sqlite3"
#Arguments to pass to the engine
#args:
#Path to the database
#database: "/opt/synapse/homeserver.db"
# Et ajouter :
name: psycopg2
args:
  user: synapse
  password: synapse
  database: synapse
  # Remplacer l'adresse IP (192.168.1.11) par l'adresse IP utilisée par le serveur de bases de données Postgresql.
  # Si les services Posgresql et Matrix-Synapse sont sur le même serveur indiquez : localhost en tant qu'adresse IP
  host: 192.168.1.11
  # Par défaut Postgresql est paramétré pour écouter sur le port 5432, si vous avez changé ce paramètre indiquez le port réellement utilisé
  port: 5432
  cp_min: 5
  cp_max: 10

Serveur d’identité (optionnel)

L’association d’un compte à un email est optionnel dans Matrix. Si vous oubliez votre mot de passe, vous aurez besoin de vous connecter à un serveur d’identité ou bien modifier directement dans la base de données. Par défaut l’application Riot-im définit le serveur de l’organisation Matrix.org : https://vector.im mais pour l’avoir essayer, ce service ne fonctionne pas, préférez : https://matrix.org
Vous pouvez aussi installer votre propre serveur d’identité (non couvert dans cette documentation).
Ajouter les lignes ou décommentez les lignes existantes :

default_identity_server: https://matrix.org  
trusted_third_party_id_servers:  
      - matrix.org

Sonde Prometheus - Affichage Grafana (optionnel)

Si vous disposez d’un service de monitoring Prometheus et que vous souhaitez activer la collecte des “metrics”, vous devrez ajouter un listener :

listeners:  
  - port: 9092  
    type: metrics  
    bind_addresses: ['0.0.0.0']
#et activer les "metrics"  
enable_metrics: true  

Paramétrer ensuite votre service Prometheus. Il existe un dashboard chez Grafana (ID 10046)

Paramétrage systemd

addgroup synapse
adduser --system --home /opt/synapse/ --no-create-home --disabled-password  --shell /bin/nologin --ingroup synapse synapse

Créer le fichier systemd

vi /etc/systemd/system/matrix-synapse.service

Et ajouter ce contenu

[Unit]  
Description=Matrix Synapse service  
After=network.target

[Service]  
Type=forking  
WorkingDirectory=/opt/synapse/  
ExecStart=/opt/synapse/env/bin/synctl start  
ExecStop=/opt/synapse/env/bin/synctl stop  
ExecReload=/opt/synapse/env/bin/synctl restart  
User=synapse  
Group=synapse  
Restart=always  
StandardOutput=syslog  
StandardError=syslog  
SyslogIdentifier=synapse

[Install]  
WantedBy=multi-user.target

Activation du service au démarrage du serveur

 systemctl enable matrix-synapse

Répertoire de stockage des médias et autorisations

Le fichier de configuration généré, propose automatiquement le stockage des médias (photo, fichiers,etc..) envoyés sur la messagerie, dans les répertoires “/opt/synapse/media_store” et “/opt/synapse/uploads”. Ces répertoires n’existent pas. Créer ces répertoires :

mkdir /opt/synapse/media_store /opt/synapse/uploads
#Attribuer les autorisations nécessaires au compte/groupe qui exécute le service (voir le fichier systemd créé ci avant)
chmod 770 /opt/synapse/media_store /opt/synapse/uploads
# Permettre à matrix d'écrire ses logs dans /opt/synapse
chmod 755 /opt/synapse
chown synapse:synapse /opt/synapse /opt/synapse/media_store /opt/synapse/uploads

Firewalls

  • serveur HAPROXY
    • OUTPUT : TCP/8008 + Règle INPUT Retour (STATE ESTABLISHED, RELATED)
    • OUTPUT : TCP/80 (si utilisation service web Riot-web) + Règle INPUT Retour (STATE ESTABLISHED, RELATED)
    • INPUT : TCP/443 + Règle OUTPUT Retour (STATE ESTABLISHED, RELATED)
  • serveur Postgresql
    • INPUT : TCP/5432 + Règle OUTPUT Retour (STATE ESTABLISHED, RELATED)
  • serveur Matrix
    • INPUT : TCP/80 (si utilisation service web Riot-web) + Règle OUTPUT Retour (STATE ESTABLISHED, RELATED)
    • INPUT: TCP/8008 + Règle OUTPUT Retour (STATE ESTABLISHED, RELATED)

Démarrage du service

#activation de la lecture du log en continu  
tail -f /var/log/syslog &  
#Démarrage du service Matrix  
systemctl start matrix-synapse  

L’affichage du log indique :

Apr 24 19:14:15 localhost systemd[1]: Starting Matrix Synapse service…  
Apr 24 19:14:24 localhost synapse[3877]: 2019-04-24 19:14:24,693 - root - 211 - WARNING - None - _ STARTING SE  
RVER _  
Apr 24 19:14:24 localhost synapse[3877]: 2019-04-24 19:14:24,773 - root - 214 - WARNING - None - Server /opt/synap  
se/env/lib/python3.5/site-packages/synapse/app/homeserver.py version 0.99.3  
Apr 24 19:14:24 localhost synapse[3877]: 2019-04-24 19:14:24,774 - root - 216 - INFO - None - Server hostname: mat  
rix.mondomaine.com  
Apr 24 19:14:24 localhost synapse[3877]: 2019-04-24 19:14:24,779 - twisted - 242 - INFO - None - Redirected stdout  
/stderr to logs  
Apr 24 19:14:24 localhost synapse[3877]: 2019-04-24 19:14:24,937 - synapse.app.homeserver - 358 - INFO - None - Pr  
eparing database: psycopg2…  
Apr 24 19:14:25 localhost synapse[3877]: 2019-04-24 19:14:25,146 - synapse.storage.prepare_database - 223 - INFO -  
 None - Upgrading schema to v53  
Apr 24 19:14:25 localhost synapse[3877]: 2019-04-24 19:14:25,167 - synapse.app.homeserver - 376 - INFO - None - Da  
tabase prepared in psycopg2.  
Apr 24 19:14:25 localhost synapse[3877]: 2019-04-24 19:14:25,168 - synapse.server - 222 - INFO - None - Setting up  
.  
Apr 24 19:14:25 localhost synapse[3877]: 2019-04-24 19:14:25,348 - synapse.storage.event_push_actions - 471 - INFO  
None - Searching for stream ordering 1 month ago  
Apr 24 19:14:25 localhost synapse[3877]: 2019-04-24 19:14:25,378 - synapse.storage.event_push_actions - 477 - INFO  
None - Found stream ordering 1 month ago: it's 2  
Apr 24 19:14:25 localhost synapse[3877]: 2019-04-24 19:14:25,380 - synapse.storage.event_push_actions - 479 - INFO  
None - Searching for stream ordering 1 day ago  
Apr 24 19:14:25 localhost synapse[3877]: 2019-04-24 19:14:25,407 - synapse.storage.event_push_actions - 485 - INFO  
None - Found stream ordering 1 day ago: it's 2  
Apr 24 19:14:25 localhost synapse[3877]: 2019-04-24 19:14:25,427 - synapse.server - 226 - INFO - None - Finished s  
etting up.  
Apr 24 19:14:26 localhost synapse[3877]: Starting …  
Apr 24 19:14:26 localhost synapse[3877]: started synapse.app.homeserver('homeserver.yaml') 

tapez maintenant :

fg  
puis CRTL+C pour arrêter le défilement "tail"  

Si les traces au démarrage présentent un défaut lié aux dépendances :

systemctl stop matrix-synapse
cd /opt/synapse
source /opt/synapse/env/bin/activate
pip3 install requests  
deactivate  
systemctl daemon-reload  
systemctl start matrix-synapse  

Démarrer votre navigateur, puis tapez l’url : https://matrix.mondomaine.com, si vous avez disposer un certificat autosigné sur le serveur HAPROXY, vous devrez accepter l’exclusion. Attention, la fédération Matrix.org n’est possible qu’en utilisant des certificats émanant d’autorités de certification. Si vous souhaitez acquérir un certficat SSL gratuitement, regardez du côté LetsEncrypt. Matrix n'étant pas doté d’interface HTML, seule cette page apparaîtra :

Création du premier compte

Il s’agira de créer le compte administrateur. Ce dernier aura accès à toutes les paramètres du serveur (créer des salons, paramétrage des salons, etc…).
A ce niveau de la procédure, la commande qui suit va faire appel au système de résolution de nom de domaine (DNS). Dans cette exemple j’ai décidé d’affecter le nom de domaine (FQDN) au service Matrix : matrix.mondomaine.com

Résolution de nom de domaine

La commande qui crée le premier utilisateur va tenter de se connecter au domaine spécifié dans ses paramètres.
Si vous disposez d’un service DNS sur votre réseau, paramétrez le pour que cette commande puisse résoudre le nom de domaine fourni en paramètre.
Vous ne disposez pas de service DNS sur votre réseau ? No problem, ajoutez au fichier “/etc/hosts” cette résolution.
Une ligne dans un fichier “hosts” est composée d’une adresse IP et d’un ou plusieurs noms. Toujours dans cet exemple je vais ajouter (référez-vous à la topologie de cet exemple) :

vi /etc/hosts   
# et ajoutez  
192.168.1.12      matrix.mondomaine.com      

Enregistrez, et vérifiez immédiatement : ping matrix.mondomaine.com, la réponse doit provenir de 192.168.1.12

Création du compte

Connectez-vous à la console du serveur, et tapez :
(*) Adaptez cette commande avec vos paramètres : nom de domaine, port
Exemple pour la topologie présentée :

/opt/synapse/env/bin/register_new_matrix_user -c /opt/synapse/homeserver.yaml http://matrix.mondomaine.com:8008

La console vous demande d’indiquer le nom du compte, mot de passe et répondez “yes” à la question “Make admin” :

New user localpart [root]: admin  
Password: xxxxx  
Confirm password: xxxxx  
Make admin [no]: yes  
Sending registration request…  
Success

Administration du serveur

Comme je l’ai indiqué précédemment, le serveur ne dispose pas d’interface de gestion à proprement parlé, vous allez devoir passer par un client. Je vous conseille le plus abouti : Riot.IM.
Cette application dispose de (quasiment) toutes les fonctions permettant d’administrer le serveur, l’accès aux fonctions d’administration est géré selon le niveau d’autorisation de l’utilisateur dans un salon.

Installation application Riot-web

Cette partie est optionelle, et nécessaire uniquement dans le cas où vous ne souhaitez pas installer l’application mobile ou desktop, mais préférez une utilisation par navigateur web. Ceci nécessitera la mise en place d’un serveur web, qui sera chargée d’envoyer l’application Riot (html/javascript) aux clients connectés. Rien de compliqué puisqu’il s’agit d’un site statique, aucun handler à mettre en place.

Installation du service web Apache2

Connecté “root” au serveur “Matrix”, tapez :

apt install apache2  

Les sites web sont disposés dans le répertoire /var/www/html/

Installation du site web statique

Rendez-vous à la page https://github.com/vector-im/riot-web/releases et copier l’url de téléchargement de la dernière version disponible de Riot-web (extension .tar.gz)

cd /var/www/html/  
wget [coller l'url du fichier à télécharger] Ex: wget  https://github.com/vector-im/riot-web/releases/download/v1.2.1/riot-v1.2.1.tar.gz   
#extraire l'archive  
tar xfz [nom de l'archiver tar.gz] Ex: tar xfz riot-v1.2.1.tar.gz  
chown -R www-data:www-data [nom du répertoire créé] Ex: chown -R www-data:www-data  riot-v1.2.1  
# Suppression et création du lien symbolique vers la nouvelle version, ceci évite la modification du vhost à chaque changement de version  
rm riot;ln -s riot-v1.2.1 riot  

Création du fichier virtualhost pour le domaine : riot.mondomaine.com

vi /etc/apache/site-available/riot.mondomaine.com.conf 

et ajouter ce contenu en l’adaptant à vos paramètres :

<VirtualHost default:80>  
         ServerName riot.mondomaine.com  
         ServerAdmin webmaster@localhost  
         DocumentRoot /var/www/html/riot  
         ErrorLog ${APACHE_LOG_DIR}/ error-riot.mondomaine.com.log  
         CustomLog ${APACHE_LOG_DIR}/access-riot.mondomaine.com.log combine   
</VirtualHost>

Activation du Vhost

a2ensite riot.mondomaine.com  
#Rechargement de la configuration apache  
systemctl reload apache2  

Vous pouvez changer les url présentées automatiquement par l’interface :

#copier le fichier config.sample.json  vers config.json  
cp /var/www/html/riot/config.sample.json /var/www/html/riot/config.json  
vi /var/www/html/riot/config.json  
# et changer les urls : dans cette exemple 

"default_hs_url": "https://matrix.mondomaine.com",  
"default_is_url": "https://matrix.org",

Concernant les autres paramètres, si vous ne savez pas à quoi ils correspondent, consultez la documentation Riot-web, ou bien supprimez les du fichier de configuration.

Ouvrez maintenant votre navigateur et faîtes le pointer vers votre domaine : http://riot.mondomaine.com pour se connecter voir la procédure ci-après.

Remarquez bien que le serveur apache est configuré pour le protocole “http” et non “https”. Il s’agit d’un site statique, destiné à être téléchargé une fois, le serveur web dans ce cas ne sert qu'à envoyer le codes html/javascript, et n’effectue aucune action avec le serveur Matrix. Si vous souhaitez chiffrer cette partie, voir le chapitre précédent concernant le chiffrage SSL.

Installation des clients Riot.im (mobile et/ou Desktop)

Je vous renvoi au site https://about.riot.im/ d’où vous pourrez télécharger le client adapté à votre plateforme.

Connexion au serveur Matrix

ATTENTION : Le client sur lequel vous installer Riot.im devra pouvoir résoudre les noms de domaine, si vous utilisez un nom dans votre url. Si vous ne possédez pas de service DNS sur votre infrastructure réseau, indiquez la résolution dans le fichier “hosts” de votre système”.
Démarrer le client Riot.im, par défaut, il propose une connexion aux serveur Matrix.org, cliquez sur “changer”, indiquer dans la zone “url du serveur d’accueil” : “httpS://matrix.mondomaine.com” , si vous avez mis en place un service HAPROXY de type SSL,
dans le cas contraire, utilisez l’adresse IP du serveur qui héberge l’application Matrix : “http://[adresse IP]:[Port Matrix]"
Ex : http://192.168.1.10:8008 quand Matrix écoute sur le port 8008.

Cliquez sur “Suivant”, puis entrez le compte “admin”, et le mot de passe choisi précédemment.

Vous êtes connectés…

Créez vos salons. Vous ne pourrez inviter, par l’intermédiaire du bouton “Inviter dans ce salon” les utilisateurs de votre instance (voir le chapitre Ajouter un compte) et ceux reliés au serveur d’identité.
Vous découvrirez un espace conviviale, robuste, rapide, très complet et je vous invite à lire la documentation de cet outil (non couvert dans ce billet).

Ajouter un compte

Dans mon contexte : messagerie privée, ceci implique que l’inscription automatique a été désactivée. Il s’agit du paramètre : “enable_registration: false” situé dans le fichier de configuration du service matrix : /opt/synapse/homeserver.yaml.
Si vous modifiez ce fichier, exécuter la commande :

systemctl restart matrix-synapse 

(redémarrage du service pour la prise en compte de la modification de configuration).
Je crée donc les comptes au fur et à mesure des demande. La procédure est la même que pour la création du premier compte. Attention : A la question : “Make admin [no]", apppuyez sur “Entrée” ou bien indiquez no. Les nouveaux utilisateurs ne sont pas administrateurs dans mon contexte.
J’indique un “mot de passe fort” (généré par apg) que je communique à l’utilisateur et lui précisant qu’il devra le changer lors de sa première visite.

Reinitialisation d’un mot de passe

Si vous êtes reliés à un serveur d’identité, suivez la procédure indiquée sur la page d’accueil, sinon, Matrix est livré avec un outil situé ici : /opt/synapse/env/bin/hash_password
Il suffit de l’exécuter, fournir un mot de passe, confirmez.

/opt/synapse/env/bin/hash_password  

L’outil vous indiquera le “hashage”, copier cette valeur.
Connectez-vous “root” à la console du serveur postgresql, puis tapez :

su - postgres  
psql synapse  
SELECT * FROM users;  
UPDATE users SET password_hash='[Valeur de hashage]'    WHERE name='[nom utilisateur du genre @foo:matrix.mondomaine.com';  
\q  
exit

source : https://blog.cavebeat.org/2018/02/reset-password-for-matrix-synapse-accounts

Connectez-vous ensuite avec le mot de passe ayant servi à calculer le “hashage”

Intégration d’un Bot (go-neb)

Le bot permet d'étendre les fonctionnalité de votre messagerie : intégration des Gifs animés (Giphy), intégration des messages d’alertes Prometheus (application de monitoring développé par Soundcloud), reportez-vous à cet article : https://www.mytinydc.com/index.php/2019/04/25/installation-du-bot-go-neb-pour-synapse-matrix-arm64/

Mise à jour du serveur Matrix-Synapse (update 04/05/2019)

Avant d’effectuer une mise à jour du serveur Matrix-Synapse, sauvegardez la base de données Postgresql et le répertoire d’installation.

# Connecté au serveur Matrix-Synapse
# Emplacement du code Matrix-Synapse  : /opt/synapse
# sauvegarde sous forme d'archive tar+gz
tar cfz /root/backup-matrix-synapse-[datejour].tgz /opt/sysnapse
# Connectez-vous au serveur de base de données Postgresql et sauvegardez la base de données "synapse"
# Arrêt du service Matrix-Synapse
systemctl stop matrix-synapse
# Mise à jour du code
cd /opt/synapse
source /opt/synapse/env/bin/activate
pip install --upgrade pip
pip install --upgrade setuptools
pip install --upgrade matrix-synapse[all]

La mise à jour démarre :

Collecting matrix-synapse[all]
[...]
Successfully built matrix-synapse 
Installing collected packages: matrix-synapse   
Found existing installation: matrix-synapse 0.99.3     Uninstalling matrix-synapse-0.99.3:       
Successfully uninstalled matrix-synapse-0.99.3 Successfully installed matrix-synapse-0.99.3.2

Poursuivre avec ces commandes :

#Supprimer l'environnement
deactivate

Si l’unité à laquelle vous êtes connecté n’est pas le serveur Matrix mais une unité de compilation, créer une archice de “/opt/synapse/env” et déployez la ensuite sur le serveur final

tar cfz /root/matrix-synapse.tgz /opt/synapse/env/
# connexion au serveur Matrix-Synapse : copier l'archive précédente dans /root/ puis : 

systemctl stop matrix-synapse
cd /
tar xfz /root/root/matrix-synapse.tgz
chown -R synapse:synapse /opt/synapse/env
rm /root/matrix-synapse.tgz
systemctl start matrix-synapse

# Démarrer Matrix-Synapse
systemctl start matrix-synapse

Exposer le service sur Internet

Pour paramétrer l’exposition de votre messagerie Matrix sur Internet, je vous renvoi au billet consacré à l’exposition de Nextcloud (à adapter à votre environnement Matrix).
https://www.mytinydc.com/index.php/2019/05/23/nextcloud-exposez-votre-instance-sur-internet/

Fédération

(update 06/05/2019)
La fédération permet de faire communiquer les serveurs synapse entres eux. Pour tester cette fédération, je vais joindre comme indiqué dans la documentation, la room “#synapse:matrix.org”.
Attention la fédération ne fonctionne que dans le cadre où votre service Matrix est exposé sur internet.
Par défaut les serveurs communiquent sur le port 8448, si vous changez ce port, vous devrez informer le réseau en créant des enregistrement DNS spécifiques, voir la doc.

HAPROXY et Firewall

Le service étant réparti sur plusieurs machines je vais détailler pour chacune la configuration à modifier.

Serveur HAPROXY et son firewall

La topologie ne change pas, le serveur Haproxy est chargé d’intercepter les requêtes des clients.
J’ajoute le port de fédération (TCP/8448) dans la configuration HAPROXY, le backend matrix ne change pas non plus et j’utilise le même. Le mien est déjà paramétré pour le backend HTTPS (TCP/443) et nommé “matrix.mondomaine.comssl”

frontend 192.168.1.10:8448https  
    mode http  
    enabled  
    bind 192.168.1.10:8448 ssl crt matrix.mondomaine.com.pem  
    default_backend matrix.mondomaine.comssl  

J’ouvre le port TCP/8448 dans la configuration Firewall de ce serveur.
Le service est maintenant joignable des autres serveurs Matrix-Synapse.

Serveur Matrix-Synapse

Ce serveur va devoir communiquer avec les serveurs fédérés. Pour autoriser la fédération avec “matrix.org”, ouvrez le fichier de configuration de votre serveur :
et décommentez la ligne : federation_domain_whitelist:
Ajouter en dessus en utilisant des espaces et non des tabulations : matrix.org, pour obtenir ceci :

federation_domain_whitelist:
      - matrix.org

Enregistrez et quittez, redémarrez le service matrix-synapse

systemct restart matrix-synapse  

Vous devez aussi régler son firewall afin que le serveur matrix puisse joindre le port de la fédération autorisée, ex : domaine.federe.com : 8448 TCP

Ouvrez votre application Riot.im, connecté à votre serveur, puis tentons de joindre le salon : #synapse:matrix.org

Cliquer sur le bouton “+” après “Rooms”

Et saisir le nom de la room “#synapse:matrix.org” situé sur les serveur de matrix.org et j’obtiens une erreur :

Je relance le processus en inspectant les traces Firewall de mon serveur matrix-synapse, et je vois des tentatives de connexions à une adresse IP appartenant à Cloudfare sur le port ….. 8443.

Matrix.org ne fédère pas sur le 8448 (il est autorisé de fédérer sur un port différent (Documentation Matrix sur la fédération)) . Je modifie les paramètres du firewall de ce serveur, en autorisant l’accès au port 8443 du domaine “matrix.org”, je n’indique pas l’ip. Si ils utilisent cloudflare, il est possible que l’ip du domaine change. Et je retente le processus pour joindre la room :

Je clique sur “Click here” pour rejoindre la room

La fédération est en place pour le domaine matrix.org. La fédération crée une copie du salon du site fédéré, je vous déconseille la fédération à partir de gros salons existants, la réplication prend beaucoup de temps et bien souvent n’aboutis pas. Il existe plusieurs discussions à ce sujet, car aujourd’hui la fédération est limité aux très grosses unités de calcul…
Pour tester le bon fonctionnement de la fédération vous pouvez utiliser cette url :

https://federationtester.matrix.org/api/report?server_name=[nom de domaine de votre serveur matrix]

Ce test donne un rapport de fédération.

Conclusion

Parce que Matrix a fait le “Buzz”, je me suis interressé à leur produit de très prêt. J’ai choisi d’installer ce service, en vue de remplacer RocketChat. Qui est aussi un bon produit, mais au final, peu adapté aux petites unités que j’utilise. Rocketchat met plus de 5 minutes à démarrer, et consomme spontanément toute la puissance CPU et ce, plusieurs fois par minute, sans raison valable. La base mongodb (pour arm64 également) à crashé plusieurs fois, et après trois mois d’utilisation, cela nous semblait un peu lent.
La mise en place du couple Matrix/Riot.im est assez simple, aucunes difficultés notoires rencontrées lors de l’installation. Durant les premières heures d’utilisation (3 personnes), nous avons posté une centaine de messages, des photos et la charge du serveur est restée très basse. Les temps de réponse n’ont rien à voir avec ceux de RocketChat, surtout pour les chargements d’images, et Gifs. Fonctionnalité très interressante dans Riot, vous pouvez desactiver le démarrage automatique des Gifs et des vidéos. Le support Markdown est excellent, ainsi que le suivi de réponse à un message.
Les notifications sur mobile sont très réactives. Je souhaite revenir sur ce point. Certains ont critiqué, et pour une bonne raison, le fait que la messagerie du gouvernement Français n'était pas réellement souveraine, dans le sens ou le mécanisme de notifications (système PUSH) passe par le services Firebase de Google (https://firebase.google.com/docs/cloud-messaging/). Effectivement, les metadatas et leur cheminement permettent à Google de savoir qui est connecté sur ce réseau privé, et le titre du groupe concerné, mais en aucun cas, la possibilité de lire le message. Le gouvernement Français aurait du choisir et peut être l’ont il fait, une installation sur Android avec le gestionnaire de paquet opensource “FDroid”, qui propose un client Riot.im ne passant pas par le réseau FireBase de Google. Mais utilise un mécanisme d’interrogation répétée du serveur (non push). Si vous aussi, êtes soucieux des métadonnées transitant chez Google par ce biais, sachez que l’option d’installation “Fdroid” est la réponse à votre question. Et dernier point assez important dans un Datacenter, les metrics. Le service Matrix n’est pas en reste de ce côté. Il fournit une information très pertinente et surtout très complète (utilisation CPU, Garbage collector, statistiques d’accès à la base de donnée, etc…). Et de toutes évidences, j’ai abandonné Rocketchat.

  • Cette courbe montre la descente après l’arrêt de RocketChat et le démarrage de Matrix… (Monitoring réalisé avec Prometheus et Grafana sur Raspberry PI3)
  • Temps d’attente pour les connexions à la base de données postgresql (Rock64/4Go)

Exposer votre service Matrix-Synapse sur l’internet

Dans le cadre d’un autohébergement, vous allez exposer votre service de messagerie sur l’internet. Je vous renvoi à ce billet : https://www.mytinydc.com/index.php/2019/05/23/nextcloud-exposez-votre-instance-sur-internet/ dont le contenu est facilement adaptable à ce service.
Attention si vous passez par un VPN, modifier la configuration de Matrix, afin que ce dernier écoute sur toutes les interfaces :
modifier le paramètre “bind_addresses” du fichier /opt/synapse/homeserver.yaml comme suit :

"bind_addresses: ['0.0.0.0']"  

et redémarrer le service :

systemctl restart matrix-synapse

Aller plus loin

  • Répartition de charge du service Matrix (attention, j’ai commencé ce chapitre et endommagé le service en démarrant deux instances sur des serveurs séparés et “loadbalancés” avec Haproxy, cette implémentation ne suffit pas et a provoqué des erreurs d’accès aux salons actifs…). Pour l’instant je dispose de deux serveurs, avec un instance démarrée seulement et “hearbeat” entre les deux. Quand le master s’arrête, le slave démarre le service matrix-synapse. Pour revenir à l'état initial, arrêter le service matrix-synapse sur le slave puis démarrer le service matrix-synapse sur le master. Cette configuration fonctionne… mais ne convient pas dans le cadre de répartition de charge “pure”.
  • Répartition de charge de la base de données Postgres (postgres-XL - multi master) * Sauvegarde automatique de la base
  • Sécurité des accès avec un HIDS (Ossec par exemple)
  • Mise en application des “rates limiters”
  • Intégrer des Bots pour la collecte d’informations de monitoring, du support Giphy, etc…

Ce document a été révisé par Tristan, qui à réalisé l’installation complète “from scratch” sur une unité Rock64 en partant d’un système d’exploitation entièrement réinitialisé. Merci de laisser vos commentaires si vous êtes confrontés à des cas non spécifié dans ce document.

Licence de ce document : Creative Commons (CC BY-NC-ND 4.0)

CETTE DOCUMENTATION EST LIVRÉE “EN L’ÉTAT”, SANS GARANTIE D’AUCUNE SORTE ET DISTRIBUÉE DANS UN BUT ÉDUCATIF EXCLUSIVEMENT. L’AUTEUR, CONTRIBUTEURS DE CETTE DOCUMENTATION OU ©MYTINYDC.COM NE SAURAIENT EN AUCUN CAS ÊTRE TENUS RESPONSABLES DES DOMMAGES DIRECTS OU INDIRECTS POUVANT RÉSULTER DE L’APPLICATION DES PROCÉDURES MISES EN ŒUVRE DANS CETTE DOCUMENTATION, OU DE LA MAUVAISE INTERPRÉTATION DE CE DOCUMENT.

Poster un commentaire

Désolé, la réponse à la question Captcha est incorrecte
Merci. le message est dans le tuyau :)
Désolé, il y a un problème dans le tuyau, veuillez réessayer plus tard :(
Un champs est invalide

Commentaires (non traduits)

lomic
-
28/01/2020 00:00
Merci pour ce tuto rare puisque pour le moment je n’en ai pas trouvé d’autres qui expliquent comment configurer le serveur matrix/synapse. J’ai pourtant une question bloquante : j’ai installé matrix/synapse via docker et je n’ai pas accès aux commandes notamment celle utilisée pour créer un admin. Comment faire, avec docker, pour faire l'équivalent de /opt/synapse/env/bin/register_new_matrix_user -c /opt/synapse/homeserver.yaml http://matrix.mondomaine.com:8008 ? Merci pour votre réponse
dhenry
-
28/01/2020 00:00
Bonjour, vous devrez exécuter les commandes dans le container.
Le mieux est d’exécuter un bash, puis les commandes souhaitées.
Vous devrez être connecté root ou passer pas sudo

docker ps
Pour trouver votre container
docker exec -it [id du container] bash

Vous êtes dans le container
Commandes d’admin….

exit
Pour sortir du container

Exemple
docker ps
d000ef87a matrix “/usr….” 6 minutes ago….
docker exec -it d000ef87a bash
/opt/synapse/env/bin/register_new_matrix_user -c /opt/synapse/homeserver.yaml http://matrix.mondomaine.com:8008
exit
Retour au shell original
lomic
-
14/02/2020 00:00
oui en fait pour “rentrer dans le container” je devais faire
docker run synapse -ti exec /bin/sh
et non pas
docker run synapse -ti exec /bin/bash
et tout s’est décoincé !
Merci.
CedricM
-
28/03/2020 00:00
Au lancement du service matrix-synapse, j’ai un crash avec l’erreur:
Mar 28 11:39:56 riot synapse[2311]: File “/opt/synapse/env/lib/python3.5/encodings/ascii.py”, line 26, in decode
Mar 28 11:39:56 riot synapse[2311]: return codecs.ascii_decode(input, self.errors)[0]
Mar 28 11:39:56 riot synapse[2311]: UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xc3 in position 4446: ordinal not in range(128)
Mar 28 11:39:56 riot systemd[1]: matrix-synapse.service: Control process exited, code=exited status=1
Mar 28 11:39:56 riot systemd[1]: Failed to start Matrix Synapse service.

::> caractères spéciaux dans le password postgres + caractères non reconnus
suite au copier-coller depuis votre tuto. Un fois réécrit à la main, ça démarre.