Cómo instalar y crear un servidor de chat con Matrix Synapse y Element en Debian 12

Matrix es un estándar abierto para la comunicación descentralizada y encriptada de extremo a extremo. Es una colección de servidores y servicios que se comunican entre sí mediante una API estandarizada que se sincroniza en tiempo real. Utiliza servidores domésticos para almacenar la información de las cuentas y el historial de chat. Si un servidor doméstico se cae, otros servidores pueden continuar la comunicación sin problemas debido a la naturaleza de la descentralización. Puedes utilizar un servidor doméstico de Matrix alojado por otra persona o alojar el tuyo propio para mantener el control sobre tus datos.

En este tutorial, aprenderás a instalar y crear un servidor de chat utilizando Synapse, una implementación de servidor doméstico de Matrix. Element es un cliente web de Matrix construido utilizando el SDK React de Matrix. Esto te permitirá ofrecer el chat de Matrix en la web. También puedes utilizar el servidor utilizando cualquier otro cliente Matrix de tu elección. También instalaremos el servidor Coturn para permitir llamadas de voz y vídeo. El servicio Coturn es opcional por si no te interesa utilizarlo.

Requisitos previos

  1. Un servidor con Debian 12.
  2. Un usuario no usuario con privilegios de root.
  3. El Cortafuegos sin complicaciones(UFW) está activado y en ejecución.
  4. Nombres de dominio completos (FQDN) para Matrix, Element y Coturn que apunten a tu servidor. Utilizaremos matrix.example.com, element.example.com, y coturn.example.com respectivamente para los tres servicios.
  5. Asegúrate de que todo está actualizado.
    $ sudo apt update && sudo apt upgrade
    

Paso 1 – Configurar el Cortafuegos

Antes de instalar ningún paquete, el primer paso es configurar el cortafuegos para que abra los puertos para HTTP, HTTPS y Synapse.

Comprueba el estado del cortafuegos.

$ sudo ufw status

Deberías ver algo como lo siguiente

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

Abre los puertos HTTP, HTTPS y Synapse en el cortafuegos.

$ sudo ufw allow 8448
$ sudo ufw allow http
$ sudo ufw allow https

Vuelve a comprobar el estado para confirmarlo.

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443                        ALLOW       Anywhere
8448                       ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)
8448 (v6)                  ALLOW       Anywhere (v6)

Paso 2 – Instala Matrix Synapse

Añade la clave GPG de Matrix.

$ sudo wget -O /usr/share/keyrings/matrix-org-archive-keyring.gpg https://packages.matrix.org/debian/matrix-org-archive-keyring.gpg

Añade el repositorio APT de Matrix.

$ 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

Actualiza la lista de repositorios del sistema.

$ sudo apt update

Instala Matrix Synapse.

$ sudo apt install matrix-synapse-py3

Durante la instalación, se te pedirá el nombre del servidor, que forma parte de tu ID de Matrix. Introduce en su lugar tu nombre de dominio Matrix. Éste actuará como dirección de tu servidor doméstico.

Configuración del servidor doméstico Matrix

También se te preguntará si deseas enviar estadísticas anónimas sobre tu servidor doméstico a Matrix. Escribe N para rechazarlo.

Configuración de las estadísticas de uso de la matriz

Puedes cambiar estos ajustes más adelante en el archivo /etc/matrix-synapse/conf.d/server_name.yaml.

El servicio de Matrix Synapse se activa e inicia durante la instalación. Comprueba el estado del servicio.

