Como montar un servidor de mensajería compatible con Matrix en Debian

Logo del protocolo Matrix

El protocolo Matrix es un sistema descentralizado de mensajería instantánea con mucho potencial. En este tutorial les mostraré cómo montar un servidor de mensajería compatible con este protocolo en un servidor basado en Debian utilizando Matrix Synapse, el software de referencia para la implementación del protocolo.

Requisitos del sistema

  • Un servidor dedicado con buena refrigeración, ya que en caso de que nuestros usuarios entren a salas de chat con muchos usuarios en servidores externos la CPU de nuestro servidor estará trabajando al 100% durante periodos prolongados y nos convertiríamos en un vecino molesto en caso de usar un VPS
  • CPU de 2 hilos a 1.7 GHz para uso privado con 15 usuarios, CPU de 8 hilos a 2.4 o más en caso de que tener usuarios miembros de salas con muchos usuarios en servidores externos
  • 2GB de RAM para una instancia privada con 15 usuarios, 4GB o más si la base de datos reside en el servidor de mensajería
  • Una instancia de PostgreSQL (En el tutorial se muestra cómo montarla)
  • Un servidor de correo (hice un tutorial sobre cómo montar uno)

Primero agregaremos los repositorios de Matrix Synapse y lo instalamos

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

El instalador preguntará por el nombre de dominio que queremos para nuestro servidor (el dominio debe apuntar a nuestro servidor a través de un registro A)

Ahora montaremos una instancia de PostgreSQL

sudo apt install postgresql postgresql-contrib

Despues creamos una base de datos

sudo -u postgres psql
CREATE USER matrix;
CREATE DATABASE matrix
 ENCODING 'UTF8'
 LC_COLLATE='C'
 LC_CTYPE='C'
 template=template0
 OWNER matrix;
GRANT ALL PRIVILEGES ON DATABASE matrix TO matrix;
ALTER USER matrix WITH PASSWORD 'new_password';
\q

Ahora editamos el archivo de configuración principal de Matrix Synapse

sudo nano /etc/matrix-synapse/homeserver.yaml

Buscamos la siguiente sección

database:
  name: sqlite3
  args:
    database: /var/lib/matrix-synapse/homeserver.db

La reemplazamos por lo siguiente introduciendo las credenciales de nuestra base de datos

database:
  name: psycopg2
  args:
    user: <user>
    password: <pass>
    database: <db>
    host: <host>
    cp_min: 5
    cp_max: 10

Buscamos la siguiente sección e introducimos la dirección de nuestro servidor de mensajería

#public_baseurl: https://example.com/

Quedaría algo así

public_baseurl: https://matrix.asgardius.company

Buscamos la siguiente sección e introducimos las credenciales de nuestro servidor de correo

email:
  # The hostname of the outgoing SMTP server to use. Defaults to 'localhost'.
  #
  #smtp_host: mail.server

  # The port on the mail server for outgoing SMTP. Defaults to 25.
  #
  #smtp_port: 587

Debemos asegurarnos de que en el campo “notif_from” aparezca la dirección de correo desde la cual se envían las notificaciones ya que en caso contrario algunos servidores rechazarán nuestros correos de notificación (entre ellos Gmail)

Buscamos la siguiente línea

registration_shared_secret: <PRIVATE STRING>

La habilitamos y reemplazamos <PRIVATE STRING> por una cadena aletoria

Necesitamos un servidor web que funcione como proxy inverso, en este caso usaremos Apache. Primero necesitamos instalarlo junto a certbot para obtener un certificado SSL

sudo apt install apache2 certbot python3-certbot-apache

Creamos un archivo de host virtual

sudo nano /etc/apache2/sites-enabled/matrix.asgardius.company.conf

Con el siguiente contenido

<VirtualHost *:80>
DocumentRoot /var/www/html
ServerName matrix.asgardius.company
<Directory /var/www/html>
Options -Indexes +FollowSymLinks
AllowOverride All
</Directory>
</VirtualHost>

Ahora solicitamos el certificado

sudo certbot --apache

Editamos el archivo de configuración de Apache encargado de los puertos

sudo nano /etc/apache2/ports.conf

Buscamos el siguiente bloque

<IfModule ssl_module>
        Listen 443
</IfModule>

Agregamos el puerto 8448

<IfModule ssl_module>
        Listen 443 8448
</IfModule>

Modificamos el archivo del virtualhost que nos generó certbot

sudo nano /etc/apache2/sites-enabled/matrix.asgardius.company-le-ssl.conf

Lo dejamos así

<IfModule mod_ssl.c>
<VirtualHost *:443>
DocumentRoot /var/www/html
ServerName matrix.asgardius.company
<Directory /var/www/html>
Options -Indexes +FollowSymLinks
AllowOverride All
</Directory>

    ProxyPreserveHost on
    ProxyPass /_matrix http://127.0.0.1:8008/_matrix nocanon
    ProxyPassReverse /_matrix http://127.0.0.1:8008/_matrix
    ProxyPass /_synapse/client http://127.0.0.1:8008/_synapse/client nocanon
    ProxyPassReverse /_synapse/client http://127.0.0.1:8008/_synapse/client
    ProxyPass /_synapse/admin http://127.0.0.1:8008/_synapse/admin nocanon
    ProxyPassReverse /_synapse/admin http://127.0.0.1:8008/_synapse/admin

ServerAlias asgardius.company
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/matrix.asgardius.company/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/matrix.asgardius.company/privkey.pem
</VirtualHost>
</IfModule>

<IfModule mod_ssl.c>
<VirtualHost *:8448>
DocumentRoot /var/www/html
ServerName matrix.asgardius.company

    RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
    AllowEncodedSlashes NoDecode
    ProxyPass /_matrix http://127.0.0.1:8008/_matrix nocanon
    ProxyPassReverse /_matrix http://127.0.0.1:8008/_matrix

ServerAlias asgardius.company
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/matrix.asgardius.company/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/matrix.asgardius.company/privkey.pem
</VirtualHost>
</IfModule>

Habilitamos los módulos necesarios y reiniciamos los servicios

sudo a2enmod proxy proxy_http headers
sudo systemctl restart apache2
sudo systemctl restart matrix-synapse

Creamos la cuenta del administrador del sistema

sudo register_new_matrix_user -c /etc/matrix-synapse/homeserver.yaml http://localhost:8008

Ahora podemos utilizar el cliente de nuestra preferencia, recomiendo utilizar Element

Referencias

https://github.com/matrix-org/synapse/blob/master/INSTALL.md#debianubuntu

https://github.com/matrix-org/synapse/blob/master/docs/postgres.md

https://github.com/matrix-org/synapse/blob/master/docs/reverse_proxy.md

Dejar un comentario