Servidor Matrix Synapse con Element Web

Matrix es un protocolo de comunicación descentralizado y cifrado de extremo a extremo que permite la mensajería instantánea, las llamadas de voz/video y los bridges con otras plataformas como Slack, Telegram o IRC. Synapse es la implementación de referencia del servidor Matrix, y Element es el cliente web más popular para interactuar con él. Esta guía cubre la instalación completa de un servidor Matrix Synapse con Element Web en Linux, incluyendo la federación, el cifrado E2EE y los bridges más comunes.

Requisitos Previos

  • Ubuntu 20.04/22.04 LTS
  • 2 GB de RAM mínimo (4 GB recomendado para federación activa)
  • 20 GB de espacio en disco
  • Dominio propio con registros DNS configurados
  • PostgreSQL 12+ (recomendado sobre SQLite para producción)
  • Puertos 80, 443 (TCP) y 8448 (TCP, para federación)

Instalación de Matrix Synapse

# Instalar dependencias
sudo apt update
sudo apt install -y lsb-release wget apt-transport-https

# Añadir el repositorio oficial de Matrix Synapse
sudo wget -O /usr/share/keyrings/matrix-org-archive-keyring.gpg \
  https://packages.matrix.org/debian/matrix-org-archive-keyring.gpg

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

sudo apt update && sudo apt install -y matrix-synapse-py3

# El instalador pregunta el server_name (tu dominio, sin subdominios)
# Introducir: tudominio.com (no matrix.tudominio.com)

Configurar PostgreSQL para Synapse

# Instalar PostgreSQL
sudo apt install -y postgresql

# Crear el usuario y la base de datos de Synapse
sudo -u postgres psql <<EOF
CREATE USER synapse_user WITH PASSWORD 'contraseña_postgres_segura';
CREATE DATABASE synapse
    ENCODING 'UTF8'
    LC_COLLATE='C'
    LC_CTYPE='C'
    template=template0
    OWNER synapse_user;
GRANT ALL PRIVILEGES ON DATABASE synapse TO synapse_user;
EOF

Configuración de Synapse

El archivo principal de configuración es /etc/matrix-synapse/homeserver.yaml:

sudo nano /etc/matrix-synapse/homeserver.yaml
# /etc/matrix-synapse/homeserver.yaml

# Nombre del servidor Matrix (tu dominio principal)
server_name: "tudominio.com"

# Puertos de escucha
listeners:
  - port: 8008
    tls: false
    type: http
    x_forwarded: true
    resources:
      - names: [client, federation]
        compress: false

# Base de datos PostgreSQL
database:
  name: psycopg2
  args:
    user: synapse_user
    password: contraseña_postgres_segura
    database: synapse
    host: localhost
    cp_min: 5
    cp_max: 10

# Directorio de medios (imágenes, archivos adjuntos)
media_store_path: /var/lib/matrix-synapse/media

# Logging
log_config: "/etc/matrix-synapse/log.yaml"

# Clave pública del servidor (generada automáticamente)
signing_key_path: "/etc/matrix-synapse/homeserver.signing.key"

# Registro de nuevos usuarios
enable_registration: false  # Deshabilitar registro público
registration_requires_token: true  # Requerir token de invitación

# Federación (comunicación con otros servidores Matrix)
federation_domain_whitelist:
  # Dejar vacío para federar con todos los servidores
  # O listar dominios específicos para federación privada

# Límites de subida de archivos
max_upload_size: 50M

# Retención de mensajes
retention:
  enabled: true
  default_policy:
    min_lifetime: 1d
    max_lifetime: 90d

# Servidor de correo para notificaciones
email:
  smtp_host: smtp.gmail.com
  smtp_port: 587
  smtp_user: [email protected]
  smtp_pass: tu_app_password
  require_transport_security: true
  notif_from: "%(app)s <[email protected]>"
  app_name: "Mi Servidor Matrix"
# Inicializar la base de datos con el schema de Synapse
sudo -u matrix-synapse synapse_homeserver --config-path /etc/matrix-synapse/homeserver.yaml --generate-config --report-stats=no