$ sudo systemctl status matrix-synapse
? matrix-synapse.service - Synapse Matrix homeserver
     Loaded: loaded (/lib/systemd/system/matrix-synapse.service; enabled; preset: enabled)
     Active: active (running) since Mon 2023-10-02 07:47:43 UTC; 1min 33s ago
    Process: 1558 ExecStartPre=/opt/venvs/matrix-synapse/bin/python -m synapse.app.homeserver --config-path=/etc/matrix-synapse/homeserver.yaml --config-path=/etc/matrix-synapse/conf.d/ --generate-keys (code=>
   Main PID: 1563 (python)
      Tasks: 8 (limit: 2315)
     Memory: 102.7M
        CPU: 3.609s
     CGroup: /system.slice/matrix-synapse.service
             ??1563 /opt/venvs/matrix-synapse/bin/python -m synapse.app.homeserver --config-path=/etc/matrix-synapse/homeserver.yaml --config-path=/etc/matrix-synapse/conf.d/

Oct 02 07:47:41 lomp matrix-synapse[1558]: Generating signing key file /etc/matrix-synapse/homeserver.signing.key
Oct 02 07:47:43 lomp matrix-synapse[1563]: This server is configured to use 'matrix.org' as its trusted key server via the
Oct 02 07:47:43 lomp matrix-synapse[1563]: 'trusted_key_servers' config option. 'matrix.org' is a good choice for a key
Oct 02 07:47:43 lomp matrix-synapse[1563]: server since it is long-lived, stable and trusted. However, some admins may
Oct 02 07:47:43 lomp matrix-synapse[1563]: wish to use another server for this purpose.
Oct 02 07:47:43 lomp matrix-synapse[1563]: To suppress this warning and continue using 'matrix.org', admins should set
Oct 02 07:47:43 lomp matrix-synapse[1563]: 'suppress_key_server_warning' to 'true' in homeserver.yaml.
Oct 02 07:47:43 lomp matrix-synapse[1563]: --------------------------------------------------------------------------------
Oct 02 07:47:43 lomp matrix-synapse[1563]: Config is missing macaroon_secret_key
Oct 02 07:47:43 lomp systemd[1]: Started matrix-synapse.service - Synapse Matrix homeserver.

Paso 3 – Instalar y configurar PostgreSQL

Utilizaremos el repositorio oficial APT de PostgreSQL para instalar la última versión de PostgreSQL. Ejecuta el siguiente comando para añadir la clave GPG de PostgreSQL.

$ curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /usr/share/keyrings/postgresql-key.gpg >/dev/null

Añade el repositorio APT a tu lista de fuentes.

$ sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/postgresql-key.gpg arch=amd64] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'

Actualiza el repositorio del sistema.

$ sudo apt update

Ahora, puedes instalar PostgreSQL utilizando el siguiente comando.

$ sudo apt install postgresql postgresql-contrib

En el momento de escribir este tutorial, PostgreSQL 16 es la última versión. Para instalar una versión diferente, modifica el comando como se indica a continuación, que instalará en su lugar PostgreSQL 14.

$ sudo apt install postgresql-14 postgresql-contrib-14

Comprueba el estado del servicio PostgreSQL.

$ sudo systemctl status postgresql
? postgresql.service - PostgreSQL RDBMS
     Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; preset: enabled)
     Active: active (exited) since Mon 2023-10-02 07:51:10 UTC; 13s ago
   Main PID: 4001 (code=exited, status=0/SUCCESS)
        CPU: 1ms

Oct 02 07:51:10 lomp systemd[1]: Starting postgresql.service - PostgreSQL RDBMS...
Oct 02 07:51:10 lomp systemd[1]: Finished postgresql.service - PostgreSQL RDBMS.

Puedes ver que el servicio está activado y funcionando por defecto.

Accede a la cuenta del sistema postgres.

$ sudo -su postgres

Crea un nuevo usuario de base de datos y una base de datos para PostgreSQL.

$ createuser --pwprompt synapse
$ createdb --encoding=UTF8 --locale=C --template=template0 --owner=synapse synapsedb

Sal de la cuenta postgres.

$ exit

Paso 4 – Instalar Nginx

Para el entorno de producción, se recomienda ejecutar el servidor Synapse utilizando un proxy Nginx.

Debian 12 incluye una versión antigua de Nginx. Para instalar la última versión, tienes que descargar el repositorio oficial de Nginx.

Importa la clave de firma de Nginx.

$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

Añade el repositorio de la versión estable de Nginx.

