Como instalar Matrix Synapse Homeserver mediante Docker

Qué tal aquí Fran. Os traigo un nuevo post sobre el sistema operativo mas molón. Un placer linuxeros.

matriz es un estándar de código abierto (protocolo) para VoIP, mensajería instantánea y videollamadas, es decir, comunicaciones en tiempo real. Proporciona cifrado extremo a extremo junto con soporte para puentes a varias otras alternativas de mensajería como flujo, IRC, Telegram o cualquier otro XMPP cliente. También puede funcionar con conexiones de bajo ancho de banda.

En este tutorial, te mostraré cómo instalar el servidor doméstico Matrix Synapse mediante contenedores Docker.

¿Qué es un servidor doméstico Matrix?

Matrix en sí mismo es sólo una especificación y hay muchas implementaciones del protocolo Matrix disponibles públicamente.

Los servidores de casas son básicamente cualquiera de estas implementaciones desplegadas en un servidor, a los que puede acceder a través de cualquier cliente Matrix elemento.

La cuestión que puede surgir es: ¿por qué crear servidores de casas particulares si algunos ya están disponibles públicamente?

Bueno, para empezar, puede compartir su servidor privado entre sus amigos, familiares o compañeros de trabajo y usarlo como medio de comunicación del día a día. A menos que mantenga una conversación con algún usuario de otro servidor de casa, todos los datos estarán seguras en su servidor.

Esto le proporciona el control sobre todos los aspectos que los servidores de hogar públicos no pueden proporcionar.

Aplicación de la implementación del servidor de hombres Synapse Matrix mediante contenedores Docker

utilizaré sinapsis, Una implementación popular del servidor doméstico Matrix en este tutorial. Escrito en Python, Synapse está desarrollado por el equipo básico de Matrix.

En Linux Handbook preferimos el docker antes de que el despliegue nativo, por lo que las secciones siguientes tratarán el despliegue de Synapse realizado mediante docker.

requisito previo

  • Un sistema / servidor Linux. Se recomienda utilizar Linode para desplegar rápidamente un servidor Linux en la nube.
  • Un dominio que funcione y acceso a sus registros DNS (a menos que desee configurarlo a localhost)
  • Debería instalar tanto docker como docker-compose. Puede seguir nuestra guía para instalar Docker y Docker Compose a CentOS.
  • Creo que tiene conocimiento de órdenes esenciales de Linux y no te da miedo utilizar el terminal para editar archivos de configuración.
  • Los conocimientos básicos de Docker le ayudarán, pero también puede seguir el tutorial sin él.

Paso 1: configure el servidor proxy inverso

Antes de ensuciar las manos con Synapse, primero debe configurar el contenedor proxy inverso y su acompañante encriptado contenedor para certificados TLS (Desea https, confíe en él).

Configuración del contenedor proxy inverso

En un entorno de producción, no utilizar docker run ..., Tu utilizas docker-compose. Por lo tanto, configuramos el archivo 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 preferido, cree un archivo llamado docker-compose.ymly añada el siguiente contenido:

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"

Por lo tanto, aquí primero defina su servicio, llamado proxy. Las características clave a tener en cuenta son:

  • Los volúmenes ciertos, vhost y html se compartirán entre ellos jwilder/nginx-proxy y jrcs/letsencrypt-nginx-proxy-companion contenedores.
  • La toma de conexión está montada de sólo lectura a /tmp/docker.sock.
  • Utiliza una red diferente de la red puente por defecto.
  • Los puertos 80 y 443 están vinculados, para http y https, respectivamente.

Configure letsencrypt-nginx-proxy-companion

Añada el 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"]

He aquí otro servicio definido, llamado letsencrypt. Vamos a revisarlo también:

  • Todos los volúmenes del servicio anterior también se montan en las mismas ubicaciones aquí.
  • El zócalo de conexión está ligado sólo a /var/run/docker.sock.
  • La variable de entorno NGINX_PROXY_CONTAINER establece el nombre del contenedor del contenedor de proxy inverso, que en nuestro caso es «proxy».
  • Comparte la misma red de «servidor».

Al final de estas dos descripciones del servicio, agregue las definiciones de volúmenes y la definición de red, como a continuación:

networks:
    server:
        external: true

volumes:
    certs:
    vhost:
    html:

