Matrix es un estándar (protocolo) de código abierto para VoIP, mensajería instantánea y videollamadas, es decir, comunicación en tiempo real. Proporciona cifrado de extremo a extremo junto con soporte para puentes a otras alternativas de mensajería como Slack, IRC, Telegram o cualquier otro cliente XMPP. También puede funcionar con conexiones de bajo ancho de banda.
En este tutorial, le mostraré cómo instalar Matrix Homeserver Synapse usando contenedores Docker.
¿Qué es un servidor doméstico Matrix?
Matrix en sí mismo es solo una especificación y hay muchas implementaciones del protocolo Matrix disponibles públicamente.
Los servidores domésticos son básicamente cualquiera de esas implementaciones implementadas en un servidor, a las que puede acceder a través de cualquier cliente de Matrix como Element.
La pregunta que puede surgir es ¿por qué configurar servidores domésticos privados si algunos ya están disponibles públicamente?
Bueno, para empezar, puede compartir su servidor doméstico privado entre sus amigos, familiares o colegas y usarlo como su medio de comunicación diario. A menos que participe en una conversación con algún usuario de otro servidor doméstico, todos los datos estarán seguros y protegidos en su servidor.
Esto le da el control sobre todos los aspectos que los servidores domésticos públicos no pueden proporcionar.
Implementación de Synapse Matrix homserver usando contenedores Docker
En este tutorial, usaré Synapse, una popular implementación de servidor doméstico de Matrix. Escrito en Python, Synapse es desarrollado por el equipo central de Matrix.
En Linux Handbook preferimos Docker a la implementación nativa, por lo que las siguientes secciones cubrirán la implementación de Synapse realizada con Docker.
Requisito previo
- Un sistema/servidor Linux. Recomendamos usar Linode para implementar rápidamente un servidor Linux en la nube.
- Un dominio en funcionamiento y acceso a sus registros DNS (a menos que desee configurarlo en localhost)
- Debe tener instalados docker y docker-compose. Puede seguir nuestra guía sobre cómo instalar Docker y Docker Compose en CentOS.
- Creo que tiene conocimiento de los comandos esenciales de Linux y no tiene miedo de usar la terminal para editar archivos de configuración.
- El conocimiento básico de Docker lo ayudará, pero también puede seguir el tutorial sin él.
Paso 1:configurar el proxy inverso
Antes de ensuciarse las manos con Synapse, primero debe configurar su contenedor de proxy inverso y su contenedor complementario Let's Encrypt para certificados TLS (quiere https, confíe en mí).
Configuración del contenedor de proxy inverso
En un entorno de producción, no usa docker run ...
, usas docker-compose
. Entonces, configuremos el jwilder/nginx-proxy
como proxy inverso.
Cree un directorio llamado proxy inverso y cambie a este directorio recién creado:
mkdir reverse-proxy && cd reverse-proxy
Ahora abra su editor de texto favorito, cree un archivo llamado docker-compose.yml
y agregue los siguientes contenidos:
version: "3.3"
services:
proxy:
image: "jwilder/nginx-proxy"
container_name: "proxy"
volumes:
- "certs:/etc/nginx/certs"
- "vhost:/etc/nginx/vhost.d"
- "html:/usr/share/nginx/html"
- "/run/docker.sock:/tmp/docker.sock:ro"
networks: ["server"]
restart: "always"
ports:
- "80:80"
- "443:443"
Así que aquí, primero define su servicio, llamado proxy
. Las características clave a tener en cuenta son:
- Los volúmenes certificados, vhost y html se compartirán entre
jwilder/nginx-proxy
yjrcs/letsencrypt-nginx-proxy-companion
contenedores. - El socket de la ventana acoplable está montado solo para lectura en
/tmp/docker.sock
. - Utiliza una red distinta a la red de puente predeterminada.
- Los puertos 80 y 443 están vinculados, para http y https respectivamente.
Configurar letsencrypt-nginx-proxy-companion
Agregue lo siguiente al final del mismo archivo de composición
letsencrypt:
image: "jrcs/letsencrypt-nginx-proxy-companion"
container_name: "letsencrypt"
volumes:
- "certs:/etc/nginx/certs"
- "vhost:/etc/nginx/vhost.d"
- "html:/usr/share/nginx/html"
- "/run/docker.sock:/var/run/docker.sock:ro"
environment:
NGINX_PROXY_CONTAINER: "proxy"
networks: ["server"]
restart: "always"
depends_on: ["proxy"]
Aquí tienes otro servicio definido, llamado letsencrypt. Repasemos este también:
- Todos los volúmenes del servicio anterior también se montan aquí en las mismas ubicaciones.
- El socket de la ventana acoplable está vinculado a solo lectura en
/var/run/docker.sock
. - La variable de entorno
NGINX_PROXY_CONTAINER
se establece en el nombre del contenedor del contenedor del proxy inverso, que en nuestro caso es "proxy". - Comparte la misma red de "servidor".
Al final de estas dos descripciones de servicio, agregue las definiciones de los volúmenes y la definición de la red, como se muestra a continuación:
networks:
server:
external: true
volumes:
certs:
vhost:
html:
Dos cosas importantes a tener en cuenta aquí:
- Va a utilizar un archivo de redacción independiente para Synapse. De esta manera, tendrá una implementación modular y podrá deshabilitar fácilmente un servicio, sin afectar a los demás, al implementar el proxy inverso y el complemento con un archivo YAML diferente.
- La red es externa. Eso es para huir de cualquier problema con otros contenedores que no comparten la misma red debido a cómo
docker-compose
nombra sus volúmenes y redes cuando se deja que se cree automáticamente. Eso nos lleva a crear la red. Use el comandodocker network create server
para crear la red.
Ahora que todo está hecho, guarde el archivo y salga del editor.
Ahora es el momento de iniciar su servidor proxy inverso.
docker-compose up -d
Paso 2:configurar Synapse
Ahora es el momento de que finalmente comiences a concentrarte en la parte buena. Entonces, implementar Synapse es realmente un proceso de dos pasos.
Primero, lo necesita para generar una configuración, luego, ordena la configuración e implementa nuestro servidor doméstico.
Comencemos por obtener el archivo de redacción.
Generar configuración
Cree un directorio separado llamado "synapse" y cambie a él.
mkdir synapse && cd synapse
Cree un archivo llamado docker-compose.yml
y ábrelo, ya conoces el ejercicio, ¿verdad?
Asegúrese de utilizar los valores correctos para sub.domain.com
en el archivo yml aquí:
version: "3.3"
services:
synapse:
image: "matrixdotorg/synapse:latest"
container_name: "synapse"
volumes:
- "./data:/data"
environment:
VIRTUAL_HOST: "sub.domain.com"
VIRTUAL_PORT: 8008
LETSENCRYPT_HOST: "sub.domain.com"
SYNAPSE_SERVER_NAME: "sub.domain.com"
SYNAPSE_REPORT_STATS: "yes"
networks: ["server"]
networks:
server:
external: true
Aparentemente, este es un archivo de redacción estándar, pero a continuación se explican algunas opciones destacadas:
- Está utilizando un montaje de enlace en lugar de un volumen, eso se debe a que el archivo de configuración se generará allí y debe editarlo. Seguramente puede usar volúmenes, pero luego tendrá que editar el archivo ubicado en
/var/lib/docker/volumes/<name>/_data
. - Las variables de entorno
VIRTUAL_HOST
&LETSENCRYPT_HOST
son para los contenedores de proxy inverso y letsencrypt, que generarán los cambios de configuración necesarios junto con los certificados, sin que usted intervenga manualmente. - Asegúrese de que
SYNAPSE_SERVER_NAME
apunta al FQDN de su servidor Synapse (junto con el subdominio). - Establecer
VIRUAL_PORT
a 8008. El contenedor Synapse expone el puerto HTTP 8008 para que sus clientes se comuniquen con él. - Finalmente, asegúrese de que este contenedor utilice la misma red que el contenedor del proxy inverso o, de lo contrario, los contenedores no podrán comunicarse, lo que a su vez interrumpirá todo el proceso.
Confirme que ha agregado la IP del servidor al registro A de su DNS y que un registro CNAME apunta al subdominio exacto.
Crear un data
directorio y ejecute el siguiente comando
docker-compose run --rm synapse generate
Esto generará el archivo de configuración dentro de ./data, llamado "homeserver.yaml".
Configurar sinapsis
Hay muchas opciones configurables en homeserver.yaml
archivo, que están fuera del alcance de este tutorial. Le sugiero que revise los comentarios en ese archivo y lea aquí.
Por ahora, solo asegúrese de los siguientes cambios:
- El
server_name
variable se establece en el subdominio de su elección, como se establece en la variable de entornoSYNAPSE_SERVER_NAME
. - TLS está establecido en falso. Está utilizando un proxy inverso, por lo que TLS se maneja a través de su servidor web. Deja el puerto en paz.
- Asegúrese de
enable_registration
se establece en verdadero, para que pueda registrarse y usar su servidor doméstico.
Guarde el archivo y salga.
Implementar el servidor principal de Synapse Matrix
Ahora que todo está en su lugar, puede iniciar la sinapsis usando un comando tan simple como
docker-compose up -d
Ahora su servidor doméstico está listo para ser utilizado. Si visita el subdominio en un navegador web, debería ver un mensaje como este:

