GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo instalar Matrix Synapse Homeserver usando Docker

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 y jrcs/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í:

  1. 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.
  2. 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 comando docker 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 entorno SYNAPSE_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.


Linux
  1. Cómo instalar Docker en Ubuntu 18.04 / Ubuntu 18.10 / Ubuntu 19.04

  2. Cómo instalar Docker usando Ansible [Debian/Ubuntu]

  3. Cómo instalar WordPress usando Docker

  4. Cómo instalar Docker en CentOS

  5. ¿Cómo instalar Docker en Ubuntu 18.04?

Cómo instalar Gitea usando Docker en Ubuntu 20.04

Cómo instalar Docker en Debian 10

Cómo instalar Docker en CentOS

Cómo instalar Gitea en Ubuntu usando Docker

Cómo instalar Matrix Synapse en Ubuntu 20.04

Cómo instalar Docker en Ubuntu 18.04