Hay dos cosas importantes a tener en cuenta aquí:

  1. Utilizará un fichero de redacción independiente para Synapse. De este modo, tendrá un desarrollo modular y puede reducir fácilmente un servicio, sin afectar a otros, desplegando el proxy inverso y el complemento con un archivo YAML diferente.
  2. La red es externa. Esto es huir de cualquier problema con otros contenedores que no compartan la misma red debido a cómo docker-compose nombra sus volúmenes y redes cuando se deja, se crea automáticamente. Esto nos lleva a crear la red. Utilice el orden docker network create server para crear la red.

Ahora que todo está hecho, guarde el archivo y salga del.

Ahora es hora de iniciar el servidor proxy inverso.

docker-compose up -d

Paso 2: configure Synapse

Ahora es hora de que por fin empiece a centrarse en la parte buena. Por lo tanto, desplegar sinapsis es realmente un proceso en dos pasos.

Primero, el necesita para generar una configuración; después, limpie la configuración y despliegue nuestro servidor doméstico.

Empezamos para obtener el fichero de redacción.

genera configuración

Cree un directorio separado llamado «Synapse» y cambie a él.

mkdir synapse && cd synapse

Cree un archivo llamado docker-compose.yml y ábralo, ya sabéis el taladro, ¿verdad?

Asegúrese de que utilice los valores correctos para sub.domain.com aquí el archivo yml:

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

Este es un archivo de composición estándar por su aspecto, pero aún así se detallan algunas opciones destacadas:

  • Está utilizando un montaje de vinculación en lugar de un volumen, porque el archivo de configuración se generará y el Edite. Seguro que puede utilizar volúmenes, pero luego tiene que editar el archivo situado en /var/lib/docker/volumes/<name>/_data.
  • Las variables de entorno VIRTUAL_HOST & LETSENCRYPT_HOST son para los contenedores de proxy leters e inversos, que generarán los cambios de configuración necesarios junto con los certificados, sin que intervengáis manualmente.
  • asegúrate SYNAPSE_SERVER_NAME apunta al FQDN del servidor Synapse (junto con el subdominio).
  • conjunto VIRUAL_PORT en 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 intermediario inverso o, de lo contrario, los contenedores no podrán comunicarse, lo que a su vez romperá todo el proceso.

Confirme que tiene la IP del servidor añadida al registro A de su DNS y que un registro CNAME apunta al subdominio exacto.

crea data directorio y ejecute el siguiente

docker-compose run --rm synapse generate

Esto generará el archivo de configuración dentro de ./data, llamado «homeserver.yaml».

Configure la sinapsis

Hay muchas opciones configurables en el archivo homeserver.yaml , Que están fuera del alcance de este tutorial. Os propongo que revise los comentarios de este archivo y que lea aquí.

De momento, sólo debe asegurarse de los siguientes cambios:

  • el server_name variable se establece en el subdominio que elija, tal como se establece en la variable de entorno SYNAPSE_SERVER_NAME.
  • TLS está definido como falso. Está utilizando un servidor proxy inverso, por lo que TLS se gestiona a través de su servidor Web. Deje el puerto.
  • asegúrate enable_registration establece en true, para que pueda registrarse y utilizar el servidor de casa.

Guarde el archivo y salga.

Despliegue el servidor doméstico Synapse Matrix

Ahora que todo está en su sitio, puede iniciar la sinapsis mediante una orden tan sencilla como

docker-compose up -d

Ahora el servidor doméstico está lista para utilizarse. Si visita el subdominio en un navegador web, debería ver un mensaje como este:

Implementación del servidor doméstico Synapse Matrix

Uso de PostgreSQL para la base de datos [optional]

Por defecto, utiliza Synapse SQLite para su base de datos. Ahora es bueno para probarlos y hacer un uso casual, pero le recomendamos que utilice un caso de uso más importante PostgreSQL.

Agregue PostgreSQL en el archivo de redacción de sinapsis

Vaya al directorio de sinapsis si aún no estás y abra docker-compose.yml. Añada las siguientes líneas a este archivo de composició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 variable es muy necesaria. Establece la clasificación, el tipo y la codificación utilizados para la base de datos postgres. Son una necesidad absoluta para que la sinapsis funcione. Agregue el volumen en la sección de volúmenes:

volumes:
    postgresdata:

Configure Synapse

Ahora debe hacer saber a Synapse base de datos postgresql. Lo haga editando el viejo homeserver.yaml dossier. Abra este archivo y descubre las líneas siguientes:

database:
    name: sqlite3
    args:
        database: /path/to/homeserver.db

Sacarlos ya que ya no los necesitamos. Añada el siguiente:

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.

