Docker – Configuração do homeserver Matrix Synapse, federation, nginx reverse proxy e servidor TURN usando docker-compose
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