Servidor de Chat · 27 min read · Oct 27, 2025

Cómo instalar y crear un servidor de chat usando Matrix Synapse y Element en Rocky Linux 9

Matrix es un estándar abierto para la comunicación descentralizada y cifrada de extremo a extremo. Es una colección de servidores y servicios que se comunican entre sí utilizando una API estandarizada que se sincroniza en tiempo real. Utiliza homeservers para almacenar información de cuentas e 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 usar 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 cómo instalar y crear un servidor de chat usando Synapse, una implementación de servidor doméstico de Matrix. Element es un cliente web de Matrix construido utilizando Matrix React SDK. Esto te permitirá ofrecer chat de Matrix en la web. También puedes usar el servidor con cualquier otro cliente de Matrix. También instalaremos el servidor Coturn para habilitar llamadas de voz y video. El servicio Coturn es opcional si no estás interesado en usarlo.

Requisitos previos

  1. Un servidor que ejecute Debian 12.
  2. Un usuario no sudo con privilegios de root.
  3. El Firewall sin complicaciones (UFW) está habilitado y en funcionamiento.
  4. Nombres de dominio completamente calificados (FQDN) para Matrix, Element y Coturn apuntando a tu servidor. Usaremos matrix.example.com, element.example.com y coturn.example.com respectivamente para los tres servicios.
  5. Asegúrate de que todo esté actualizado. $ sudo dnf update
  • Pocos paquetes que tu sistema necesita. $ sudo dnf install wget curl nano unzip yum-utils policycoreutils-python-utils -y Algunos de estos paquetes pueden ya estar instalados en tu sistema.

Paso 1 - Configurar el Firewall

Antes de instalar cualquier paquete, el primer paso es configurar el firewall para abrir puertos para HTTP, HTTPS y Synapse. Rocky Linux utiliza Firewalld Firewall. Verifica el estado del firewall.

$ sudo firewall-cmd --state
running

El firewall trabaja con diferentes zonas, y la zona pública es la predeterminada que utilizaremos. Lista todos los servicios y puertos activos en el firewall.

$ sudo firewall-cmd --zone=public --list-all

Debería mostrar la siguiente salida.

public
  target: default
  icmp-block-inversion: no
  interfaces: enp1s0
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

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

$ sudo firewall-cmd --zone=public --add-port=8448/tcp
$ sudo firewall-cmd --zone=public --add-service=http
$ sudo firewall-cmd --zone=public --add-service=https

Verifica nuevamente el estado del firewall.

$ sudo firewall-cmd --zone=public --list-all

Deberías ver una salida similar.

public
  target: default
  icmp-block-inversion: no
  interfaces: enp1s0
  sources: 
  services: cockpit dhcpv6-client http https ssh
  ports: 8448/tcp
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

Haz que todos los cambios sean permanentes y recarga el firewall para habilitar los cambios.

$ sudo firewall-cmd --runtime-to-permanent
$ sudo firewall-cmd --reload

Paso 2 - Instalar y configurar PostgreSQL

Rocky Linux 9 viene con PostgreSQL 13 por defecto. Usaremos PostgreSQL 16 de su repositorio oficial.

Instala el repositorio RPM de PostgreSQL.

$ sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm

Desactiva el módulo de PostgreSQL incorporado.

$ sudo dnf -qy module disable postgresql

Ahora, puedes instalar PostgreSQL usando el siguiente comando.

$ sudo dnf install -y postgresql16-server postgresql16-contrib postgresql16-devel

sudo dnf install postgresql16-devel

export PATH=$PATH:/usr/pgsql-16/bin

El paquete postgresql-contrib contiene algunas utilidades adicionales.

Verifica la versión.

$ psql --version
psql (PostgreSQL) 16.1

Inicializa la base de datos de PostgreSQL.

$ sudo /usr/pgsql-16/bin/postgresql-16-setup initdb
Inicializando base de datos ... OK

Habilita el servicio de PostgreSQL.

$ sudo systemctl enable postgresql-16

Inicia el servicio de PostgreSQL.

$ sudo systemctl start postgresql-16

Verifica el estado del servicio de PostgreSQL.