Mírelo bien, verá las similitudes entre esto y las variables de entorno que ha configurado para el contenedor postgresql.

En cuanto al anfitrión, como está utilizando docker-compose y una red personalizada, Synapse podrá resolver el nombre del servicio automáticamente. No tendrá que preocuparse por ello.

Guarde el archivo y salga.

desplegar

Bueno, ¿qué queda por hacer realmente? Despliegue-lo.

docker-compose up -d

Pruebe el despliegue del servidor doméstico Synapse Matrix

El servidor doméstico está a punto. Vamos a probarlo. Matrix es sólo un protocolo, Synapse es sólo una implementación. Necesita un cliente Matrix para poder utilizarlo como una herramienta de mensajería.

Aquí hay un lista de varios clientes de Matrix que están disponibles. elemento es probablemente uno de los clientes Matrix más populares que puede utilizar.

Cuando tenga instalado el cliente Matrix, ejecútelo. Crear una cuenta aquí.

Matrix Synapse mediante Elemento

En la página de registro, rellene todos los datos y, al servidor doméstico, introduzca el subdominio que habíais utilizado anteriormente. Haga clic en registro.

Matrix Synapse mediante Elemento

Ahora tiene un despliegue de Synapse que funciona perfectamente y que puede utilizar con tu familia o amigos sin tener que preocuparse de donde se almacenan sus datos ni nada parecido.

Configuración de la federación a Synapse con Docker [optional]

La federación es básicamente la capacidad de comunicarse con los usuarios en un servidor de casa diferente.

Por ejemplo, si su usuario es @coolguy: coolserver.me, puede invitar a alguien como @Greatme: awesome.us a una habitación del servidor de casa.

Del mismo modo, también puede unirse a habitaciones alojadas en otros servidores de casas.

Si ya tiene Synapse en ejecución, no es necesario detener los contenedores. Sólo necesita hacer cambios en el contenedor de proxy Nginx. Esto consiste en no más de tres pasos cortos y sencillos.

Hay un par de maneras de hacer funcionar la federación, pero entre éstas, la que he encontrado que es extremadamente fácil de seguir y que requiere cambios mínimos en la configuración existente, se denomina delegación de puertos.

Por defecto, cada servidor de matriz intenta llegar a otro servidor de matriz a través del puerto 8443. El siguiente proceso indica básicamente a los demás servidores que utilicen un puerto diferente. Como https ya funciona en el puerto 443, simplemente delegar el puerto de comunicación de matriz predeterminado a 443.

Paso 1: cree un archivo de configuración para nuestro servidor proxy inverso

Acceda al directorio de proxy inverso Nginx. Cree un archivo llamado synapse-federation. Añada el texto siguiente a este archivo:

location /.well-known/matrix/server 
    return 200 '"m.server": "$VIRTUAL_HOST:443"';

cambio $VIRTUAL_HOST a su valor adecuado, que es básicamente el dominio donde se sirve vuestra instancia matricial (definido según el archivo de composición de docker de Synapse).

Paso 2: Editar docker-compose.yml

Abre tu docker-compose.yml y añadir otra entrada a la matriz de volúmenes:

 - ./synapse-federation:/etc/nginx/vhost.d/$VIRTUAL_HOST

Nuevamente, cambie $VIRTUAL_HOST a su valor adecuado.

Paso 3: reinicie el servidor proxy

Ahora hay que reiniciar el servidor proxy.

docker-compose up -d proxy

Esto recreará el contenedor intermediario inverso. No se debe preocupar la pérdida de ajustes previos, a menos que haya cambiado cualquier cosa manualmente después del despliegue. La configuración es dinámica, por lo tanto, todo irá bien.

Pruebe los cambios

Puede probar los cambios de dos maneras.

Intente unirse a una habitación como #servers:matrix.org. Ejecute el siguiente, si lo tiene jq instalado:

curl https://federationtester.matrix.org/api/report?server_name=$VIRTUAL_HOST --silent | jq -r '.FederationOK'

O utilice 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 evidentemente cambiar $VIRTUAL_HOST al dominio que sirve su instancia de sinapsis.

Fue útil?

Espero que esto os haya sido útil tanto como la experiencia para mí. Para más artículos como éste, no dude en comentar a continuación. Si tiene problemas, deje un comentario e intentaré ayudarle.

Este Blog lo escribimos para colaborar y servir de ayuda a la comunidad Linux. Esperamos que os guste.

Leave a Reply