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
- Un servidor que ejecute Debian 12.
- Un usuario no sudo con privilegios de root.
- El Firewall sin complicaciones (UFW) está habilitado y en funcionamiento.
- Nombres de dominio completamente calificados (FQDN) para Matrix, Element y Coturn apuntando a tu servidor. Usaremos
matrix.example.com,element.example.comycoturn.example.comrespectivamente para los tres servicios. - 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 -yAlgunos 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
runningEl 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-allDeberí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=httpsVerifica nuevamente el estado del firewall.
$ sudo firewall-cmd --zone=public --list-allDeberí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 --reloadPaso 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.rpmDesactiva el módulo de PostgreSQL incorporado.
$ sudo dnf -qy module disable postgresqlAhora, puedes instalar PostgreSQL usando el siguiente comando.
$ sudo dnf install -y postgresql16-server postgresql16-contrib postgresql16-develsudo 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.1Inicializa la base de datos de PostgreSQL.
$ sudo /usr/pgsql-16/bin/postgresql-16-setup initdb
Inicializando base de datos ... OKHabilita el servicio de PostgreSQL.
$ sudo systemctl enable postgresql-16Inicia el servicio de PostgreSQL.
$ sudo systemctl start postgresql-16Verifica 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 postgresCrea 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 synapsedbSal de la cuenta postgres.
$ exitPaso 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-develCrea un directorio para Synapse.
$ mkdir -p ~/synapseCrea un entorno virtual de Python en el directorio mencionado.
$ virtualenv -p python3 ~/synapse/envActiva el entorno virtual.
$ source ~/synapse/env/bin/activateAsegúrate de tener la última versión de pip y setuptools.
(env) $ pip install --upgrade pip
(env) $ pip install --upgrade setuptoolsInstala 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 ~/synapseEjecuta 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/. 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 startDeberí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 stopDesactiva el entorno virtual.
(env) $ deactivatePaso 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.repoPega 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=trueUna 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-mainlineInstala Nginx.
$ sudo dnf install nginx -yVerifica la instalación.
$ nginx -v
nginx version: nginx/1.25.3Habilita e inicia el servicio del servidor Nginx.
$ sudo systemctl enable nginx --nowVerifica 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 -yHabilita e inicia el servicio Snap.
$ sudo systemctl enable snapd --nowInstala el paquete central de Snap y asegúrate de que tu versión de Snapd esté actualizada.
$ sudo snap install core
$ sudo snap refresh coreCrea 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.shInstala Certbot.
$ sudo snap install --classic certbotUsa 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/certbotVerifica la versión de Certbot.
$ certbot --version
certbot 2.8.0Ejecuta 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.comEl 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 4096Verifica el servicio programador de renovación de Certbot.
$ systemctl list-timersEncontrará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.serviceHaz una prueba del proceso para verificar si la renovación de SSL está funcionando bien.
$ sudo certbot renew --dry-runSi 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/pythonAplica la política para permitir conexiones a hosts externos.
$ sudo setsebool -P httpd_can_network_connect 1Aplica la política para permitir que Nginx dé acceso a PostgreSQL.
$ sudo setsebool -P httpd_can_network_connect_db 1Paso 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) $ deactivateCrea y abre el archivo matrix-synapse.service en el directorio /etc/systemd/system/ para editar.
$ sudo nano /etc/systemd/system/matrix-synapse.servicePega 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.targetUna vez terminado, guarda el archivo presionando Ctrl + X y entrando Y cuando se te pida.
Recarga el demonio del servicio.
$ sudo systemctl daemon-reloadHabilita el servicio Matrix Synapse.
$ sudo systemctl enable matrix-synapseInicia el servicio Matrix Synapse.
$ sudo systemctl start matrix-synapseVerifica el estado del servicio.
$ sudo systemctl status matrix-synapseDeberí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.yamlPega 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.dbAgrega 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: 10Por 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: falseUna 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) $ deactivatePuedes 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.yamlPega la siguiente línea en la parte inferior.
enable_registration: truePor 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: trueUna 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-synapsePaso 9 - Configurar Nginx
Abre el archivo /etc/nginx/nginx.conf para editar.
$ sudo nano /etc/nginx/nginx.confAgrega 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.confPega 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 exitosaReinicia el servicio de Nginx.
$ sudo systemctl restart nginxPaso 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 coturnAbre 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 --reloadGenera 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.comGenera 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=u3ksgJ9X876sFMO00A8KabXwZvzVwCmV30wWvZ7DzGiepRwNRYSCTYzf2E8olNzdDHu7oO3XpT3l5bv5mVdhXEQ3pnoTWBquSVPFFBJtyD6y9gBxiMaD2TYTD2WohQLE9s7OKJVpkDeKTnZQnkmjrFadE3M9DRxPL1W5Lgdg6XLLKABgb5XGkutRgkJOV0JRH4sBYsot63fWq9mcGTm6nAMdIycvDVDOs7vhoeqRzcTbMF0wsfAHVJNhXpGGFDyZAbre el archivo de configuración para editar.
$ sudo nano /etc/coturn/turnserver.confVamos 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-secretA 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=u3ksgJ9X876sFMO00A8KabXwZvzVwCmV30wWvZ7DzGiepRwNRYSCTYzf2E8olNzdDHu7oO3XpT3l5bv5mVdhXEQ3pnoTWBquSVPFFBJtyD6y9gBxiMaD2TYTD2WohQLE9s7OKJVpkDeKTnZQnkmjrFadE3M9DRxPL1W5Lgdg6XLLKABgb5XGkutRgkJOV0JRH4sBYsot63fWq9mcGTm6nAMdIycvDVDOs7vhoeqRzcTbMF0wsfAHVJNhXpGGFDyZEl 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.comA 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=1200A 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-relayTambié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.pemA 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:ffffUna 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 coturnAbre la configuración de Synapse ( homeserver.yaml) para agregar configuraciones de Coturn.
$ nano ~/synapse/homeserver.yamlPega 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=yamlGuarda el archivo presionando Ctrl + X y entrando Y cuando se te pida.
Reinicia Synapse para aplicar los cambios.
$ sudo systemctl restart matrix-synapsePaso 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.

Haz clic en el enlace Editar debajo de Servidor doméstico. Ingresa matrix.example.com como tu servidor doméstico.

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.

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.

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.

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.

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

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.

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.

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.

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/elementCrea un nuevo archivo para obtener la última versión de Element.
$ sudo nano /var/www/html/element/update.shAgrega 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.shEjecuta el script para descargar Element.
$ sudo /var/www/html/element/update.shPaso 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.jsonAbre el archivo de configuración para editar.
$ sudo nano /var/www/html/element/config.jsonEncuentra 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.comCrea y abre el archivo /etc/nginx/conf.d/element.conf para editar.
$ sudo nano /etc/nginx/conf.d/element.confPega 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 exitosaReinicia el servicio de Nginx.
$ sudo systemctl restart nginxNecesitamos 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.

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.
Recibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.