$ sudo systemctl status postgresql-16
? postgresql-16.service - Servidor de base de datos PostgreSQL 16
     Loaded: loaded (/usr/lib/systemd/system/postgresql-16.service; enabled; preset: disabled)
     Active: active (running) since Tue 2024-01-30 11:55:26 UTC; 10s ago
       Docs: https://www.postgresql.org/docs/16/static/
    Process: 9610 ExecStartPre=/usr/pgsql-16/bin/postgresql-16-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
   Main PID: 9615 (postgres)
      Tasks: 7 (limit: 12225)
     Memory: 17.4M
        CPU: 98ms
     CGroup: /system.slice/postgresql-16.service
             ??9615 /usr/pgsql-16/bin/postgres -D /var/lib/pgsql/16/data/
             ??9616 "postgres: logger "
             ??9617 "postgres: checkpointer "
             ??9618 "postgres: background writer "
             ??9620 "postgres: walwriter "
             ??9621 "postgres: autovacuum launcher "
             ??9622 "postgres: logical replication launcher "

Jan 30 11:55:26 matrix.example.com systemd[1]: Starting PostgreSQL 16 database server...
Jan 30 11:55:26 matrix.example.com postgres[9615]: 2024-01-30 11:55:26.482 UTC [9615] LOG:  redirecting log output to logging collector process
Jan 30 11:55:26 matrix.example.com postgres[9615]: 2024-01-30 11:55:26.482 UTC [9615] HINT:  Future log output will appear in directory "log".
Jan 30 11:55:26 matrix.example.com systemd[1]: Started PostgreSQL 16 database server.

Puedes ver que el servicio está habilitado y en funcionamiento por defecto.

Inicia sesión en la cuenta del sistema postgres.

$ sudo -su postgres

Crea un nuevo usuario de base de datos y una base de datos para PostgreSQL. Se te pedirá una contraseña al crear el usuario.

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

Sal de la cuenta postgres.

$ exit

Paso 3 - Instalar Matrix Synapse

Matrix Synapse no tiene un paquete preconstruido para distribuciones basadas en CentOS como Rocky Linux. Por lo tanto, lo instalaremos como un módulo de Python desde PyPI.

El primer paso es instalar los requisitos previos necesarios para que Synapse funcione. También necesitamos el repositorio EPEL que incluye el paquete python3-virtualenv.

$ sudo dnf install epel-release
$ sudo dnf install --enablerepo=crb libtiff-devel libjpeg-devel libzip-devel \
                 freetype-devel libwebp-devel libxml2-devel libxslt-devel \
                 libpq-devel  python3-virtualenv libffi-devel openssl-devel \
                 python3-devel libicu-devel
$ sudo dnf groupinstall "Development Tools"
$ sudo dnf install postgresql16-devel

Crea un directorio para Synapse.

$ mkdir -p ~/synapse

Crea un entorno virtual de Python en el directorio mencionado.

$ virtualenv -p python3 ~/synapse/env

Activa el entorno virtual.

$ source ~/synapse/env/bin/activate

Asegúrate de tener la última versión de pip y setuptools.

(env) $ pip install --upgrade pip
(env) $ pip install --upgrade setuptools

Instala Matrix Synapse.

(env) $ pip install "matrix-synapse[postgres]"

Esto descargará Synapse de PyPI e instalará, junto con las bibliotecas de Python que utiliza, en un entorno virtual bajo la carpeta ~/synapse/env. También instalará la biblioteca de Python de PostgreSQL requerida para que Synapse se conecte con el servidor PostgreSQL. El comando anterior es una combinación de los comandos pip install matrix-synapse y pip install psycopg2.

El siguiente paso es generar un archivo de configuración con algunos ajustes básicos. Cambia al directorio de Synapse.

(env) $ cd ~/synapse

Ejecuta el siguiente comando para generar el archivo de configuración.

(env) $ python -m synapse.app.homeserver \
    --server-name matrix.example.com \
    --config-path homeserver.yaml \
    --generate-config \
    --report-stats=[yes|no]

El valor de la variable --server-name forma parte de tu ID de Matrix. Ingresa tu nombre de dominio de Matrix como su valor. Esto actuará como la dirección de tu servidor doméstico.

Puedes elegir si deseas enviar estadísticas anónimas sobre tu servidor doméstico de vuelta a Matrix a través de la variable --report-stats. Elige yes o no según tu elección.

Recibirás la siguiente salida.

Generando archivo de configuración homeserver.yaml
Generando archivo de configuración de registro /home/navjot/synapse/matrix.example.com.log.config que registrará en /home/navjot/synapse/homeserver.log
Generando archivo de clave de firma /home/navjot/synapse/matrix.example.com.signing.key
Se ha generado un archivo de configuración en 'homeserver.yaml' para el nombre del servidor 'matrix.example.com'. Por favor, revisa este archivo y personalízalo según tus necesidades.

