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:
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:
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"
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.
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
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; }
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.
--- 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
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
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-#
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!
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.
location /.well-known/matrix/ { root /usr/local/www/; default_type application/json; add_header Access-Control-Allow-Origin *; }
{ "m.homeserver": { "base_url": "https://reuz.lapinbilly.eu" } }
{ "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
.