
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