Puedes cambiar estos ajustes más tarde en el archivo ~/synapse/homeserver.yaml o en el archivo /home//synapse/homeserver.yaml. Las claves generadas por el comando anterior permitirán que tu servidor doméstico se identifique ante otros servidores domésticos.

Es hora de ejecutar el servidor Matrix. Asegúrate de estar dentro del directorio de Synapse y de que el entorno virtual esté activo.

Inicia el servidor doméstico.

(env) $ synctl start

Deberías ver una salida similar.

Este servidor está configurado para usar 'matrix.org' como su servidor de claves de confianza a través de la opción de configuración 'trusted_key_servers'. 'matrix.org' es una buena opción para un servidor de claves ya que es de larga duración, estable y confiable. Sin embargo, algunos administradores pueden desear usar otro servidor para este propósito.

Para suprimir esta advertencia y continuar usando 'matrix.org', los administradores deben establecer 'suppress_key_server_warning' en 'true' en homeserver.yaml.
--------------------------------------------------------------------------------
se ha iniciado synapse.app.homeserver(homeserver.yaml)

Para detener el servidor, ejecuta el siguiente comando.

(env) $ synctl stop

Desactiva el entorno virtual.

(env) $ deactivate

Paso 4 - Instalar Nginx

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

Rocky Linux 9 viene con una versión más antigua de Nginx. Necesitas usar el repositorio oficial de Nginx para instalar la última versión.

Crea y abre el archivo /etc/yum.repos.d/nginx.repo para editar.

$ sudo nano /etc/yum.repos.d/nginx.repo

Pega el siguiente código en él.

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

Una vez que hayas terminado, guarda el archivo presionando Ctrl + X y entrando Y cuando se te pida.

Instalaremos la línea principal de Nginx, así que habilita el paquete para ello.

$ sudo dnf config-manager --enable nginx-mainline

Instala Nginx.

$ sudo dnf install nginx -y

Verifica la instalación.

$ nginx -v
nginx version: nginx/1.25.3

Habilita e inicia el servicio del servidor Nginx.

$ sudo systemctl enable nginx --now

Verifica el estado del servicio.

$ sudo systemctl status nginx
? nginx.service - nginx - servidor web de alto rendimiento
     Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: disabled)
     Active: active (running) since Tue 2024-01-30 12:50:34 UTC; 4s ago
       Docs: http://nginx.org/en/docs/
    Process: 10810 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
   Main PID: 10811 (nginx)
      Tasks: 3 (limit: 12225)
     Memory: 3.1M
        CPU: 24ms
     CGroup: /system.slice/nginx.service
             ??10811 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
             ??10812 "nginx: worker process"
             ??10813 "nginx: worker process"

Paso 5 - Instalar SSL

Necesitamos instalar Certbot para generar el certificado SSL. Usaremos el instalador de paquetes Snapd para eso. Dado que Rocky Linux no lo incluye, instala el instalador Snapd. Requiere el repositorio EPEL (Paquetes adicionales para Linux empresarial) para funcionar. Pero como ya lo instalamos en el paso 3, podemos avanzar directamente.

Instala el paquete Snapd.

$ sudo dnf install snapd -y

Habilita e inicia el servicio Snap.

$ sudo systemctl enable snapd --now

Instala el paquete central de Snap y asegúrate de que tu versión de Snapd esté actualizada.

$ sudo snap install core
$ sudo snap refresh core

Crea los enlaces necesarios para que Snapd funcione.

$ sudo ln -s /var/lib/snapd/snap /snap
$ echo 'export PATH=$PATH:/var/lib/snapd/snap/bin' | sudo tee -a /etc/profile.d/snapd.sh

Instala Certbot.

$ sudo snap install --classic certbot

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

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

Verifica la versión de Certbot.

$ certbot --version
certbot 2.8.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 en tu servidor.

Genera un certificado de grupo Diffie-Hellman.

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

Verifica el servicio programador de renovación de Certbot.

$ systemctl list-timers

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

