Outro dia configurei um Matrix home server para o círculo de amigos. Pensei se precisava da federation e acabei decidindo que sim. Além disso, precisei configurar um servidor TURN para que as chamadas funcionassem normalmente para todos, pois quando alguém está atrás de NAT, normalmente não consegue se conectar corretamente. O container foi iniciado em um VPS Hetzner cloud, sob Debian 10.

 

Você precisará de um serviço docker em execução, se ainda não estiver instalado, pode instalá-lo facilmente com a ajuda de https://get.docker.com/. Recomendo criar um repositório git para onde você possa fazer push dos arquivos docker-compose e de configuração do nginx.

Se o docker compose ainda não estiver instalado, instale-o de acordo com a distribuição. (No Ubuntu: apt install docker-compose)

No Debian 10, baixe a versão mais recente (que você encontra aqui: https://github.com/docker/compose/releases):

curl -L https://github.com/docker/compose/releases/download/1.28.5/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

Para o nginx reverse proxy você precisará de um certificado SSL, abaixo usaremos o certificado do Let’s Encrypt com a ajuda do certbot. Se o certbot ainda não estiver instalado, instale-o do repositório:

apt install certbot

Em seguida registre seu domínio:

certbot certonly --standalone

Anote o local do certificado SSL ou use o caminho estático (eu usarei este daqui em diante), que deveria ser:

/etc/letsencrypt/archive/matrix.seusite.com.br/

Crie o arquivo de configuração do nginx, que funcionará como reverse proxy para o servidor Matrix Synapse e para a federation:

root@servidor:# vim /root/docker-config/nginx/conf.d/matrix.seusite.com.br.conf 
server {
    listen 80;
        server_name matrix.seusite.com.br;
        return 301 https://$server_name$request_uri;
}

server {
        listen 443 ssl;
	listen 8448 ssl;
        server_name matrix.seusite.com.br;

        access_log /var/log/nginx/matrix.seusite.com.br.access.log;
        error_log /var/log/nginx/matrix.seusite.com.br.error.log;

# se você estiver usando os soft links do letsencrypt e gerou novos certificados ssl, é recomendável reiniciar o serviço docker, porque muito provavelmente não verá os links corretamente

        ssl on;
        ssl_certificate /etc/nginx/ssl/matrix.seusite.com.br/fullchain1.pem;
        ssl_certificate_key /etc/nginx/ssl/matrix.seusite.com.br/privkey1.pem;

	ssl_protocols TLSv1.2 TLSv1.3;
	ssl_prefer_server_ciphers on; 
	ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
	ssl_ecdh_curve secp384r1;
	ssl_session_timeout  10m;
	ssl_session_cache shared:SSL:10m;
	resolver 1.1.1.1 valid=300s;
	resolver_timeout 5s; 
	add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
	add_header X-Frame-Options DENY;
	add_header X-Content-Type-Options nosniff;
	add_header X-XSS-Protection "1; mode=block";

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

Crie um arquivo docker-compose.yaml com seu editor favorito e insira o seguinte, além de editar conforme suas necessidades:

version: '2'
services:
 web:
  image: nginx
  restart: unless-stopped
  container_name: nginx
  ports:
   - "80:80"
   - "443:443"
   - "8448:8448"
  volumes:
   - /root/docker-config/nginx/conf.d/:/etc/nginx/conf.d/
   - /etc/letsencrypt/archive/matrix.seusite.com.br/:/etc/nginx/ssl/matrix.zoliben.com
  links:
   - synapse

 synapse:
  image: matrixdotorg/synapse
  restart: unless-stopped
  volumes:
   - /data/matrix:/data

Os arquivos de configuração do Matrix e outros (incluindo as imagens enviadas) são armazenados na pasta /data/matrix no exemplo.

Crie os arquivos de configuração:

docker run -it --rm -v /data/matrix:/data -e SYNAPSE_SERVER_NAME=matrix.seusite.com.br -e SYNAPSE_REPORT_STATS=yes matrixdotorg/synapse:latest generate

Depois ainda é necessário configurar a federation no arquivo de configuração: /data/matrix/homeserver.yaml
Encontre a seção „listeners:„ e remova os comentários da parte referente à porta 8448 para que fique semelhante (como usamos reverse proxy, não precisamos de TLS no nível da aplicação):

listeners:
  # TLS-enabled listener: for when matrix traffic is sent directly to synapse.
  #
  # Disabled by default. To enable it, uncomment the following. (Note that you
  # will also need to give Synapse a TLS key and certificate: see the TLS section
  # below.)
  #
  - port: 8448
    type: http
    tls: false
    resources:
      - names: [client, federation]

  # Unsecure HTTP listener: for when matrix traffic passes through a reverse proxy
  # that unwraps TLS.
  #
  # If you plan to use a reverse proxy, please see
  # https://github.com/matrix-org/synapse/blob/master/docs/reverse_proxy.md.
  #
  - port: 8008
    tls: false
    type: http
    x_forwarded: true

    resources:
      - names: [client, federation]
        compress: false