Usando PostgreSQL para base de datos [opcional]
De forma predeterminada, synapse usa SQLite para su base de datos. Eso es bueno para pruebas y uso casual, pero para un caso de uso más importante, recomiendo usar PostgreSQL.
Agregue PostgreSQL al archivo de composición de synapse
Vaya al directorio de sinapsis si aún no está allí y abra docker-compose.yml
. Agregue las siguientes líneas a este archivo de redacción.
postgresql:
image: postgres:latest
restart: always
environment:
POSTGRES_PASSWORD: somepassword
POSTGRES_USER: synapse
POSTGRES_DB: synapse
POSTGRES_INITDB_ARGS: "--encoding='UTF8' --lc-collate='C' --lc-ctype='C'"
volumes:
- "postgresdata:/var/lib/postgresql/"
networks: ["server"]
El POSTGRES_INITDB_ARGS
La variable es muy necesaria. Establece la intercalación, el ctype y la codificación utilizados para la base de datos de postgres. Estos son absolutamente necesarios para que la sinapsis funcione. Agregue el volumen a la sección de volúmenes:
volumes:
postgresdata:
Configurar Synapse
Ahora debe informar a synapse sobre la base de datos postgresql. Lo haces editando el antiguo homeserver.yaml
expediente. Abra ese archivo y encuentre las siguientes líneas:
database:
name: sqlite3
args:
database: /path/to/homeserver.db
Elimínelos porque ya no los necesitamos. Agregue lo siguiente en su lugar:
database:
name: psycopg2
args:
user: synapse
password: somepassword
host: postgresql
database: synapse
cp_min: 5
cp_max: 10
El nombre de la base de datos es psycopg2, que es un adaptador PostgreSQL para python.
Mire de cerca, verá las similitudes entre esto y las variables de entorno que ha configurado para el contenedor postgresql.
En cuanto al host, ya que está utilizando docker-compose
y una red personalizada, Synapse podrá resolver el nombre del servicio automáticamente. No tienes que preocuparte por eso.
Guarde el archivo y salga.
Implementar
Bueno, ¿qué queda por hacer realmente? Implementarlo.
docker-compose up -d
Prueba la implementación del servidor doméstico de Synapse Matrix
Su servidor doméstico está listo. Vamos a probarlo. Matrix es solo un protocolo, Synapse es solo una implementación. Necesita un cliente de Matrix para poder usarlo como una herramienta de mensajería.
Aquí hay una lista de varios clientes de Matrix que están disponibles. Element es probablemente uno de los clientes Matrix más populares que puede usar.
Cuando tenga instalado el cliente Matrix, ejecútelo. Crea una cuenta aquí.