NEXT                        LEFT         LAST                        PASSED      UNIT                         ACTIVATES                   ----------------------------------------------------------------------------------------------------------------------------------  
Tue 2024-01-30 14:37:50 UTC 29min left   Tue 2024-01-30 13:05:13 UTC 1h 3min ago dnf-makecache.timer          dnf-makecache.service
Tue 2024-01-30 15:13:00 UTC 1h 4min left -                           -           snap.certbot.renew.timer     snap.certbot.renew.service
Wed 2024-01-31 00:00:00 UTC 9h left      Tue 2024-01-30 06:35:44 UTC 7h ago      logrotate.timer              logrotate.service

Haz una prueba del proceso para verificar si la renovación de SSL está funcionando bien.

$ sudo certbot renew --dry-run

Si no ves errores, estás listo. Tu certificado se renovará automáticamente.

Paso 6 - Configurar SELinux

SELinux te impide ejecutar un servicio del sistema donde el binario está en el directorio de inicio de un usuario. Por esta razón, si creamos un archivo de servicio para Synapse, será bloqueado por SELinux. Para solucionar el problema, necesitamos ejecutar el siguiente comando para permitir que el binario de Python se ejecute como un servicio del sistema.

$ sudo chcon -R -t bin_t /home/username/synapse/env/bin/python

Aplica la política para permitir conexiones a hosts externos.

$ sudo setsebool -P httpd_can_network_connect 1

Aplica la política para permitir que Nginx dé acceso a PostgreSQL.

$ sudo setsebool -P httpd_can_network_connect_db 1

Paso 7 - Crear el servicio de Systemd para Matrix

El estado del servicio Synapse no se guarda a través de un reinicio, lo que significa que si reinicias el servidor, necesitarás iniciar el servidor manualmente. Para solucionar este problema, necesitamos crear el archivo de Systemd para ello.

Antes de continuar, asegúrate de que el servicio Synapse esté detenido.

$ cd ~/synapse
$ source env/bin/activate
(env) $ synctl stop
(env) $ deactivate

Crea y abre el archivo matrix-synapse.service en el directorio /etc/systemd/system/ para editar.

$ sudo nano /etc/systemd/system/matrix-synapse.service

Pega el siguiente código en él. Reemplaza la variable username con tu usuario del sistema Linux bajo el cual instalaste Synapse.

# Esto asume que Synapse ha sido instalado por un usuario llamado username.
# Esto asume que Synapse ha sido instalado en un virtualenv en
# el directorio de inicio del usuario: `/home/username/synapse/env`.

[Unit]
Description=Servidor doméstico Synapse Matrix
After=postgresql-16.service

[Service]
Type=notify
NotifyAccess=main
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-abort

WorkingDirectory=/home/username/synapse
ExecStart=/home/username/synapse/env/bin/python -m synapse.app.homeserver --config-path=/home/username/synapse/homeserver.yaml
SyslogIdentifier=matrix-synapse

# ajusta el factor de caché si es necesario
# Environment=SYNAPSE_CACHE_FACTOR=2.0

[Install]
WantedBy=multi-user.target

Una vez terminado, guarda el archivo presionando Ctrl + X y entrando Y cuando se te pida.

Recarga el demonio del servicio.

$ sudo systemctl daemon-reload

Habilita el servicio Matrix Synapse.

$ sudo systemctl enable matrix-synapse

Inicia el servicio Matrix Synapse.

$ sudo systemctl start matrix-synapse

Verifica el estado del servicio.

$ sudo systemctl status matrix-synapse

Deberías ver la siguiente salida.

? matrix-synapse.service - Servidor doméstico Synapse Matrix
     Loaded: loaded (/etc/systemd/system/matrix-synapse.service; enabled; preset: disabled)
     Active: active (running) since Tue 2024-01-30 14:20:20 UTC; 5s ago
   Main PID: 14687 (python)
      Tasks: 8 (limit: 12225)
     Memory: 77.6M
        CPU: 3.527s
     CGroup: /system.slice/matrix-synapse.service
             ??14687 /home/navjot/synapse/env/bin/python -m synapse.app.homeserver --config-path=/home/navjot/synapse/homeserver.yaml

Jan 30 14:20:16 matrix.example.com systemd[1]: Starting Synapse Matrix homeserver...
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: Este servidor está configurado para usar 'matrix.org' como su servidor de claves de confianza a través de la
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: opción de configuración 'trusted_key_servers'. 'matrix.org' es una buena opción para un servidor de claves
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: ya que es de larga duración, estable y confiable. Sin embargo, algunos administradores pueden
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: desear usar otro servidor para este propósito.
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: Para suprimir esta advertencia y continuar usando 'matrix.org', los administradores deben establecer
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: 'suppress_key_server_warning' en 'true' en homeserver.yaml.
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: --------------------------------------------------------------------------------
Jan 30 14:20:20 matrix.example.com systemd[1]: Started Synapse Matrix homeserver.