# Habilitar e iniciar Synapse
sudo systemctl enable matrix-synapse --now
sudo systemctl status matrix-synapse

Configuración de Nginx y SSL

# Obtener certificado SSL de Let's Encrypt
sudo apt install -y certbot python3-certbot-nginx
sudo certbot certonly --nginx -d matrix.tudominio.com
# /etc/nginx/sites-available/matrix

server {
    listen 80;
    server_name matrix.tudominio.com;
    return 301 https://$host$request_uri;
}

# Servidor principal de Matrix
server {
    listen 443 ssl http2;
    server_name matrix.tudominio.com;

    ssl_certificate /etc/letsencrypt/live/matrix.tudominio.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/matrix.tudominio.com/privkey.pem;

    # Aumentar límite de subida de archivos
    client_max_body_size 50M;

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

        proxy_read_timeout 600s;
        proxy_send_timeout 600s;
    }
}

# Puerto de federación (comunicación entre servidores Matrix)
server {
    listen 8448 ssl http2;
    server_name matrix.tudominio.com;

    ssl_certificate /etc/letsencrypt/live/matrix.tudominio.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/matrix.tudominio.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:8008;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
    }
}
sudo ln -s /etc/nginx/sites-available/matrix /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

Instalación de Element Web

# Crear directorio para Element Web
sudo mkdir -p /var/www/element

# Descargar la última versión de Element Web
ELEMENT_VERSION=1.11.70
wget "https://github.com/element-hq/element-web/releases/download/v${ELEMENT_VERSION}/element-v${ELEMENT_VERSION}.tar.gz" -P /tmp

