====== 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''.