====== Papoter avec Matrix ====== **Matrix** est un protocole de bavardage, assez proche de //irc//, qui permet de créer des salons et surtout de chiffrer de bout en bout. Cet article va vous décrire l'installation d'un [[https://matrix.org/|serveur Matrix]], dans une [[jails:zfs|jail]]. Vous devez vous préparer à fournir les [[https://www.freebsd.org/doc/handbook/ports.html|ports]] suivants: - un serveur web, ici [[ports:nginx|nginx]]; - un mécanisme pour fournir des clefs pour https, ici [[https://www.freshports.org/security/py-certbot-nginx|py-certbot-nginx]]; Ainsi qu'un serveur de base de données [[https://www.postgresql.org/|PostgreSQL]], installée dans une [[ports:db:postgresql|jail]], pour cet exemple. ===== La jail ===== Préparez une [[jails:zfs|jail]] nommée ''matrix'', dans le répertoire ''/jails/matrix'' avec les paramètres suivants: matrix { host.hostname = matrix; # Hostname ip4.addr = "lo1|192.168.0.11"; # IP address of the jail mount.devfs; # /dev/random pour SSL mount.fdescfs; # améliore les performances de python path ="/jails/matrix"; # Path to the jail exec.start = "/bin/sh /etc/rc"; # Start command exec.stop = "/bin/sh /etc/rc.shutdown"; # Stop command depend=pg; # depend on postgresql jail } Adaptez la configuration de la //jail// ''matrix'': hostname = "matrix" On assure le démarrage au reboot: sysrc jail_enable = "YES" sysrc jail_list += "matrix" ===== La base de donnée ===== Préparez votre base de donnée pour [[https://github.com/matrix-org/synapse/blob/master/docs/postgres.md|synapse-matrix]]. Dans cet exemple, le serveur est confiné dans une //jail// nommée ''pg'': root@pg:/ # su - postgres $ createuser --pwprompt synapse_user Enter password for new role: Enter it again: $ psql psql (11.7) Type "help" for help. postgres=# CREATE DATABASE synapse ENCODING 'UTF8' LC_COLLATE='C' LC_CTYPE='C' template=template0 OWNER synapse_user; CREATE DATABASE postgres=# ===== Le serveur web ===== Créez une entrée DNS, ici ''kreuz.lapinbilly.eu'', pour votre serveur et rediriger le tout vers la //jail// ''matrix''. Obtenez un certificat **SSL**. root@popeye:/jails# certbot certonly --nginx -d kreuz.lapinbilly.eu Rediriger les requêtes vers votre //jail//, pour cela, on va définir un fichier dédié pour //nginx//. ssl_certificate /usr/local/etc/letsencrypt/live/kreuz.lapinbilly.eu/fullchain.pem; ssl_certificate_key /usr/local/etc/letsencrypt/live/kreuz.lapinbilly.eu/privkey.pem; add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection "1; mode=block"; add_header X-Frame-Options "SAMEORIGIN" always; add_header Strict-Transport-Security "max-age=31536000"; location ~ ^(/_matrix|/_synapse/client) { proxy_pass http://192.168.0.20:8008; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $host; client_max_body_size 50M; proxy_http_version 1.1; } Et l'utiliser dans nos [[:ports:nginx#serveur|serveurs nginx]] server { http2 on; listen 443 ssl; listen [::]:443 ssl; server_name kreuz.lapinbilly.eu; include matrix.conf; } server { http2 on; listen 8448 ssl default_server; listen [::]:8448 ssl default_server; server_name kreuz.lapinbilly.eu; include matrix.conf; } Le serveur en ''8448'', ne sert que si vous voulez rejoindre une fédération. N'oubliez pas d'ouvrir le pare-feu sur ce port. Par exemple, en l'ajoutant dans les ''tcp_services'' de pf.conf(5) ===== Installer ===== Installez le port [[https://www.freshports.org/net-im/py-matrix-synapse/|net-im/py-matrix-synapse]] dans la //jail// ''matrix'': root@popeye:# pkg -j matrix install net-im/py-matrix-synapse root@popeye:# sysrc -j matrix synapse_enable="YES" Vous allez probablement devoir [[https://matrix-org.github.io/synapse/latest/usage/administration/admin_api/|administrer ce serveur]], le chemin le plus court est d'utiliser [[https://www.freshports.org/ftp/curl/|curl]]. Le port va créer un utilisateur et groupe ''synapse'', ainsi qu'un [[https://www.freebsd.org/doc/handbook/configtuning-starting-services.html|script de démarrage]] du même nom. Construisez le serveur: root@popeye:# jexec matrix root@matrix: cd /usr/local/etc/matrix-synapse/ python3.7 -m synapse.app.homeserver --server-name kreuz.lapinbilly.eu --config-path homeserver.yaml --generate-config --report-stats=no Assurez vous l'utilisateur ''synapse'' ait la permission de lire ces fichiers et d'écrire dans ce répertoire. Au besoin, créer la hierarchie ''media_store'': mkdir -p /usr/local/etc/matrix-synapse/media_store/local_content mkdir -p /usr/local/etc/matrix-synapse/media_store/local_thumbnails mkdir -p /usr/local/etc/matrix-synapse/media_store/remote_content mkdir -p /usr/local/etc/matrix-synapse/media_store/remote_thumbnail chown -R synapse /usr/local/etc/matrix-synapse/media_store chown synapse /usr/local/etc/matrix-synapse ==== Configurer ==== Adaptez le serveur à la //jail// et au serveur de base de données, c'est à dire permettre au serveur **matrix** d'écouter les requêtes venant de l'hôte et lui indiquer le chemin vers le serveur **PostgreSQL**. --- homeserver.yaml 2020-04-12 11:27:03.532105000 +0000 +++ /usr/local/etc/matrix-synapse/homeserver.yaml 2020-04-12 10:00:51.404995000 +0000 @@ -208,7 +208,7 @@ tls: false type: http x_forwarded: true - bind_addresses: ['::1', '127.0.0.1'] + bind_addresses: ['192.168.0.11'] resources: - names: [client, federation] @@ -554,12 +554,16 @@ ## Database ## database: - # The database engine name - name: "sqlite3" + name: "psycopg2" # Arguments to pass to the engine args: - # Path to the database - database: "/usr/local/www/syn/homeserver.db" + database: "synapse" + user: "synapse_user" + password: "yourpassword" + host: 192.168.0.10 + port: 5432 + cp_min: 5 + cp_max: 10 Réglez la [journalisation](https://github.com/matrix-org/synapse/blob/develop/docs/sample_log_config.yaml) pour que le fichier soit produit dans ''/var/log/'' filename: /var/log/matrix-synapse/homeserver.log Autorisez le nettoyage des journaux par newsyslog(8): /var/log/matrix-synapse/homeserver.log synapse:wheel 640 7 1000 * J ==== Mise en Service ==== Terminez l'installation en donnant les droits d'utilisation à l'utilisateur ''synapse'' sur son serveur: root@matrix:/usr/local/etc# chown -R synapse matrix-synapse/ Démarrez le service: root@matrix:/usr/local/etc# service synapse start Starting synapse. 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. -------------------------------------------------------------------------------- 2020-04-12 09:31:51,783 - twisted - 192 - INFO - None - Redirected stdout/stderr to logs 2020-04-12 09:31:51,784 - root - 257 - WARNING - None - ***** STARTING SERVER ***** 2020-04-12 09:31:51,784 - root - 258 - WARNING - None - Server /usr/local/lib/python3.7/site-packages/synapse/app/homeserver.py version 1.10.0 2020-04-12 09:31:51,784 - root - 259 - INFO - None - Server hostname: kreuz.lapinbilly.eu 2020-04-12 09:31:51,784 - synapse.app.homeserver - 340 - INFO - None - Setting up server 2020-04-12 09:31:51,784 - synapse.server - 240 - INFO - None - Setting up. 2020-04-12 09:31:51,800 - synapse.storage.data_stores - 48 - INFO - None - Preparing database 'master'... 2020-04-12 09:31:55,423 - synapse.storage.prepare_database - 309 - INFO - None - Upgrading schema to v55 2020-04-12 09:31:55,424 - synapse.storage.prepare_database - 389 - INFO - None - Applying schema 55/access_token_expiry.sql 2020-04-12 09:31:55,425 - synapse.storage.prepare_database - 389 - INFO - None - Applying schema 55/track_threepid_validations.sql 2020-04-12 09:31:55,492 - synapse.storage.prepare_database - 389 - INFO - None - Applying schema 55/users_alter_deactivated.sql 2020-04-12 09:31:55,493 - synapse.storage.prepare_database - 309 - INFO - None - Upgrading schema to v56 2020-04-12 09:31:55,494 - synapse.storage.prepare_database - 389 - INFO - None - Applying schema 56/add_spans_to_device_lists.sql 2020-04-12 09:31:55,495 - synapse.storage.prepare_database - 389 - INFO - None - Applying schema 56/current_state_events_membership.sql 2020-04-12 09:31:55,496 - synapse.storage.prepare_database - 389 - INFO - None - Applying schema 56/current_state_events_membership_mk2.sql 2020-04-12 09:31:55,496 - synapse.storage.prepare_database - 389 - INFO - None - Applying schema 56/delete_keys_from_deleted_backups.sql 2020-04-12 09:31:55,497 - synapse.storage.prepare_database - 389 - INFO - None - Applying schema 56/destinations_failure_ts.sql 2020-04-12 09:31:55,498 - synapse.storage.prepare_database - 393 - INFO - None - Applying engine-specific schema 56/destinations_retry_interval_type.sql.postgres 2020-04-12 09:31:55,519 - synapse.storage.prepare_database - 389 - INFO - None - Applying schema 56/device_stream_id_insert.sql 2020-04-12 09:31:55,520 - synapse.storage.prepare_database - 389 - INFO - None - Applying schema 56/devices_last_seen.sql 2020-04-12 09:31:55,521 - synapse.storage.prepare_database - 389 - INFO - None - Applying schema 56/drop_unused_event_tables.sql 2020-04-12 09:31:55,524 - synapse.storage.prepare_database - 389 - INFO - None - Applying schema 56/event_expiry.sql 2020-04-12 09:31:55,551 - synapse.storage.prepare_database - 389 - INFO - None - Applying schema 56/event_labels.sql 2020-04-12 09:31:55,579 - synapse.storage.prepare_database - 389 - INFO - None - Applying schema 56/event_labels_background_update.sql 2020-04-12 09:31:55,580 - synapse.storage.prepare_database - 389 - INFO - None - Applying schema 56/fix_room_keys_index.sql 2020-04-12 09:31:55,589 - synapse.storage.prepare_database - 389 - INFO - None - Applying schema 56/hidden_devices.sql 2020-04-12 09:31:55,590 - synapse.storage.prepare_database - 389 - INFO - None - Applying schema 56/nuke_empty_communities_from_db.sql 2020-04-12 09:31:55,595 - synapse.storage.prepare_database - 389 - INFO - None - Applying schema 56/public_room_list_idx.sql 2020-04-12 09:31:55,602 - synapse.storage.prepare_database - 389 - INFO - None - Applying schema 56/redaction_censor.sql 2020-04-12 09:31:55,602 - synapse.storage.prepare_database - 389 - INFO - None - Applying schema 56/redaction_censor2.sql 2020-04-12 09:31:55,603 - synapse.storage.prepare_database - 393 - INFO - None - Applying engine-specific schema 56/redaction_censor3_fix_update.sql.postgres 2020-04-12 09:31:55,604 - synapse.storage.prepare_database - 389 - INFO - None - Applying schema 56/redaction_censor4.sql 2020-04-12 09:31:55,605 - synapse.storage.prepare_database - 389 - INFO - None - Applying schema 56/remove_tombstoned_rooms_from_directory.sql 2020-04-12 09:31:55,606 - synapse.storage.prepare_database - 389 - INFO - None - Applying schema 56/room_key_etag.sql 2020-04-12 09:31:55,606 - synapse.storage.prepare_database - 389 - INFO - None - Applying schema 56/room_membership_idx.sql 2020-04-12 09:31:55,607 - synapse.storage.prepare_database - 389 - INFO - None - Applying schema 56/room_retention.sql 2020-04-12 09:31:55,633 - synapse.storage.prepare_database - 389 - INFO - None - Applying schema 56/signing_keys.sql 2020-04-12 09:31:55,706 - synapse.storage.prepare_database - 389 - INFO - None - Applying schema 56/signing_keys_nonunique_signatures.sql 2020-04-12 09:31:55,715 - synapse.storage.prepare_database - 389 - INFO - None - Applying schema 56/state_group_room_idx.sql 2020-04-12 09:31:55,715 - synapse.storage.prepare_database - 389 - INFO - None - Applying schema 56/stats_separated.sql 2020-04-12 09:31:55,831 - synapse.storage.prepare_database - 378 - INFO - None - Running script 56/unique_user_filter_index.py 2020-04-12 09:31:55,848 - synapse.storage.prepare_database - 389 - INFO - None - Applying schema 56/user_external_ids.sql 2020-04-12 09:31:55,865 - synapse.storage.prepare_database - 389 - INFO - None - Applying schema 56/users_in_public_rooms_idx.sql 2020-04-12 09:31:55,873 - synapse.storage.prepare_database - 309 - INFO - None - Upgrading schema to v57 2020-04-12 09:31:55,874 - synapse.storage.prepare_database - 389 - INFO - None - Applying schema 57/delete_old_current_state_events.sql 2020-04-12 09:31:55,874 - synapse.storage.prepare_database - 389 - INFO - None - Applying schema 57/device_list_remote_cache_stale.sql 2020-04-12 09:31:55,899 - synapse.storage.prepare_database - 378 - INFO - None - Running script 57/local_current_membership.py 2020-04-12 09:31:55,954 - synapse.storage.prepare_database - 389 - INFO - None - Applying schema 57/rooms_version_column.sql 2020-04-12 09:31:55,988 - synapse.storage.data_stores - 58 - INFO - None - Starting 'main' data store 2020-04-12 09:31:55,998 - synapse.storage.data_stores.main.event_push_actions - 499 - INFO - None - Searching for stream ordering 1 month ago 2020-04-12 09:31:55,999 - synapse.storage.data_stores.main.event_push_actions - 504 - INFO - None - Found stream ordering 1 month ago: it's 0 2020-04-12 09:31:55,999 - synapse.storage.data_stores.main.event_push_actions - 506 - INFO - None - Searching for stream ordering 1 day ago 2020-04-12 09:31:55,999 - synapse.storage.data_stores.main.event_push_actions - 511 - INFO - None - Found stream ordering 1 day ago: it's 0 2020-04-12 09:31:56,005 - synapse.storage.data_stores - 68 - INFO - None - Starting 'state' data store 2020-04-12 09:31:56,005 - synapse.storage.data_stores - 81 - INFO - None - Database 'master' prepared 2020-04-12 09:31:56,005 - synapse.server - 243 - INFO - None - Finished setting up. root@matrix:/usr/local/etc/matrix-synapse# sockstat -l USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS synapse python3.7 59360 14 tcp4 192.168.0.11:8008 *:* root syslogd 58747 5 dgram /var/run/log root syslogd 58747 6 dgram /var/run/logpriv === Chef === Déclarez vous en tant qu'administrateur sur le serveur, une fois votre compte créé: $ psql psql (11.17) Type "help" for help. postgres=# \c synapse You are now connected to database "synapse" as user "postgres". synapse=# UPDATE users SET admin = 1 WHERE name ='patron:kreuz.lapinbilly.eu' synapse-# === Web === Redémarrez votre serveur web avec la nouvelle configuration root@popeye:# service nginx restart et ajoutez au moins un utilisateur au serveur matrix: root@matrix:/usr/local/etc/matrix-synapse# register_new_matrix_user -c homeserver.yaml https://kreuz.lapinbilly.eu:443 New user localpart [root]: Password: Confirm password: Make admin [no]: yes Sending registration request... Success! Une exemple par la pratique: [[https://reuz.lapinbilly.eu/#/room/#bistrot:kreuz.lapinbilly.eu|kreuz.lapinbilly.eu]] ===== Papoter ===== Pour papoter il vous faut un [[https://about.riot.im/|client]] et ajouter des utilisateurs, selon la procédure [[ports:web:matrix#Démarrage|indiquée précédemment]]. Tant que vous y êtes, créez votre [[ports:web:element-web|propre client]]. ===== auto configuration ===== Vous allez indiquer, via des requêtes ''json'' données directement pas nginx, des informations sur votre serveur. Créez un répertoire dédié: root@popeye:# mkdir -p .well-known/matrix Donnez le à manger à Nginx, sous votre serveur ''https'' (443) par défaut. Il ne s'agit pas nécessairement de votre serveur **matrix**. location /.well-known/matrix/ { root /usr/local/www/; default_type application/json; add_header Access-Control-Allow-Origin *; } * Donnez un client par défaut: { "m.homeserver": { "base_url": "https://reuz.lapinbilly.eu" } } * Donnez un serveur par délégation, pour rejoindre une fédération: { "m.server": "kreuz.lapinbilly.eu:443" } ===== Administrer ===== L'[[https://matrix-org.github.io/synapse/latest/usage/administration/admin_api/|API]] est une interface Web à laquelle vous faites digérer du ''Json''. Par exemple, supprimer un salon: curl --header "Authorization: Bearer Token_en_general_super_long" -X DELETE 'http://127.0.0.1:8008/_synapse/admin/v2/rooms/\!AYMErYZsVkpvmBlNkg:kreuz.lapinbilly.eu' -d '{"room_name":"newtest", "message":"salon precedent supprime."}' Le token est donné par votre profil utilisateur, sous ''element-web'', il se trouve à la rubrique ''aide et a propos''.