Matrix / Element Matrix Cette documentation n'est pas complète. Quelques éléments sont en cours de rédaction. Néanmoins, des éléments essentiels devraient pouvoir vous aider dans votre déploiement de Matrix, raison pour laquelle nous avons choisi de la publier. Cette documentation décrit l'installation d'un serveur Synapse (actuellement le seul stable), d'un client Element, et de services annexes : synapse-admin pour une interface graphique et MAS pour pouvoir s'authentifier en SSO sur le client Android Element X. La variable allow_guest_access: true crée des utilisateurs invités dans la base de données avec des noms tels que @1:exemple.fr, puis @2:exemple.fr, etc. à chaque erreur de connexion avec LDAP/SSO (et d'autres problèmes). Création de la VM Debian Dans cette documentation, la VM a besoin de 4 noms de domaines : → pour le serveur Matrix Synapse ( matrix.exemple.fr ); → pour le client Element ( element.exemple.fr ) ; → pour l'interface web d'administration Synapse Admin ( admin.matrix.exemple.fr ) ; → pour le service MAS ( auth.matrix.exemple.fr ). Création de la VM : prévoir 4 CPU et 4 Go RAM. Installation du serveur Matrix Synapse Pour l'installation, je me suis aidée : → du README disponible sur le GitHub → de la documentation de Element Installer le paquet debian matrix-synapse-py3 Dans notre cas, on utilisera exemple.fr comme nom de serveur, avec srv-matrix.exemple.fr comme machine. Il faut donc ajouter un enregistrement DNS pour faire une redirection des flux matrix qui arrive sur exemple.fr vers srv-matrix.exemple.fr : _matrix-fed._tcp.exemple.fr. 3600 IN SRV 10 0 443 srv-matrix.exemple.fr. Lorsque cela est demandé, mettre exemple.fr , puis No . Cela va créer des fichiers de configuration dans le dossier conf.d de Matrix Synapse (server_name.yaml et report_stats.yaml) sudo apt install -y lsb-release wget apt-transport-https sudo wget -O /usr/share/keyrings/matrix-org-archive-keyring.gpg https://packages.matrix.org/debian/matrix-org-archive-keyring.gpg echo "deb [signed-by=/usr/share/keyrings/matrix-org-archive-keyring.gpg] https://packages.matrix.org/debian/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/matrix-org.list sudo apt update sudo apt install matrix-synapse-py3 Installer et configurer PostgreSQL # Import the repository signing key: sudo apt install curl ca-certificates sudo install -d /usr/share/postgresql-common/pgdg sudo curl -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc --fail https://www.postgresql.org/media/keys/ACCC4CF8.asc # Create the repository configuration file: sudo sh -c 'echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' sudo apt update sudo apt -y install postgresql Synapse a besoin de la bibliothèque client python postgres pour se connecter à une base de données postgres. Donc on installe libpq5 . sudo apt install libpq5 Créer un utilisateur matrix-synapse et une base de données synapse : sudo -u postgres bash createuser matrix-synapse createdb --encoding=UTF8 --locale=C --template=template0 --owner=matrix-synapse synapse Créer le fichier de configuration /etc/matrix-synapse/conf.d/database.yaml : database: name: psycopg2 args: user: matrix-synapse dbname: synapse host: /run/postgresql cp_min: 5 cp_max: 10 Configurer Matrix Synapse Créer le fichier /etc/matrix-synapse/conf.d/synapse.yaml avec la configuration suivante (pour éviter de toucher au fichier /etc/matrix-synapse/homeserver.yaml ) : # For more information, see https://element-hq.github.io/synapse/latest/usage/configuration/config_documentation.html public_baseurl: https://matrix.exemple.fr # Desactiver la possibilite de changer son nom d'affichage et les informations tierces enable_set_displayname: false enable_3pid_changes: false #enable_set_avatar_url: false # Permet de rechercher des utilisateurs (insensible a la casse) user_directory: enabled: true search_all_users: false prefer_local_users: true show_locked_users: false # Ajouter des salons (deja existant) a la 1e connexion # Ne fonctionne que avec des salons publics # (cela ne fonctionne pas meme si l alias est cree mais que le salon est repasse en prive) auto_join_rooms: - "#Info:exemple.fr" autocreate_auto_join_rooms: false autocreate_auto_join_rooms_federated: false auto_join_rooms_for_guests: false # Set variable for OIDC public_baseurl: https://matrix.exemple.fr password_config: enabled: false localdb_enabled: false # Utiliser notre serveur turn turn_uris: [ "turns:turn.exemple.fr:443?transport=udp", "turns:turn.exemple.fr:443?transport=tcp" ] turn_shared_secret: "..." turn_user_lifetime: 86400000 turn_allow_guests: true Configuration de nginx On redirige le port d'écoute par défaut 8008 sur le port 443 . Les clés ssl sont renouvelées automatiquement avec dehydrated de let's encrypt (installé plus tôt). La création du premier certificat peut se faire avec la commande suivante (qui permet de forcer la génération de certificats avec dehydrated) : sudo systemctl start dehydrated-renew.service . On ajoute donc un fichier de configuration matrix dans /etc/nginx/sites-available avec la configuration suivante : upstream matrix { server localhost:8008; } server { listen 443 ssl; listen [::]:443 ssl; # For the federation port listen 8448 ssl default_server; listen [::]:8448 ssl default_server; server_name matrix.exemple.fr; include include/ssl_keys_srv-matrix.exemple.fr; access_log /var/log/nginx/access.matrix.log; error_log /var/log/nginx/error.matrix.log; # Delete "|/_synapse/admin" if Synapse Admin is not use location ~ ^(/_matrix|/_synapse/client|/_synapse/admin) { # note: do not add a path (even a single /) after the port in `proxy_pass`, # otherwise nginx will canonicalise the URI and cause signature verification errors. proxy_pass http://matrix; # Include proxy_params file with general parameters include include/proxy_params; # Nginx by default only allows file uploads up to 1M in size # Increase client_max_body_size to match max_upload_size defined in homeserver.yaml client_max_body_size 50M; # Synapse responses may be chunked, which is an HTTP/1.1 feature. proxy_http_version 1.1; } # For the federation configuration location /.well-known/matrix/server { return 200 '{"m.server": "srv-matrix.exemple.fr:443"}'; default_type application/json; } # If Sliding Sync service are installed on our server, let msc3575 location /.well-known/matrix/client { return 200 '{"m.homeserver": {"base_url": "https://srv-matrix.exemple.fr"}, "m.identity_server": {"base_url": "https://vector.im"}, "org.matrix.msc3575.proxy": {"url": "https://syncv3.matrix.exemple.fr"}}'; default_type application/json; add_header Access-Control-Allow-Origin *; } # If Element web is installed on our server location / { return 301 https://element.exemple.fr; } } server { listen 80; listen [::]:80; server_name matrix.exemple.fr; access_log /var/log/nginx/access.matrix.log; error_log /var/log/nginx/error.matrix.log; include include/redirect_ssl; } Synchroniser les dossiers nginx, puis redémarrer les services nginx et synapse : sudo ln -s /etc/nginx/sites-available/matrix /etc/nginx/sites-enabled sudo systemctl restart nginx sudo systemctl restart matrix-synapse.service On peut vérifier que le serveur synapse est en écoute grâce à l'URL suivante : https://srv-matrix.exemple.fr/_matrix/static/ On peut aussi vérifier si notre serveur est fédéré grâce à l'URL suivante : https://federationtester.matrix.org/ Installation du client Element Pour l'installation, je me suis aidée : → du dépôt GitHub de la version web de Element On installe Element à partir d'un script nommée update_element.sh : sudo apt install jq sudo mkdir -p /var/www/element sudo touch /var/www/element/update_element.sh Le script contient les lignes suivantes : #!/bin/sh set -e install_location="/var/www/element" latest="$(curl -s https://api.github.com/repositories/39487546/releases/latest | jq -r .tag_name)" 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/vector-im/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" sudo chmod +x /var/www/element/update_element.sh sudo /var/www/element/update_element.sh Configurer Element à partir du fichier config.json , d'abord déplacez-le dans le répertoire /etc/element : sudo cp /var/www/element/current/config.sample.json /etc/element/config.json ln -sf /var/www/element/current/config.sample.json /etc/element/config.json Modifier le fichier config.json . Remplacez TOUTE la partie "default_server_config" par "default_server_name" (ce sont deux méthodes différentes pour la connexion à notre serveur, on utilise la 2e car il va prendre en compte le fichier .well-known crée plus tôt dans la configuration nginx de Matrix). "default_server_name": "exemple.fr", Dans le même fichier, on peut personnaliser la page d'accueil et la page home de l'application. Exemple de config possible : "brand": "Element", "branding": { "welcome_background_url": "https://element.exemple.fr/themes/element/img/backgrounds/lake.jpg", "auth_header_logo_url": "https://element.exemple.fr/themes/element/img/logos/logo-exemple.png", "auth_footer_links": [ { "text": "Intranet", "url": "https://intranet.exemple.fr/" } ] }, "embedded_pages": { "welcome_url": "https://element.exemple.fr/welcome_exemple.html" }, "default_country_code": "FR", Pour mettre notre propre page d'accueil, on peut copier le fichier par défaut welcome.html et modifier certaines choses (comme supprimer le bouton pour s'enregistrer ou modifier la description). J'ai rencontré un problème pour le logo, il ne s'affichait pas lorsque je rajoutais la partie embedded_pages avec la nouvelle page d'accueil. Donc j'ai directement insérer l'URL du logo dans le fichier welcome_exemple.html . Sur Element, il y a des features en cours de développement, on peut ajouter la possibilité de les tester (il faut activer la fonctionnalité que l'on veut tester depuis les paramètres), en modifiant une variable dans config.json : "show_labs_settings": true Il est aussi possible de forcer l'ajout, voir https://web-docs.element.dev/Element%20Web/config.html#labs-flags Configuration de nginx On ajoute un fichier de configuration element dans /etc/nginx/sites-available avec la configuration suivante : server { listen 443 ssl; listen [::]:443 ssl; server_name element.exemple.fr; # TLS configuration, same file for all alias include include/ssl_keys_srv-matrix.exemple.fr; access_log /var/log/nginx/access.element.log; error_log /var/log/nginx/error.element.log; # Mise en place de l'icone de l'intranet sur Element location = /vector-icons { # Configuration du cache et autres include include/static; rewrite ^/vector-icons/.*?$ https://element.exemple.fr/themes/element/img/logos/favicon_exemple.ico redirect; } location / { root /var/www/element/current; index index.html; include include/proxy_params; add_header Referrer-Policy "strict-origin" always; add_header X-Content-Type-Options "nosniff" always; add_header X-Frame-Options "SAMEORIGIN" always; add_header X-XSS-Protection "1; mode=block"; } } server { listen 80; listen [::]:80; server_name element.exemple.fr; access_log /var/log/nginx/access.element.log; error_log /var/log/nginx/error.element.log; include include/redirect_ssl; } Synchroniser les dossiers nginx, puis redémarrer le service nginx : sudo ln -s /etc/nginx/sites-available/element /etc/nginx/sites-enabled sudo systemctl restart nginx Installation de Synapse Admin Synapse Admin est une interface web d'administration pour le serveur Matrix Synapse. Elle permet notamment de gérer les utilisateurs, les salons ou encore les médias partagés. Pour l'installation, je me suis aidée : → du README disponible sur le GitHub (steps for 2) Installer Node.js : curl -sL https://deb.nodesource.com/setup_18.x | sudo bash - sudo apt install -y nodejs Installer Yarn : curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list sudo apt-get update sudo apt-get install yarn Clôner le Dépôt git et installer les dépendances : sudo useradd -s /bin/bash -m -d /srv/synapse-admin -r synapse-admin sudo -iu synapse-admin # Exécuter en tant que synapse-admin git clone https://github.com/Awesome-Technologies/synapse-admin.git repo cd synapse-admin yarn install yarn start Configuration de nginx On ajoute un fichier de configuration synapse-admin dans /etc/nginx/sites-available avec la configuration suivante : upstream synapse-admin { server localhost:5173; } server { listen 443 ssl; listen [::]:443 ssl; server_name admin.matrix.exemple.fr; include include/ssl_keys_srv-matrix.exemple.fr; access_log /var/log/nginx/access.matrix-admin.log; error_log /var/log/nginx/error.matrix-admin.log; location / { proxy_pass http://synapse-admin; # Directory where is the repo git of synapse-admin root /etc/matrix-synapse/synapse-admin; include include/proxy_params; client_max_body_size 50M; } } server { listen 80; listen [::]:80; server_name admin.matrix.exemple.fr; access_log /var/log/nginx/access.matrix-admin.log; error_log /var/log/nginx/error.matrix-admin.log; include include/redirect_ssl; } Synchroniser les dossiers nginx, puis redémarrer le service nginx : sudo ln -s /etc/nginx/sites-available/synapse-admin /etc/nginx/sites-enabled sudo systemctl restart nginx Création du service de synapse-admin Créer un service pour l'automatisation du lancement de l'interface web. Créer le fichier /etc/systemd/system/synapse-admin.service : [Unit] Description=interface web d'administration pour notre serveur synapse [Service] User=synapse-admin Group=synapse-admi WorkingDirectory=/srv/synapse-admin/repo ExecStart=yarn start RestartSec=10 Restart=always [Install] WantedBy=multi-user.target Redémarrer le processus systemd pour la prise en compte du nouveau service, puis l'activer au démarrage : sudo systemctl daemon-reload sudo systemctl enable synapse-admin.service --now Création d'un utilisateur admin Seuls les utilisateurs administrateurs du domaine peuvent accéder à l'outil Synapse Admin. On va donc créer un utilisateur admin (qui par la suite pourra donner des droits admin à n'importe quel utilisateur). Créer une clé partagé pour pouvoir créer 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)'" | sudo tee /etc/matrix-synapse/conf.d/registration_shared_secret.yaml Créer un nouvel utilisateur administrateur (il faut rentrer un identifiant, un mot de passe, puis yes) : register_new_matrix_user -c /etc/matrix-synapse/conf.d/registration_shared_secret.yaml Configuration du SSO avec OIDC Connect Avec le serveur Synapse, on peut directement configurer le SSO pour l'authentification. Pour l'installation, je me suis aidée : → de la documentation de OpenId Connect → et plus particulièrement de l'exemple pour LemonLDAP pour la configuration côté Synapse mais aussi LemonLDAP Forcer d'ajouter les Claims dans le Endpoint Userinfo depuis LemonLDAP (sinon cela ne récupère pas les informations des utilisateurs) Créer le fichier /etc/matrix-synapse/conf.d/oidc.yaml : oidc_providers: - idp_id: matrix idp_name: "SSO Exemple" discover: true issuer: "https://sso.exemple.fr/" client_id: "matrix.exemple.fr" client_secret: "secret_client" scopes: - "openid" - "profile" - "email" # Uncomment if discover is set to false #authorization_endpoint: "https://sso.exemple.fr/oauth2/authorize" #token_endpoint: "https://sso.exemple.fr/oauth2/token" #userinfo_endpoint: "https://sso.exemple.fr/userinfo" #jwks_uri: "https://sso.exemple.fr/.well-known/jwks.json" #enable_registration: true allow_existing_users: true user_mapping_provider: config: localpart_template: "{{ user.preferred_username }}" #confirm_localpart: true display_name_template: "{{ user.name }}" email_template: "{{ user.email }}" Redémarrer le service synapse : sudo systemctl restart matrix-synapse.service Configuration de MAS (authentication service) Pour pouvoir se connecter sur Element X quand on utilise le SSO, il faut installer MAS (le successeur de Sliding-Sync). Documentation : https://element-hq.github.io/matrix-authentication-service/index.html Page en cours d'écriture Installation de MAS install_mas.sh ARCH=x86_64 OS=linux VERSION=latest # or a specific version, like "v0.1.0" # URL to the right archive URL="https://github.com/element-hq/matrix-authentication-service/releases/${VERSION}/download/mas-cli-${ARCH}-${OS}.tar.gz" # Create a directory and extract the archive in it mkdir -p /srv/mas curl -sL "$URL" | tar xzC /srv/mas # This should display the help message /srv/mas/mas-cli --help Créer un utilisateur système mas sudo adduser --system mas sudo addgroup mas sudo usermod -aG mas mas sudo usermod -g mas mas sudo passwd mas sudo usermod --move-home --home /srv/mas mas sudo chown -R mas: /srv/mas/ Créer une base de données pour MAS, avec son utilisateur sudo -iu postgres createuser --pwprompt mas createdb --owner=mas mas Mettre la configuration de la base de données et la connexion via le SSO dnas le fichier /etc/matrix-synapse/homeserver.yaml (car on en aura besoin pour migrer les données en prenant les infos du fichier homeserver.yaml). Générer un fichier de configuration MAS à partir de notre fichier de conf synapse : sudo /srv/mas/mas-cli config generate --synapse-config /etc/matrix-synapse/homeserver.yaml --output /srv/mas/mas_config.yaml Ajuster le fichier mas_config.yaml pour qu'il ressemble à ceci : # En cours de rédaction Modifier le fichier nginx .well-known Ajouter un fichier nginx pour MAS Éteindre les serveurs synapse et MAS Commandes pour tester les configurations des deux cotes avant la migration sudo /srv/mas/mas-cli syn2mas check --config /srv/mas/mas_config.yaml --synapse-config /etc/matrix-synapse/homeserver.yaml sudo /srv/mas/mas-cli syn2mas migrate --config /srv/mas/mas_config.yaml --synapse-config /etc/matrix-synapse/homeserver.yaml --dry-run homeserver.yaml : ajout de la partie msc3861 migration : sudo /srv/mas/mas-cli syn2mas migrate --config /srv/mas/mas_config.yaml --synapse-config /etc/matrix-synapse/homeserver.yaml changer la configuration de notre SSO pour les adresses autorisées supprimer la partie oidc_provider dans homeserver.yaml lancer les services matrix-synapse et MAS vérifier que tout est bon avec la commande suivante : sudo /srv/mas/mas-cli doctor --config /srv/mas/mas_config.yaml Et la cela réussi à avoir des infos sur mon compte, mais je n'arrive pas à me connecter {.is-warning} Mise à jour Serveur Matrix Synapse Source : https://element-hq.github.io/synapse/latest/upgrade.html sudo apt install -y lsb-release wget apt-transport-https sudo wget -O /usr/share/keyrings/matrix-org-archive-keyring.gpg https://packages.matrix.org/debian/matrix-org-archive-keyring.gpg echo "deb [signed-by=/usr/share/keyrings/matrix-org-archive-keyring.gpg] https://packages.matrix.org/debian/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/matrix-org.list sudo apt update sudo apt install matrix-synapse-py3 sudo systemctl restart matrix-synapse.service Vérifier que la mise à jour a fonctionné : curl http://localhost:8008/_synapse/admin/v1/server_version # {"server_version":"1.121.1"} Client Element Lancer le script /var/www/element/update_element.sh Le Script ne déplace pas les fichiers de customisation (logos de ville, page d'accueil...). En l'attente de l'automatisation par le script. Il faut copier les fichiers : → welcome_exemple.html → themes/element/img/logos/* → themes/element/img/background/* Synapse admin Source : https://github.com/Awesome-Technologies/synapse-admin?tab=readme-ov-file#steps-for-2 sudo systemctl stop synapse-admin sudo -iu synapse-admin git pull yarn install yarn start exit sudo systemctl start synapse-admin   Autrice originale de cette documentation : Annabelle Cortès