Matrix es un protocolo de comunicación relativamente nuevo en el mundo del código abierto. Permite comunicarse de manera segura y descentralizada entre servidores, pero para eso primero es necesario configurar un servidor Synapse (así se llama), lo cual no siempre es tan fácil, sobre todo para personas no especializadas. Por eso, en este pequeño tutorial te ayudaré a instalar y configurar de manera muy básica un servidor Synapse para usar Matrix (si ya eres experto o buscas funciones avanzadas, este tutorial tal vez no sea para ti).

Hay muchas manera de lograr esta intalación, pero yo me enfocaré en la instalación fuente en un servidor Debian (testing) simplemente porque es la forma más familiar para mí (Docker me es extraño y oscuro).

¿Qué necesitamos?

Lo primero que necesitamos, por muy obvio que parezca, es un servidor. Partimos de que tenemos acceso al servidor vía ssh, con lo cual podemos moverle a todo como si estuviéramos en nuestra propia computadora.

Algo a tomar en cuenta es la capacidad del servidor. La realidad es que Matrix sí necesita más recursos que XMPP, IRC u otros protocolos, pero también puedes hacer más cosas aquí, por lo que es entendible. En mi caso, un usuario y algunas salas de chat me consumen cerca de 150 Mb de ram, por lo que una máquina con 2 Gb creo serán suficientes, aunque dependerá del uso que hagamos.

Nombre del servidor

Aquí es donde pueden empezar las confusiones. No es lo mismo ejemplo.org a matrix.ejemplo.org. Lo que buscamos es que nuestro servidor Synapse tenga un nombre reconocible fácilmente, por lo que lo ideal es que solo acabe como ejemplo.org.

Para eso debemos configurar ejemplo.org desde la instalación. Piensa bien el nombre porque no lo podrás modificar después, así que pon atención y antes de cualquier otra cosa, define qué quieres que aparezca después de tu usuario (@usuario:ejemplo.org).

Instalación

Para instalar Synapse primero necesitas los prerrequisitos. Escribe como superusuario:

apt install build-essential python3-dev libffi-dev python3-pip python3-setuptools libssl-dev virtualenv libjpeg-dev libxslt1-dev

Después podemos instalar Synapse, pero como Debian/Ubuntu acostumbran tener software muy viejo, lo mejor es instalar el repositorio oficial de matrix.org para tener algo más fresco:

apt install -y lsb-release wget apt-transport-https
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" | tee /etc/apt/sources.list.d/matrix-org.list
apt update
apt install matrix-synapse-py3

Una vez instalado te preguntará por tu homeserver; recuerda poner lo que quieres que vaya después de tu usuario. Y como en esta instalación básica no vamos a poner un cliente web ni una página de registro, no importa si tienes un blog o un sitio con ese mismo nombre, solo que deberás cambiar una línea en tu archivo de configuración homeserver.yaml (ve el tema Modificaciones al homeserver.yaml).

Usar PostgreSQL

Sé poco de bases de datos, y por conveniencia siempre he usado MariaDB, pero Matrix viene preconfigurado para usar SQLite, una base de datos que, dicen, es práctica por ser pequeña pero que hace que toooooodo lo que hagas en Matrix sea lento. Por eso debemos usar algo más elaborado, como PostgreSQL. Sigue la guía oficial para instalarlo en tu sistema y después instala la biblioteca para utilizarla con apt install libpq5.

Ya instalada necesitas configurar la base de datos. Escribe su - postgres y, una vez dentro, escribe createuser --pwprompt synapse_user para crear un usuario. Puedes poner lo que quieras en synapse_user, sólo asegúrate de recordar o anotar el usuario que creaste.

También puedes ponerle una contraseña a ese usuario para mayor seguridad, solo asegúrate de anotar cuál es porque la necesitaremos más tarde.

Ya con el usuario, y todavía dentro de tu sesión postgres, escribe psql, y después:

CREATE DATABASE synapse
 ENCODING 'UTF8'
 LC_COLLATE='C'
 LC_CTYPE='C'
 template=template0
 OWNER synapse_user;

Fíjate que ahí está el usuario, por lo que si cambiaste el nombre a otra cosa, debes ponerlo ahí junto a Owner y no olvides terminar con ;.

También necesitamos habilitar la autenticación por contraseña en PostgreSQL, por lo que necesitamos editar un archivo con nano /etc/postgresql/13/main/pg_hba.conf.

Dentro de ese archivo ve a la parte de # IPv4 local connections: y añade la línea

host    synapse     synapse_user    ::1/128     md5

Fíjate que tiene la palabra synapse (nombre de la base de datos) y synapse_user (usuario), así que si modificaste esos valores, también debes modificarlos aquí.

Certificado TLS

Es importante que configures bien el certificado para que la comunicación pueda ser cifrada. Sin eso ni siquiera podrías tener tu servidor federado por motivos de seguridad, así que es prácticamente obligatorio.

La manera recomendada de hacer esto es desde un reverse proxy. En mi caso utilizo Nginx, por lo que necesitamos crear el archivo conf de la siguiente manera: nano /etc/nginx/sites-available/matrix.conf. Ahí dentro debes poner:

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    # For the federation port
    listen 8448 ssl http2 default_server;
    listen [::]:8448 ssl http2 default_server;

    server_name ejemplo.org;

    location ~* ^(\/_matrix|\/_synapse\/client) {
        proxy_pass http://localhost:8008;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;

        # Nginx by default only allows file uploads up to 1M in size
        # Increase client_max_body_size to match max_upload_size defined in homeserver.yaml
        client_max_body_size 50M;
    }
}

Asegúrate de cambiar la línea que dice server_name para dejarla como tu nombre de servidor de Synapse, aunque debes tomar en cuenta que si ejemplo.org ya es tu blog o sitio web, deberás poner otra cosa para no tener conflicto.

