ports:web:matrix

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 serveur Matrix, dans une jail.

Vous devez vous préparer à fournir les ports suivants:

  1. un serveur web, ici nginx;
  2. un mécanisme pour fournir des clefs pour https, ici py-certbot-nginx;

Ainsi qu'un serveur de base de données PostgreSQL, installée dans une jail, pour cet exemple.

Préparez une jail nommée matrix, dans le répertoire /jails/matrix avec les paramètres suivants:

/etc/jail.conf
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:

matrix/etc/rc.conf.local
hostname = "matrix"

On assure le démarrage au reboot:

sysrc jail_enable  = "YES"
sysrc jail_list   += "matrix"

Préparez votre base de donnée pour 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=# 

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.

/usr/local/etc/nginx/matrix.conf
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 serveurs nginx

/usr/local/etc/nginx/nginx.conf
   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)

Installez le port 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 administrer ce serveur, le chemin le plus court est d'utiliser curl.

Le port va créer un utilisateur et groupe synapse, ainsi qu'un 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

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.

/usr/local/etc/matrix-synapse/homeserver.yaml
--- 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/

serveur-name.log.config
filename: /var/log/matrix-synapse/homeserver.log

Autorisez le nettoyage des journaux par newsyslog(8):

/etc/newsyslog.conf.d/matrix.conf
/var/log/matrix-synapse/homeserver.log    synapse:wheel   640  7    1000   *   J

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: kreuz.lapinbilly.eu

Pour papoter il vous faut un client et ajouter des utilisateurs, selon la procédure indiquée précédemment.

Tant que vous y êtes, créez votre propre client.

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.

/usr/local/etc/nginx/nginx.conf
                 location /.well-known/matrix/ {
                        root /usr/local/www/;
                        default_type application/json;
                        add_header Access-Control-Allow-Origin  *;
                }
  • Donnez un client par défaut:
/usr/local/www/.well-known/matrix/client
{
       "m.homeserver": {
                "base_url": "https://reuz.lapinbilly.eu"
        }
}
  • Donnez un serveur par délégation, pour rejoindre une fédération:
/usr/local/www/.well-known/matrix/server
{
        "m.server": "kreuz.lapinbilly.eu:443"
}

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

  • ports/web/matrix.txt
  • Dernière modification : 2024/06/30 06:51
  • de david