$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/debian `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list

Actualiza los repositorios del sistema.

$ sudo apt update

Instala Nginx.

$ sudo apt install nginx

Verifica la instalación. Como estamos utilizando Debian, es necesario ejecutar el siguiente comando con permiso sudo.

$ sudo nginx -v
nginx version: nginx/1.24.0

Inicia el servidor Nginx.

$ sudo systemctl start nginx

Comprueba el estado del servicio.

$ sudo systemctl status nginx
? nginx.service - nginx - high performance web server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; preset: enabled)
     Active: active (running) since Mon 2023-10-02 07:59:12 UTC; 1s ago
       Docs: https://nginx.org/en/docs/
    Process: 5767 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
   Main PID: 5768 (nginx)
      Tasks: 2 (limit: 2315)
     Memory: 1.7M
        CPU: 7ms
     CGroup: /system.slice/nginx.service
             ??5768 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
             ??5769 "nginx: worker process"

Paso 5 – Instalar SSL

Necesitamos instalar Certbot para generar certificados SSL gratuitos ofrecidos por Let’s Encrypt. Puedes instalar Certbot utilizando el repositorio de Debian u obtener la última versión utilizando la herramienta Snapd. Nosotros utilizaremos la versión Snapd.

Debian 12 no viene con Snapd instalado. Ejecuta el siguiente comando para instalar Snapd.

$ sudo apt install snapd -y

Ejecuta los siguientes comandos para asegurarte de que tu versión de Snapd está actualizada.

$ sudo snap install core
$ sudo snap refresh core

Instala Certbot.

$ sudo snap install --classic certbot

Utiliza el siguiente comando para asegurarte de que se puede ejecutar el comando Certbot creando un enlace simbólico al directorio /usr/bin.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Comprueba la versión de Certbot.

$ certbot --version
certbot 2.6.0

Ejecuta el siguiente comando para generar un certificado SSL.

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d matrix.example.com

El comando anterior descargará un certificado en el directorio /etc/letsencrypt/live/matrix.example.com de tu servidor.

Genera un certificado de grupo Diffie-Hellman.

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Comprueba el servicio programador de renovación de Certbot.

$ sudo systemctl list-timers

Encontrarás snap.certbot.renew.service como uno de los servicios programados para ejecutarse.

NEXT                        LEFT        LAST                        PASSED       UNIT                         ACTIVATES
.....
Mon 2023-10-02 16:33:00 UTC 8h left       -                           -          snap.certbot.renew.timer     snap.certbot.renew.service
Tue 2023-10-03 00:00:00 UTC 15h left      -                           -          dpkg-db-backup.timer         dpkg-db-backup.service
Tue 2023-10-03 00:00:00 UTC 15h left      Mon 2023-10-02 07:38:16 UTC 26min ago  exim4-base.timer             exim4-base.service

Realiza una ejecución en seco del proceso para comprobar si la renovación SSL funciona correctamente.

$ sudo certbot renew --dry-run

Si no ves ningún error, ya está todo listo. Tu certificado se renovará automáticamente.

Paso 6 – Configurar Matrix Synapse

Puedes configurar el servidor Matrix a través del archivo /etc/matrix-synapse/homeserver.yaml, pero no es recomendable porque se sobrescribe después de cada actualización. Para uso en producción, debes colocar los archivos de configuración en la carpeta /etc/matrix-synapse/conf.d.

La instalación de Synapse creó dos archivos de configuración en la carpeta /etc/matrix-synapse/conf.d.

$ ls /etc/matrix-synapse/conf.d
report_stats.yaml  server_name.yaml

Crea un nuevo archivo de configuración para la base de datos y ábrelo para editarlo.

$ sudo nano /etc/matrix-synapse/conf.d/database.yaml

Pega las siguientes líneas en el editor. Sustituye el campo your-password por la contraseña de usuario PostgreSQL que creaste en el paso 3. Sustituye localhost por la dirección IP de tu servidor, si alojas la base de datos en otro lugar.

database:
  name: psycopg2
  args:
    user: synapse
    password: 'your-password'
    database: synapsedb
    host: localhost
    cp_min: 5
    cp_max: 10

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Crea una clave de registro secreta. La clave debe ser segura porque permitirá a cualquiera registrar a un nuevo usuario, aunque el registro esté desactivado.

$ echo "registration_shared_secret: '$(cat /dev/urandom | tr -cd '[:alnum:]' | fold -w 256 | head -n 1)'" | sudo tee /etc/matrix-synapse/conf.d/registration_shared_secret.yaml
registration_shared_secret: 'vgd73p26ZDaFExpX4OPv45DsA2ZMAxiVZR7um9fBoBoFESmg5MSs68xAMUhwQ8Zn3NqcZMRSqxLeIFatppfne7xD2RHL16YfuIKmNeJ1FClQszO1SZknUVwOPyDiPe5gCCWgD9cHfa3dLTdZND5Y0SdH7GBkwYqKjibAe0JoQc8mKty3HWd6uIga3QewhtXr3b3Hpk8sr6zYpXvaBtWRHwaSWcLooqbWF8LPbSyrC0BVAKzXObUwqRGyDpkrnMiY'

Por defecto, Synapse activa indicadores de presencia que muestran si una persona está conectada. Puede causar un uso elevado de la CPU, por lo que puedes desactivarlo. Crea un nuevo archivo de configuración para ello.

$ sudo nano /etc/matrix-synapse/conf.d/presence.yaml

Pega la siguiente línea en el editor.

presence:
  enabled: false

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Reinicia el servicio Synapse para aplicar los cambios.

$ sudo systemctl restart matrix-synapse

Crea un nuevo usuario matriz. Se te pedirá el nombre de usuario y la contraseña. Como éste es el primer usuario que estamos creando, escribe yes cuando se te pregunte si quieres que el usuario sea administrador.

$ register_new_matrix_user -c /etc/matrix-synapse/conf.d/registration_shared_secret.yaml http://localhost:8008
New user localpart [navjot]: navjot
Password: 
Confirm password: 
Make admin [no]: yes
Sending registration request...
Success!

Si quieres abrir el registro público, crea un nuevo archivo de configuración.

$ sudo nano /etc/matrix-synapse/conf.d/registration.yaml

Pega en él las siguientes líneas.

enable_registration: true

Por defecto, Synapse no permite registros sin verificación de correo electrónico. Para activar la verificación del correo electrónico, pega las siguientes líneas.

registrations_require_3pid:
  - email

email:
  smtp_host: mail.example.com
  smtp_port: 587

  # If mail server has no authentication, skip these 2 lines
  smtp_user: '[email protected]'
  smtp_pass: 'password'

  # Optional, require encryption with STARTTLS
  require_transport_security: true

  app_name: 'HowtoForge Example Chat'  # defines value for %(app)s in notif_from and email subject
  notif_from: "%(app)s <[email protected]>"

Para desactivar la verificación del correo electrónico, pega la siguiente línea.

enable_registration_without_verification: true

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Reinicia Synapse para aplicar la configuración.

$ sudo systemctl restart matrix-synapse

Paso 7 – Configurar Nginx

Abre el archivo /etc/nginx/nginx.conf para editarlo.

$ sudo nano /etc/nginx/nginx.conf

Añade la siguiente línea antes de la línea include /etc/nginx/conf.d/*.conf;.

server_names_hash_bucket_size  64;

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Crea y abre el archivo /etc/nginx/conf.d/synapse.conf para editarlo.

$ sudo nano /etc/nginx/conf.d/synapse.conf

Pega en él el siguiente código.

# enforce HTTPS
server {
    # Client port
    listen 80;
    listen [::]:80;
    server_name matrix.example.com;
    return 301 https://$host$request_uri;
}

server {
    server_name matrix.example.com;

    # Client port
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    # Federation port
    listen 8448 ssl http2 default_server;
    listen [::]:8448 ssl http2 default_server;

    access_log  /var/log/nginx/synapse.access.log;
    error_log   /var/log/nginx/synapse.error.log;

    # TLS configuration
    ssl_certificate /etc/letsencrypt/live/matrix.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/matrix.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/matrix.example.com/chain.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;
    ssl_prefer_server_ciphers on;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;
    resolver 1.1.1.1 1.0.0.1 [2606:4700:4700::1111] [2606:4700:4700::1001] 8.8.8.8 8.8.4.4 [2001:4860:4860::8888] [2001:4860:4860::8844] valid=60s;
    resolver_timeout 2s;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;

    tcp_nopush on;
    gzip on;

    location ~ ^(/_matrix|/_synapse/client) {
            proxy_pass http://localhost:8008;
            proxy_http_version 1.1;

            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;
    }
}

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite una vez hayas terminado. La configuración anterior funciona suponiendo que la dirección IP de los dominios example.com y matrix.example.com apuntan al mismo servidor. Si no es así, utiliza el siguiente archivo de configuración para el servidor example.com.

server {
    server_name example.com;

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

    # TLS configuration
    ssl_certificate /etc/letsencrypt/live/matrix.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/matrix.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/matrix.example.com/chain.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;
    ssl_prefer_server_ciphers on;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;
    resolver 1.1.1.1 1.0.0.1 [2606:4700:4700::1111] [2606:4700:4700::1001] 8.8.8.8 8.8.4.4 [2001:4860:4860::8888] [2001:4860:4860::8844] valid=60s;
    resolver_timeout 2s;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;

    # Redirect
    location ~ ^(/_matrix|/_synapse/client) {
            return 301 "https://matrix.example.com$request_uri";
    }

    # Client homeserver autodiscovery
    location /.well-known/matrix/client {
        default_type application/json;
        add_header Access-Control-Allow-Origin *;

        return 200 '{ "m.homeserver": { "base_url": "https://matrix.example.com" } }';
    }

    # Domain delegation
    location /.well-known/matrix/server {
        default_type application/json;
        add_header Access-Control-Allow-Origin *;

        return 200 '{ "m.server": "matrix.example.com" }';
    }
}

Comprueba la sintaxis del archivo de configuración de Nginx.

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Reinicia el servicio Nginx.

$ sudo systemctl restart nginx

Paso 8 – Instalar Coturn

Necesitarás instalar un servidor Traversal Using Relays around the NAT (TURN) para habilitar las llamadas de voz y vídeo. Para ello, instalaremos el paquete Coturn. Si no necesitas esta funcionalidad, puedes saltarte este paso.

Instala Coturn.

$ sudo apt install coturn

Abre los puertos TURN y UDP.

$ sudo ufw allow 3478
$ sudo ufw allow 5349
$ sudo ufw allow 49152:65535/udp

Genera un certificado SSL para Turn (turn.example.com).

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d turn.example.com

Genera un secreto de autenticación y guárdalo en el archivo de configuración.

$ echo "static-auth-secret=$(cat /dev/urandom | tr -cd '[:alnum:]' | fold -w 256 | head -n 1)" | sudo tee /etc/turnserver.conf
static-auth-secret=OcKBLuwpE6IyMoi9mPccjVFaL7PwJRFUuKh5EvGBVcvB7tunevQ3cpP74we8cF4XSN8lFNrgqxJeyItKOcoOABwjdTNChmJeB4WMrsLV2JNsPs3U61s9rRijj3OxBpZux0CGft8CiyNDweVLqqxNaYphNesoAT4y51RxLVdAP2ros9S3jRR7IYRccJVRMpqTa8USBuBqAkzRRPLbFOHsC6QHur2oiySuW6sqs4YkH65N8kReSzgi7Fq2Zll3RO5e

Abre el archivo de configuración para editarlo.

$ sudo nano /etc/turnserver.conf

Pega las siguientes líneas debajo del secreto de autenticación.

use-auth-secret
realm=turn.example.com
cert=/etc/letsencrypt/live/turn.example.com/fullchain.pem
pkey=/etc/letsencrypt/live/turn.example.com/privkey.pem

# VoIP is UDP, no need for TCP
no-tcp-relay

# Do not allow traffic to private IP ranges
no-multicast-peers
denied-peer-ip=0.0.0.0-0.255.255.255
denied-peer-ip=10.0.0.0-10.255.255.255
denied-peer-ip=100.64.0.0-100.127.255.255
denied-peer-ip=127.0.0.0-127.255.255.255
denied-peer-ip=169.254.0.0-169.254.255.255
denied-peer-ip=172.16.0.0-172.31.255.255
denied-peer-ip=192.0.0.0-192.0.0.255
denied-peer-ip=192.0.2.0-192.0.2.255
denied-peer-ip=192.88.99.0-192.88.99.255
denied-peer-ip=192.168.0.0-192.168.255.255
denied-peer-ip=198.18.0.0-198.19.255.255
denied-peer-ip=198.51.100.0-198.51.100.255
denied-peer-ip=203.0.113.0-203.0.113.255
denied-peer-ip=240.0.0.0-255.255.255.255
denied-peer-ip=::1
denied-peer-ip=64:ff9b::-64:ff9b::ffff:ffff
denied-peer-ip=::ffff:0.0.0.0-::ffff:255.255.255.255
denied-peer-ip=100::-100::ffff:ffff:ffff:ffff
denied-peer-ip=2001::-2001:1ff:ffff:ffff:ffff:ffff:ffff:ffff
denied-peer-ip=2002::-2002:ffff:ffff:ffff:ffff:ffff:ffff:ffff
denied-peer-ip=fc00::-fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
denied-peer-ip=fe80::-febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff

# Limit number of sessions per user
user-quota=12
# Limit total number of sessions
total-quota=1200

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Reinicia Coturn para aplicar la configuración.

$ sudo systemctl restart coturn

Crea un nuevo archivo de configuración de Synapse para Coturn.

$ sudo nano /etc/matrix-synapse/conf.d/turn.yaml

Pega en él las siguientes líneas. Sustituye el valor de turn_shared_secret por el valor de static-auth-secret del archivo \etc\turnserver.conf.

turn_uris: [ "turn:turn.example.com?transport=udp", "turn:turn.example.com?transport=tcp" ]
turn_shared_secret: 'static-auth-secret'
turn_user_lifetime: 86400000
turn_allow_guests: True

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Reinicia Synapse para aplicar los cambios.

$ sudo systemctl restart matrix-synapse

Paso 9 – Acceder a Matrix

Puedes acceder al Chat de Matrix utilizando el cliente web de Element en https://app.element.io. Haz clic en el botón Iniciar sesión para continuar.

Página de inicio de sesión de Element Web

Haz clic en el enlace Editar bajo Servidor doméstico. Introduce matrix.example.com como tu servidor doméstico.

Elemento Cliente Servidor personalizado

Si el cliente detecta correctamente tu servidor doméstico, el límite y el texto se volverán de color verde, de lo contrario se mostrarán en rojo. Haz clic en Continuar para continuar.

Inicio de sesión en el servidor doméstico personalizado Element

Haz clic en el botón Iniciar sesión para conectarte. Se te pedirá que crees una copia de seguridad segura y encriptada.

Copia de seguridad Matrix

Selecciona la opción Introducir una frase de seguridad para crear una frase de seguridad que se te pedirá cada vez que inicies sesión. Haz clic en Continuar para proseguir.

Elemento Frase de seguridad

Introduce una frase de seguridad y haz clic en el botón Continuar para proseguir. Se te pedirá que la confirmes de nuevo en la siguiente pantalla.

Elemento Confirmar frase de seguridad

Introduce de nuevo la frase y haz clic en Continuar para proseguir.

Elemento Seguridad Clave Poup

Se te proporcionará un conjunto de claves de seguridad que puedes utilizar si olvidas tu frase de seguridad. Haz clic en el botón Descargar para guardarlas.

Pulsa el botón Continuar para continuar.

Elemento Verificar contraseña

Se te pedirá la contraseña de tu cuenta. Introduce la contraseña y haz clic en el botón Continuar para terminar de configurar la copia de seguridad encriptada.

Panel del Cliente Web Element

Creamos una sala de chat de grupo llamada HowtoForge utilizando el botón Crear un chat de grupo de la página principal. Aparecerá la siguiente ventana emergente cuando hagas clic en el botón.

Crear una sala privada en Matrix

Puedes restringir los miembros al dominio expandiendo el menú avanzado y seleccionando la opción. Termina de crear la sala haciendo clic en el botón Crear sala.

Paso 10 – Instalar Elemento

Instala el paquete jq para instalar el procesador de texto JSON. Lo utilizaremos para obtener la última versión de Element de su repositorio de GitHub, que no necesita que añadas manualmente los números de versión y te permite actualizarlo mediante un único comando.

$ sudo apt install jq

Crea un directorio para Element.

$ sudo mkdir -p /var/www/element

Crea un nuevo archivo para obtener la última versión de Element.

$ sudo nano /var/www/element/update.sh

Añádele las siguientes líneas.

#!/bin/sh
set -e

install_location="/var/www/element"
latest="$(curl -s https://api.github.com/repos/vector-im/element-web/releases/latest | jq -r .tag_name)"

cd "$install_location"

[ ! -d "archive" ] && mkdir -p "archive"
[ -d "archive/element-${latest}" ] && rm -r "archive/element-${latest}"
[ -f "archive/element-${latest}.tar.gz" ] && rm "archive/element-${latest}.tar.gz"

wget "https://github.com/vector-im/element-web/releases/download/${latest}/element-${latest}.tar.gz" -P "archive"
tar xf "archive/element-${latest}.tar.gz" -C "archive"

[ -L "${install_location}/current" ] && rm "${install_location}/current"
ln -sf "${install_location}/archive/element-${latest}" "${install_location}/current"
ln -sf "${install_location}/config.json" "${install_location}/current/config.json"

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Haz que el archivo sea ejecutable.

$ sudo chmod +x /var/www/element/update.sh

Ejecuta el script para descargar Element.

$ sudo /var/www/element/update.sh

Paso 11 – Configurar Element

Copia el mismo archivo de configuración de Element.

$ sudo cp /var/www/element/current/config.sample.json /var/www/element/config.json

Abre el archivo de configuración para editarlo.

$ sudo nano /var/www/element/config.json

Busca las siguientes líneas.

"m.homeserver": {
    "base_url": "https://matrix-client.matrix.org",
    "server_name": "matrix.org"
},

Cambia la dirección por defecto del servidor doméstico de Matrix por la de tu servidor doméstico y elimina la variable server_name.

"m.homeserver": {
    "base_url": "https://matrix.example.com",
    "server_name": "example.com"
},

Si quieres utilizar tu nombre en lugar de Element en el título del sitio web, cambia el nombre de la marca.

"brand": "HowtoForge Example Chat",

Establece la variable disable_guests como verdadera para no permitir que los invitados utilicen Element.

"disable_guests": true,

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Genera un certificado SSL para el cliente Element.

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d element.example.com

Crea y abre el archivo /etc/nginx/conf.d/element.conf para editarlo.

$ sudo nano /etc/nginx/conf.d/element.conf

Pega en él las siguientes líneas.

server {
    listen 80;
    listen [::]:80;
    server_name element.example.com;
    return 301 https://$host$request_uri;
}

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

    server_name element.example.com;

    root /var/www/element/current;
    index index.html;

    access_log  /var/log/nginx/element.access.log;
    error_log   /var/log/nginx/element.error.log;

    add_header Referrer-Policy "strict-origin" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Frame-Options "SAMEORIGIN" always;

    # TLS configuration
    ssl_certificate /etc/letsencrypt/live/element.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/element.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/element.example.com/chain.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;
    ssl_prefer_server_ciphers on;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;
    resolver 1.1.1.1 1.0.0.1 [2606:4700:4700::1111] [2606:4700:4700::1001] 8.8.8.8 8.8.4.4 [2001:4860:4860::8888] [2001:4860:4860::8844] valid=60s;
    resolver_timeout 2s;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
}

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Comprueba la sintaxis del archivo de configuración de Nginx.

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Reinicia el servicio Nginx.

$ sudo systemctl restart nginx

Puedes acceder al cliente Element a través de la URL https://element.example.com de tu navegador. Inicia sesión y accederás al panel de control de la aplicación. Primero se te pedirá que verifiques la aplicación con https://app.element.io. Asegúrate de que has iniciado sesión en la aplicación Element original y se te pedirá que emparejes los caracteres emoji. Una vez verificada, obtendrás el siguiente panel de control.

Panel de control autoalojado Element

Conclusión

Con esto concluye nuestro tutorial sobre la instalación del servidor Matrix Synapse Chat junto con Coturn y el cliente web Element utilizando Nginx como servidor proxy en una máquina Debian 12. Si tienes alguna pregunta, publícala en los comentarios a continuación.

También te podría gustar...