En mi caso, tengo una página en https://suversionelectronica.org, y aunque mi homeserver de Synapse es suversionelectronica, tuve que poner matrix.suversionelectronica.org en la parte del server_name. En resumen: si bien el nombre de mi servidor Synapse es suversionelectronica, tuve que inventar el subdominio matrix.suversionelectronica.org y ponerlo en la configuración de Nginx para evitar errores tipo bad gateway.

Una vez configurado el servidor haz ln -s /etc/nginx/sites-available/matrix.conf /etc/nginx/sites-enabled/matrix.conf y reiniciar Nginx con systemctl restart nginx, con lo que ya debería estar publicado tu servidor Synapse, aunque todavía no esté listo para operar.

Por último, para tener un certificado válido lo mejor es utilizar el Certbot de EFF. Con esa herramienta gratuita podrás tener el certificado configurado de manera automática para que todo funcione.

Delegación

Este paso es opcional solo si tu homeserver es uno y tu base_url es otra, como en el ejemplo que di anteriormente. El «problema» es que el nombre del servidor no está en Nginx apuntando al puerto 8448, que es el que los otros servidores de Matrix buscan, por eso es necesario hacer un pequeño truco que le diga a los otros servidores cómo buscar el tuyo.

El truco aquí es crear un archivo json en esta dirección: https://ejemplo.org/.well-known/matrix/server; debería ser algo así, dependiendo tu configuración: nano /var/html/[servidor]/.well-known/matrix/server. Una vez en ese archivo escribe:

{
    "m.server": "[tu homeserver de matrix]"
}

Esto hará que, a pesar de que tu reverse proxy y tu base_url apunten a https://matrix.ejemplo.org, los servidores de Matrix con los que se comunique el tuyo buscarán el nombre de tu homeserver, con lo cual todo funcionará como debe.

Nota también que, en este caso, necesitarás un registro A en tu configuración DNS que conecte con matrix.ejemplo.org, o sea con la base_url.

Modificaciones al homeserver.yaml

Ya casi terminamos, ahora solo debemos ajustar algunos parámetros en las configuraciones y todo estará listo.

Abre tu archivo de configuración: nano /etc/matrix-synapse/homeserver.yaml y busca la línea public_baseurl:, asegúrate de que es el mismo servidor que en tu archivo de configuración de Nginx (con https:// y toda la cosa). Esta misma URL es la que deberás poner en la entrada de Servidor base cuando te quieras conectar a Matrix. En mi ejemplo, aquí debe ir matrix.suversionelectronica.org, y como mi homeserver quedó simplemente como suversionelectronica, mi usuario será @babel:suversionelectronica.org.

También busca la línea registration_shared_secret:, debes poner ahí lo que sea, unos 5 o 10 caracteres entre letras y números son suficientes. Esto es solo para que el script de crear usuario tenga cómo hacerlo, así que no necesitas recordar ni anotar esa contraseña, pero mantenla secreta o cualquiera con ella podrá crear usuarios, incluso si tu servidor tiene la configuración enable_registration: false.

Por último pon los parámetros de la base de datos: busca la línea# Example Postgres configuration: y descomenta lo que sea necesario para que quede de esta manera:

database:
  name: psycopg2
  args:
    user: synapse_user
    password: [contraseña del usuario]
    database: synapse
    host: localhost
    cp_min: 5
    cp_max: 10

En user, password y database debes poner tus propios parámetros de cuando hiciste la base de datos.

Hay muchas opciones más ahí como configurar un servidor de correo, el servidor TURN para videollamadas y otras cosas, pero nos limitaremos a esto para tener el mínimo indispensable y poder entrar y mandar mensajes.

Para terminar, puedes confirmar que tu servidor funciona y la federación es correcta en este sitio. Escribe en el campo de servername tu homeserver. Si todo está bien, deberás ver el texto success.

Registro de usuarios

Como este ejemplo es muy básico no tenemos un sitio web al cual ir para registrarnos, así que los usuarios que queramos crear los haremos a través de la terminal. Simplemente escribe register_new_matrix_user -c homeserver.yaml http://localhost:8008 y obtendrás la siguiente respuesta:

New user localpart: usuario
Password:
Confirm password:
Make admin [no]:
Success!

Si Synapse lanza el error Shared secret registration is not enabled y estás seguro que sí pusiste algo en la línea registration_shared_secret:, intenta reiniciando Synapse con systemctl restart matrix-synapse; a mí me pasó un par de veces y con eso se resolvió.

Y eso es todo, ahora solo debes descargar un cliente de Matrix o utilizarlo vía web, en la parte del servidor escribir tu base_url y hacer login. Yo recomiendo SchildiChat porque ya soporta cifrado y otros clientes igual o más lindos aún no, aunque esperemos eso cambie pronto.

Bonus: canales de Matrix

Cuando utilizamos nuevos medios de comunicación siempre pasa que estamos solos. Acá no es que te vayas a encontrar a tu pareja o a tu tío, pero ya hay muchas comunidades —sobre todo de software libre— que están utilizando este protocolo. Entre ellas podemos destacar el Miau, una comunidad que nació en Telegram y que describe su quehacer como «Edición, bibliotecología y acceso al conocimiento desde el software libre». Puedes unirte a esta comunidad en Matrix (con puente en vivo a Telegram gracias a (@freeman:matrix.cuatrolibertades.org) yendo a «Explorar salas públicas» y escribiendo #miau:matrix.cuatrolibertades.org.

También hay muchas otras salas que puedes encontrar, como #hackerslatam:matrix.org, #ranchoelectronico:matrix.org o varios más, así que métete a buscar y seguro encontrarás alguna comunidad interesante.