Paso 8 - Configurar Matrix Synapse

Antes de continuar, crea primero una clave de registro secreta. La clave debe estar asegurada porque permitirá a cualquiera registrar un nuevo usuario, incluso si el registro está deshabilitado.

$ echo "registration_shared_secret: '$(cat /dev/urandom | tr -cd '[:alnum:]' | fold -w 256 | head -n 1)'"
registration_shared_secret: '1y75ja0RUxvbWcS6SdZhakenukUwHHEjOXWC9Mu3FpO0QenOnpKRsc6NBZSxuzPcHYsOEuIQziwVjSZcP87dlWK4ZkIGYniurMqNsCYL4xg5xXs4bJDuTJH2CUXab4U9liv399lmkIZFaMpJCLxV9lVWB9mKHILYsjeLgGY5wAARv1SiK07bFsQOwKJGFqIvsUXmxymx5QCNDzTHw8R4ShqZ7elnnZrbdYk4r2f7qogERNHvQaRV7IEYUIOtMhVP'

Copia la salida de la línea anterior y guárdala.

Puedes configurar el servidor Matrix a través del archivo /home/username/synapse/homeserver.yaml. Ábrelo para editar.

$ nano ~/synapse/homeserver.yaml

Pega la salida del comando de la clave de registro en la parte inferior del archivo.

Por defecto, Synapse está configurado para usar la base de datos SQLite. Necesitamos editarlo para agregar las credenciales de PostgreSQL.

Encuentra la siguiente sección en el archivo y coméntala como se muestra.

#database:
#  name: sqlite3
#  args:
#    database: /home/navjot/synapse/homeserver.db

Agrega la siguiente sección debajo. Reemplaza el campo your-password con la contraseña del usuario de PostgreSQL que creaste en el paso 3. Reemplaza localhost con la dirección IP de tu servidor, si estás alojando 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

Por defecto, Synapse habilita indicadores de presencia que muestran si una persona está en línea. Puede causar un alto uso de CPU, por lo tanto, puedes deshabilitarlo. Pega la siguiente línea al final.

presence:
  enabled: false

Una vez terminado, guarda el archivo presionando Ctrl + X y entrando Y cuando se te pida.

Crea un nuevo usuario de Matrix. Se te pedirá tu nombre de usuario y contraseña. Dado que este es el primer usuario que estamos creando, escribe yes cuando se te pregunte si deseas hacer al usuario un administrador. Necesitarás activar el entorno virtual para crear el usuario.

$ cd ~/synapse
$ source env/bin/activate
(env) $ register_new_matrix_user -c homeserver.yaml http://localhost:8008
Nuevo usuario localpart [navjot]: navjot
Contraseña: 
Confirmar contraseña: 
Hacer admin [no]: yes
Enviando solicitud de registro...
¡Éxito!
(env) $ deactivate

Puedes ver que usamos el puerto 8008 en el comando anterior. Eso es porque es el puerto predeterminado que escucha Matrix Synapse.

Por defecto, el registro de nuevos usuarios está deshabilitado, lo que significa que necesitas registrar manualmente a cada usuario como arriba. Si deseas abrir registros públicos, puedes hacerlo editando el archivo homeserver.yaml.

Ábrelo para editar nuevamente.

$ nano ~/synapse/homeserver.yaml

Pega la siguiente línea en la parte inferior.

enable_registration: true

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

registrations_require_3pid:
  - email

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

  # Si el servidor de correo no tiene autenticación, omite estas 2 líneas
  smtp_user: '[email protected]'
  smtp_pass: 'password'

  # Opcional, requiere cifrado con STARTTLS
  require_transport_security: true

  app_name: 'HowtoForge Example Chat'  # define el valor para %(app)s en notif_from y asunto del correo
  notif_from: "%(app)s <[email protected]>"

Para deshabilitar la verificación de correo electrónico, pega la siguiente línea en su lugar.

enable_registration_without_verification: true

Una vez terminado, guarda el archivo presionando Ctrl + X y entrando Y cuando se te pida.

Reinicia Synapse para aplicar la configuración.