tar xzf /tmp/element-v${ELEMENT_VERSION}.tar.gz -C /tmp
sudo cp -r /tmp/element-v${ELEMENT_VERSION}/* /var/www/element/

# Crear el archivo de configuración de Element
sudo tee /var/www/element/config.json > /dev/null <<EOF
{
    "default_server_config": {
        "m.homeserver": {
            "base_url": "https://matrix.tudominio.com",
            "server_name": "tudominio.com"
        }
    },
    "brand": "Mi Empresa Chat",
    "default_country_code": "ES",
    "default_federate": false,
    "default_theme": "dark",
    "disable_guests": true,
    "disable_login_language_selector": false,
    "room_directory": {
        "servers": ["matrix.tudominio.com"]
    }
}
EOF

Añadir a Nginx la configuración de Element Web:

# Añadir al servidor HTTPS del dominio principal o en un subdominio nuevo
server {
    listen 443 ssl http2;
    server_name chat.tudominio.com;

    ssl_certificate /etc/letsencrypt/live/chat.tudominio.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/chat.tudominio.com/privkey.pem;

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

    location / {
        try_files $uri $uri/ =404;
    }
}

Federación con Otros Servidores

Para que otros servidores Matrix puedan descubrir y comunicarse con el tuyo, necesitas el archivo .well-known:

# Crear el directorio .well-known en el dominio principal
sudo mkdir -p /var/www/html/.well-known/matrix

# Crear el archivo de delegación de servidor
sudo tee /var/www/html/.well-known/matrix/server > /dev/null <<EOF
{
    "m.server": "matrix.tudominio.com:443"
}
EOF

# Crear el archivo de delegación del cliente
sudo tee /var/www/html/.well-known/matrix/client > /dev/null <<EOF
{
    "m.homeserver": {
        "base_url": "https://matrix.tudominio.com"
    }
}
EOF
# Verificar la federación con la herramienta oficial
curl "https://federationtester.matrix.org/api/report?server_name=tudominio.com"

Bridges con Otras Plataformas

Los bridges permiten que usuarios de Matrix se comuniquen con usuarios de Telegram, Slack, IRC, etc.

Bridge de Telegram (mautrix-telegram)

# Instalar el bridge de Telegram
pip3 install mautrix-telegram[all]
mkdir -p /opt/mautrix-telegram && cd /opt/mautrix-telegram

# Generar la configuración inicial
python3 -m mautrix_telegram -g -c config.yaml

# Editar la configuración con los datos del servidor Matrix y el bot de Telegram
nano config.yaml
# Cambiar: homeserver.address, homeserver.domain, appservice.address
# Añadir: telegram.api_id, telegram.api_hash (obtenidos de my.telegram.org)

# Registrar el bridge en Synapse
python3 -m mautrix_telegram -g -c config.yaml -r registration.yaml

# Añadir el registro en homeserver.yaml de Synapse
# app_service_config_files:
#   - /opt/mautrix-telegram/registration.yaml

sudo systemctl restart matrix-synapse

# Iniciar el bridge
python3 -m mautrix_telegram -c config.yaml

Gestión de Usuarios

# Crear el primer usuario administrador
sudo register_new_matrix_user -c /etc/matrix-synapse/homeserver.yaml http://localhost:8008
# Introduce el nombre de usuario, contraseña y si es admin: yes

# Listar usuarios registrados
sudo -u matrix-synapse sqlite3 /var/lib/matrix-synapse/homeserver.db \
  "SELECT name, is_admin FROM users;"  # Solo si usas SQLite

# Para PostgreSQL:
sudo -u matrix-synapse psql -d synapse -c "SELECT name, is_admin FROM users LIMIT 20;"

# Generar token de registro para invitar usuarios
sudo synapse_register_command generate-token -c /etc/matrix-synapse/homeserver.yaml

# Desactivar un usuario
sudo synapse_admin -c /etc/matrix-synapse/homeserver.yaml deactivate @usuario:tudominio.com

# Ver estadísticas del servidor
curl "https://matrix.tudominio.com/_synapse/admin/v1/statistics/users/media" \
  -H "Authorization: Bearer TU_TOKEN_ADMIN"

Solución de Problemas

Synapse no arranca:

# Ver logs detallados
sudo journalctl -u matrix-synapse -f

# El error más común es la configuración de la base de datos
# Verificar conectividad a PostgreSQL
sudo -u matrix-synapse psql -h localhost -U synapse_user -d synapse -c "SELECT 1"

La federación no funciona:

# Verificar que el puerto 8448 está abierto
sudo ufw status | grep 8448
nc -zv matrix.matrix.org 8448

# Probar la federación desde matrix.org
curl "https://federationtester.matrix.org/api/report?server_name=tudominio.com"

# Verificar los archivos .well-known
curl https://tudominio.com/.well-known/matrix/server

El cifrado E2EE falla o se pierden las claves:

# El cifrado E2EE se gestiona en el cliente (Element), no en el servidor
# Asegurarse de hacer backup de las claves de cifrado en Element:
# Configuración → Seguridad → Cifrado → Exportar claves de cifrado

# Verificar que el módulo de claves del servidor está activo
curl "https://matrix.tudominio.com/_matrix/client/v3/keys/query" \
  -H "Authorization: Bearer TOKEN_USUARIO" \
  -H "Content-Type: application/json" \
  -d '{"device_keys": {}}'

Alto consumo de disco:

# Ver el tamaño de los medios almacenados
du -sh /var/lib/matrix-synapse/media/

# Limpiar medios remotos cacheados (imágenes de otros servidores)
sudo -u matrix-synapse synapse_homeserver --config-path /etc/matrix-synapse/homeserver.yaml \
  --purge-remote-media

# Configurar retención automática de medios locales
# En homeserver.yaml añadir:
# media_retention:
#   local_media_lifetime: 90d
#   remote_media_lifetime: 14d

Conclusión

Matrix Synapse con Element Web proporciona una plataforma de comunicación corporativa completa y soberana, donde la organización mantiene el control total sobre los mensajes, los archivos compartidos y los datos de los usuarios. La federación con el ecosistema Matrix permite comunicarse con usuarios de otros servidores de forma nativa, mientras que los bridges extienden la plataforma hacia Telegram, Slack o WhatsApp sin abandonar el entorno corporativo. Para equipos que valoran la privacidad y la independencia de los grandes proveedores de comunicación, Matrix es la alternativa más robusta y estandarizada disponible.