En la página de registro, complete todos los detalles y en el servidor doméstico, ingrese el subdominio que utilizó anteriormente. Haga clic en registrarse.

Ahora tiene una implementación de Synapse que funciona perfectamente y que puede usar con su familia o amigos sin tener que preocuparse por dónde se almacenan sus datos ni nada por el estilo.
Configuración de federación en Synapse con Docker [opcional]
La federación es básicamente la capacidad de comunicarse con los usuarios en un servidor doméstico diferente.
Por ejemplo, si su ID de usuario es @coolguy:coolserver.me, podrá invitar a alguien como @Greatme:awesome.us a una sala de su servidor doméstico.
Del mismo modo, también puede unirse a salas alojadas en otros servidores domésticos.
Si ya tiene Synapse ejecutándose, no es necesario que detenga los contenedores. Solo tiene que hacer cambios en su contenedor de proxy NGINX. Esto consta de no más de tres pasos cortos y sencillos.
Hay un par de formas de hacer que la federación funcione, pero entre ellas, la que me pareció extremadamente fácil de seguir y que requiere cambios mínimos en la configuración existente se llama delegación de puertos.
De forma predeterminada, cada servidor de matriz intenta llegar a otro servidor de matriz a través del puerto 8443. El siguiente proceso básicamente le dice a los otros servidores que usen un puerto diferente. Debido a que https ya está funcionando en el puerto 443, simplemente va a delegar el puerto de comunicación de matriz predeterminado al 443.
Paso 1:Cree un archivo de configuración para nuestro proxy inverso
Ingrese al directorio del proxy inverso de Nginx. Cree un archivo, llamado synapse-federation
. Agregue el siguiente texto a este archivo:
location /.well-known/matrix/server {
return 200 '{"m.server": "$VIRTUAL_HOST:443"}';
}
Cambiar $VIRTUAL_HOST
a su valor apropiado, que es básicamente el dominio en el que se sirve su instancia de matriz (establecido de acuerdo con el archivo docker-compose de Synapse).
Paso 2:Editar docker-compose.yml
Abra su docker-compose.yml
archivo y agregue otra entrada a la matriz de volúmenes:
- ./synapse-federation:/etc/nginx/vhost.d/$VIRTUAL_HOST
De nuevo, cambia $VIRTUAL_HOST
a su valor apropiado.
Paso 3:reiniciar el servidor proxy
Ahora necesita reiniciar el servidor proxy.
docker-compose up -d proxy
Esto recreará el contenedor de proxy inverso. No tiene que preocuparse por la pérdida de ninguna configuración anterior, a menos que haya cambiado algo manualmente después de la implementación. La configuración es dinámica, por lo que todo estará bien.
Probar los cambios
Puede probar los cambios de dos maneras.
Intente unirse a una sala como #servers:matrix.org
. Ejecute el siguiente comando, si tiene jq
instalado:
curl https://federationtester.matrix.org/api/report?server_name=$VIRTUAL_HOST --silent | jq -r '.FederationOK'
O usa este más hack-y:
curl https://federationtester.matrix.org/api/report?server_name=$VIRTUAL_HOST --silent | awk '/FederationOK/ {print $2}'
Esto debería generar 'verdadero'. Y obviamente cambie $VIRTUAL_HOST
al dominio que sirve su instancia de synapse.
¿Fue útil?
Espero que esto haya sido útil para usted tanto como lo fue la experiencia para mí. Si desea más artículos como este, no dude en comentar a continuación. Si tiene algún problema, deje un comentario e intentaré ayudarlo.