$ sudo systemctl restart matrix-synapse

Paso 9 - Configurar Nginx

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

$ sudo nano /etc/nginx/nginx.conf

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

server_names_hash_bucket_size 64;

Guarda el archivo presionando Ctrl + X y entrando Y cuando se te pida.

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

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

Pega el siguiente código en él.

# hacer cumplir HTTPS
server {
    # Puerto del cliente
    listen 80;
    listen [::]:80;
    server_name matrix.example.com;
    return 301 https://$host$request_uri;
}

server {
    server_name matrix.example.com;

    # Puerto del cliente
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;

    # Puerto de federación
    listen 8448 ssl default_server;
    listen [::]:8448 ssl default_server;

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

    # Configuración TLS
    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 por defecto solo permite cargas de archivos de hasta 1M de tamaño
            # Aumenta client_max_body_size para que coincida con max_upload_size definido en homeserver.yaml
            client_max_body_size 50M;
    }
}

Guarda el archivo presionando Ctrl + X y entrando Y cuando se te pida una vez terminado. La configuración anterior funciona bajo la suposición de que la dirección IP de los dominios example.com y matrix.example.com apuntan al mismo servidor. Si no lo hacen, entonces usa el siguiente archivo de configuración para el servidor example.com.

server {
    server_name example.com;

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

    # Configuración TLS
    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;

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

    # Autodiscovery del servidor doméstico del cliente
    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" } }';
    }

    # Delegación de dominio
    location /.well-known/matrix/server {
        default_type application/json;
        add_header Access-Control-Allow-Origin *;

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

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

$ sudo nginx -t
nginx: el archivo de configuración /etc/nginx/nginx.conf tiene una sintaxis correcta
nginx: la prueba del archivo de configuración /etc/nginx/nginx.conf fue exitosa

Reinicia el servicio de Nginx.

$ sudo systemctl restart nginx

Paso 10 - Instalar Coturn

Necesitarás instalar un servidor de Traversal Using Relays around the NAT (TURN) para habilitar llamadas de voz y video. Para este propósito, instalaremos el paquete Coturn. Si no necesitas esta funcionalidad, puedes omitir este paso.

Instala Coturn.

$ sudo dnf install coturn

Abre los puertos TURN y UDP.

$ sudo firewall-cmd --zone=public --add-port=3478/{tcp,udp}
$ sudo firewall-cmd --zone=public --add-port=5349/{tcp,udp}
$ sudo firewall-cmd --zone=public --add-port=49152-65535/udp
$ sudo firewall-cmd --runtime-to-permanent
$ sudo firewall-cmd --reload

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

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

Genera un secreto de autenticación para Coturn.

$ echo "static-auth-secret=$(cat /dev/urandom | tr -cd '[:alnum:]' | fold -w 256 | head -n 1)"
static-auth-secret=u3ksgJ9X876sFMO00A8KabXwZvzVwCmV30wWvZ7DzGiepRwNRYSCTYzf2E8olNzdDHu7oO3XpT3l5bv5mVdhXEQ3pnoTWBquSVPFFBJtyD6y9gBxiMaD2TYTD2WohQLE9s7OKJVpkDeKTnZQnkmjrFadE3M9DRxPL1W5Lgdg6XLLKABgb5XGkutRgkJOV0JRH4sBYsot63fWq9mcGTm6nAMdIycvDVDOs7vhoeqRzcTbMF0wsfAHVJNhXpGGFDyZ

Abre el archivo de configuración para editar.

$ sudo nano /etc/coturn/turnserver.conf

Vamos a revisar el archivo y habilitar las configuraciones que necesitamos. Primero, habilita el método de autenticación descomentando la línea use-auth-secret.

# Ten en cuenta que use-auth-secret anula algunas partes de lt-cred-mech.
# La función use-auth-secret depende internamente de lt-cred-mech, así que si estableces
# esta opción, entonces habilita automáticamente lt-cred-mech internamente
# como si hubieras habilitado ambos.
#
# Nota que solo puedes usar un mecanismo de autenticación a la vez. Esto se debe a que,
# ambos mecanismos realizan la validación de nombre de usuario y contraseña de diferentes maneras.
#
# Usa ya sea lt-cred-mech o use-auth-secret en la conf
# para evitar cualquier confusión.
#
use-auth-secret

A continuación, configuraremos la variable static-auth-secret con el valor que creamos anteriormente. También necesitaremos este secreto para configurar Synapse más adelante.

# 'Valor de secreto de autenticación' estático (una cadena) solo para la API REST de TURN.
# Si no se establece, entonces el servidor turn
# intentará usar el valor 'dinámico' en la tabla turn_secret
# en la base de datos de usuarios (si está presente). El valor almacenado en la base de datos puede cambiarse sobre la marcha
# por un programa separado, por lo que este modo se considera 'dinámico'.
#
static-auth-secret=u3ksgJ9X876sFMO00A8KabXwZvzVwCmV30wWvZ7DzGiepRwNRYSCTYzf2E8olNzdDHu7oO3XpT3l5bv5mVdhXEQ3pnoTWBquSVPFFBJtyD6y9gBxiMaD2TYTD2WohQLE9s7OKJVpkDeKTnZQnkmjrFadE3M9DRxPL1W5Lgdg6XLLKABgb5XGkutRgkJOV0JRH4sBYsot63fWq9mcGTm6nAMdIycvDVDOs7vhoeqRzcTbMF0wsfAHVJNhXpGGFDyZ

El siguiente valor que necesitamos cambiar es el realm. Se refiere al dominio que elegimos para Coturn.

# El dominio predeterminado que se utilizará para los usuarios cuando no se encuentra una relación
# explícita de origen/dominio en la base de datos, o si el servidor TURN no está utilizando ninguna base de datos
# (solo la configuración de línea de comandos y el archivo de usuario). Debe usarse con el mecanismo de credenciales a largo plazo
# o con la API REST de TURN.
#
# Nota: Si el dominio predeterminado no se especifica, entonces el dominio cae de vuelta al nombre de dominio del host.
#       Si la cadena del nombre de dominio está vacía, o se establece en '(Ninguno)', entonces se inicializa como una cadena vacía.
#
realm=coturn.example.com

A continuación, define el número de sesiones y sesiones por usuario. Elige un valor que funcione para tu servidor.

# Cuota de asignación por usuario.
# el valor predeterminado es 0 (sin cuota, número ilimitado de sesiones por usuario).
# Esta opción también se puede establecer a través de la base de datos, para un dominio particular.
#
user-quota=12

# Cuota de asignación total.
# el valor predeterminado es 0 (sin cuota).
# Esta opción también se puede establecer a través de la base de datos, para un dominio particular.
#
total-quota=1200

A continuación, necesitamos deshabilitar TCP ya que VOIP es UDP.

# Descomentar si no se permiten puntos finales de retransmisión TCP.
# Por defecto, los puntos finales de retransmisión TCP están habilitados (como en RFC 6062).
#
no-tcp-relay

También necesitamos configurar la ubicación de los certificados que creamos para Coturn.

# Archivo de certificado.
# Usa una ruta absoluta o una ruta relativa al
# archivo de configuración.
# Usa el formato de archivo PEM.
#
cert=/etc/letsencrypt/live/coturn.example.com/fullchain.pem

# Archivo de clave privada.
# Usa una ruta absoluta o una ruta relativa al
# archivo de configuración.
# Usa el formato de archivo PEM.
#
pkey=/etc/letsencrypt/live/coturn.example.com/privkey.pem

A continuación, necesitamos deshabilitar el tráfico a rangos de IP privadas y prohibir pares en direcciones multicast para mejorar la seguridad.

# Bandera que se puede usar para prohibir pares en direcciones de difusión bien conocidas (224.0.0.0 y superiores, y FFXX:*).
# Esta es una medida de seguridad adicional.
#
no-multicast-peers

...............

# Opción para permitir o prohibir direcciones IP específicas o rangos de direcciones IP.
# Si una dirección IP se especifica como permitida y denegada, entonces la dirección IP se
# considera permitida. Esto es útil cuando deseas prohibir un rango de IP
# direcciones, excepto por algunas IP específicas dentro de ese rango.
#
# Esto se puede usar cuando no deseas que los usuarios del servidor TURN puedan acceder
# a máquinas alcanzables por el servidor TURN, pero que de otro modo estarían
# inalcanzables desde Internet (por ejemplo, cuando el servidor TURN está detrás de un NAT)
#
# Ejemplos:
# denied-peer-ip=83.166.64.0-83.166.95.255
# allowed-peer-ip=83.166.68.45

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

Una vez terminado, guarda el archivo presionando Ctrl + X y entrando Y cuando se te pida.

Reinicia Coturn para aplicar la configuración.

$ sudo systemctl restart coturn

Abre la configuración de Synapse ( homeserver.yaml) para agregar configuraciones de Coturn.

$ nano ~/synapse/homeserver.yaml

Pega las siguientes líneas en él. Reemplaza el valor turn_shared_secret con el valor de static-auth-secret del archivo etc urn urnserver.conf.

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

# vim:ft=yaml

Guarda el archivo presionando Ctrl + X y entrando Y cuando se te pida.

Reinicia Synapse para aplicar los cambios.

$ sudo systemctl restart matrix-synapse

Paso 11 - Acceder a Matrix

Puedes acceder a Matrix Chat usando 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 debajo de Servidor doméstico. Ingresa matrix.example.com como tu servidor doméstico.

Cliente Element Servidor doméstico personalizado

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

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

Ingresa el nombre de usuario y la contraseña que creaste en el paso 8 al configurar Synapse. Haz clic en el botón Iniciar sesión para iniciar sesión. Se te pedirá que crees una copia de seguridad segura y cifrada.

Copia de seguridad segura de Matrix

Selecciona la opción Ingresar una frase de seguridad para crear una frase de seguridad que se requerirá cada vez que inicies sesión. Haz clic en Continuar para proceder.

Frase de seguridad de Element

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

Confirmar frase de seguridad de Element

Ingresa la frase nuevamente y haz clic en Continuar para proceder.

Popup de clave de seguridad de Element

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

Haz clic en el botón Continuar para proceder.

Verificar contraseña de Element

Se te pedirá tu contraseña de cuenta. Ingresa la contraseña y haz clic en el botón Continuar para finalizar la configuración de la copia de seguridad cifrada.

Tablero del cliente web de Element

Creamos una sala de chat grupal llamada HowtoForge usando el botón Crear un chat grupal en la página de inicio. Obtendrás el siguiente popup cuando hagas clic en el botón.

Crear una sala privada en Matrix

Puedes restringir a 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 12 - Instalar Element

Crea un directorio para Element.

$ sudo mkdir -p /var/www/html/element

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

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

Agrega las siguientes líneas a él.

#!/bin/sh
set -e

install_location="/var/www/html/element"
latest="
$(curl -I https://github.com/element-hq/element-web/releases/latest | awk -F '/' '/^location/ {print  substr($NF, 1, length($NF)-1)}')"

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/element-hq/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 presionando Ctrl + X y entrando Y cuando se te pida.

Haz que el archivo sea ejecutable.

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

Ejecuta el script para descargar Element.

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

Paso 13 - Configurar Element

Copia el mismo archivo de configuración de Element.

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

Abre el archivo de configuración para editar.

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

Encuentra las siguientes líneas.

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

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

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

Si deseas usar 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 deshabilitar a los invitados de usar Element.

"disable_guests": true,

Guarda el archivo presionando Ctrl + X y entrando Y cuando se te pida.

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 editar.

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

Pega las siguientes líneas en él.

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

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

    server_name element.example.com;

    root /var/www/html/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;

    # Configuración TLS
    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;
}

Guarda el archivo presionando Ctrl + X y entrando Y cuando se te pida.

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

$ sudo nginx -t
nginx: el archivo de configuración /etc/nginx/nginx.conf tiene una sintaxis correcta
nginx: la prueba del archivo de configuración /etc/nginx/nginx.conf fue exitosa

Reinicia el servicio de Nginx.

$ sudo systemctl restart nginx

Necesitamos configurar los ajustes de SELinux antes de acceder a Element. Ejecuta los siguientes comandos para permitir que Element se ejecute.

$ sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/element(/.*)?"
$ sudo restorecon -Rv /var/www/html/element/

Puedes acceder al cliente Element a través de la URL https://element.example.com en tu navegador. Inicia sesión y serás llevado al tablero de la aplicación. Se te pedirá que verifiques la aplicación con https://app.element.io primero, asegúrate de haber iniciado sesión en la aplicación Element original y se te pedirá que coincidas con los caracteres emoji. Una vez que estés verificado, obtendrás el siguiente tablero.

Tablero de Element autoalojado

Conclusión

Esto concluye nuestro tutorial sobre cómo instalar el servidor de chat Matrix Synapse junto con Coturn y el cliente web Element usando Nginx como servidor proxy en una máquina Debian 12. Si tienes alguna pregunta, publícalas en los comentarios a continuación.

Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.