Matrix Synapse

Matrix é um protocolo de bate-papo privado fácil de usar, descentralizado e criptografado. Matrix é federado, o que significa que com uma conta Matrix em qualquer servidor, inclusive o seu, você pode falar com qualquer outra conta Matrix na internet, semelhante ao e-mail. Matrix também permite bate-papo em grupos totalmente criptografados de ponta a ponta.

Synapse é o nome do servidor padrão. Embora exija um pouco mais de recursos do sistma do que um servidor XMPP, ele compensa isso por ser mais fácil de usar.

Instalação

A versão mais recente do Synapse não está nos repositórios do Debian por padrão, mas podemos facilmente adicionar o repositório do Matrix para incluí-lo. Entre em seu servidor e rode os seguintes comandos:

apt install -y apt-transport-https lsb-release wget
wget -O /usr/share/keyrings/matrix-org-archive-keyring.gpg https://packages.matrix.org/debian/matrix-org-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/matrix-org-archive-keyring.gpg] https://packages.matrix.org/debian/ $(lsb_release -cs) main" > /etc/apt/sources.list.d/matrix-org.list

Depois de atualizarmos nossas listas de pacotes, poderemos instalar o Synapse usando o apt.

apt update
apt install matrix-synapse-py3

Quando solicitado, forneça o domínio ou subdomínio onde você quer hospedar o Matrix. Este será o domínio anexado ao seu endereço Matrix, por exemplo "@usuario:matrix.livreware.org".

Gere um certificado SSL. Substitua matrix.exemplo.org para o domínio ou subdomínio que você pretende usar.

certbot certonly --nginx -d matrix.exemplo.org

Configuração do Nginx

Utilizando um editor de texto, crie um arquivo de configuração Nginx para o Matrix, por exemplo /etc/nginx/sites-available/matrix e adicione o conteúdo abaixo. Substitua matrix.exemplo.org pelo seu domínio ou subdomínio onde irá hospedar esse serviço.

server {
	server_name matrix.exemplo.org;

        listen 80;
        listen [::]:80;

        listen 443 ssl http2 default_server;
        listen [::]:443 ssl http2 default_server;

        listen 8448 ssl http2 default_server;
        listen [::]:8448 ssl http2 default_server;

	ssl_certificate     /etc/letsencrypt/live/matrix.exemplo.org/fullchain.pem ;
	ssl_certificate_key /etc/letsencrypt/live/matrix.exemplo.org/privkey.pem ;

        location ~* ^(\/_matrix|\/_synapse|\/_client) {
                proxy_pass http://localhost:8008;
                proxy_set_header X-Forwarded-For $remote_addr;
                client_max_body_size 50M;
        }

	# Essas secoes sao requeridas para discoberta de clientes e federacao
        # (Client Well-Known URI)
        location /.well-known/matrix/client {
		return 200 '{"m.homeserver": {"base_url": "https://matrix.exemplo.org"}}';
                default_type application/json;
                add_header Access-Control-Allow-Origin *;
        }

        location /.well-known/matrix/server {
		return 200 '{"m.server": "matrix.exemplo.org:443"}';
                default_type application/json;
                add_header Access-Control-Allow-Origin *;
        }
}

Observe a variável client_max_body_size.. Por padrão, o Nginx limita o tamanho dos arquivos que pode transferir. Vamos aumentar isso para 50 megabytes para o Matrix. Caso queria enviar arquivos ainda maiores no seu chat, ajuste o tamanho de acordo. (Tenha em mente, no entanto, que Matrix e Nginx têm configurações separadas para isso e, para aumenta-lo para algo muito maior, você terá que aumentar o valor em ambos os arquivos de configuração.)

Salve e feche o arquivo. Agora vamos ativar o serviço Matrix e reiniciar o Nginx.

ln -s /etc/nginx/sites-available/matrix /etc/nginx/sites-enabled/
systemctl restart nginx

Configuração

Configuração do banco de dados

Synapse suporta PostgreSQL como back-end de banco de dados, e recomenda que ele seja usado. Comece instalando o PostgreSQL:

apt install postgresql

Em seguida, inicie o programa:

systemctl enable --now postgresql

Agora crie um usuário chamado "synapse_user" e sua senha para gerenciar seu banco de dados:

su -c "createuser --pwprompt synapse_user" postgres

E, finalmente, crie o banco de dados:

su postgres
psql -c "CREATE DATABASE synapse ENCODING 'UTF8' LC_COLLATE='C' LC_CTYPE='C' template=template0 OWNER synapse_user;"
exit

Agora edite a configuração do banco de dados em /etc/matrix-synapse/homeserver.yaml e comente as seguintes linhas para desabilitar a configuração SQLite. Seu arquivo deve ficar assim:

# database:
  # name: sqlite3
  # args:
    # database: DATADIR/homeserver.db

Em seguida, copie a seguinte configuração e defina as entradas apropriadas:

database:
  name: psycopg2
    args:
      user: synapse_user
      password: senha
      database: synapse
      host: localhost
      cp_min: 5
      cp_max: 10

Altere senha para a senha que você criou para o usuário "synapse_user". Salve e feche o arquivo, ele deve ficar assim no final. Não precisa mexer nas outras linhas

# database:
# name: sqlite3
  # args:
  # database: /var/lib/matrix-synapse/homeserver.db
database:
  name: psycopg2
    args:
      user: synapse_user
      password: senha
      database: synapse
      host: localhost
      cp_min: 5
      cp_max: 10

Adicionando usuários e administradores

Antes de configurar o usuário administrador, certifique-se de definir um registration_shared_secret em /etc/matrix-synapse/homeserver.yaml:

registration_shared_secret: ???

Salve e feche o arquivo. Em seguida, reinicie o Synapse e execute o seguinte comando para registrar um usuário:

systemctl restart matrix-synapse
register_new_matrix_user -c /etc/matrix-synapse/homeserver.yaml

Este comando solicitará um nome de usuário, senha e se o usuário deve ser administrador ou não, digite "yes" em "Make admin". Agora seu servidor está pronto! Para usá-lo, baixe um cliente matrix para se conectar. Eu recomendo o Element por ser bem fácil de usar, mas existem vários outros pra escolher.

Ao abrir o Element, selecione sua linguagem desejada e clique em Fazer Signin. Clique em "Editar" na opção "Servidor Local", e coloque o domínio ou subdomínio que você definiu na sua configuração nginx, como matrix.exemplo.org. Digite o nome e senha do usuário administrador que foi criado logo acima, e você estará logado em seu servidor Matrix!

Configurações extras

Aqui estão explicadadas algumas configurações extras que não são necessárias para um servidor simples funcionar, mas que talvez você as queria. Todas essas mudanças devem ser feitas no arquivo /etc/matrix-synapse/homeserver.yaml com um editor de texto. Lembre-se de rodar o comando systemctl restart matrix-synapse sempre que modificar o arquivo /etc/matrix-synapse/homeserver.yaml para que as mudanças tenham efeito.

Registrando usuários

Por padrão, Synapse não permite que usuários registrem contas em seu servidor, um admnistrador deve manualment adicionar usuários com o comando register_new_matrix_user. Isso é para impedir spam. Para permitir que usuários adicionem contas eles mesmos, adicione as seguintes linhas em sua configuração.

enable_registration: true
enable_registration_without_verification: true

Isso irá permitir que qualquer um crie uma conta em seu servidor, o que pode resultar em spam. Para permitir que usuários registrem a si mesmos e controlar possível spam, veja as opções listadas aqui. Estou listando a opção de registro sem verificação pois é a mais simples de configurar. Caso queria usar esse servidor para um pequeno grupo de amigos, permita o registro com as linhas acima e depois as delete assim que todos criarem suas contas. Caso pretenda ter um servidor aberto à todos, leia as opções de que ajudam a impedir spam.

Visualizações de URL

Para permitir visualizações de páginas da web geradas pelo servidor, adicione as seguintes linhas:

url_preview_enabled: true
url_preview_ip_range_blacklist:
  - '127.0.0.0/8'
  - '10.0.0.0/8'
  - '172.16.0.0/12'
  - '192.168.0.0/16'
  - '100.64.0.0/10'
  - '192.0.0.0/24'
  - '169.254.0.0/16'
  - '192.88.99.0/24'
  - '198.18.0.0/15'
  - '192.0.2.0/24'
  - '198.51.100.0/24'
  - '203.0.113.0/24'
  - '224.0.0.0/4'
  - '::1/128'
  - 'fe80::/10'
  - 'fc00::/7'
  - '2001:db8::/32'
  - 'ff00::/8'
  - 'fec0::/10'

Federação

Usando a configuração do Nginx fornecida com este guia, a federação deve funcionar imediantamente com o Synapse. Você pode testar se está funcionando usando o Matrix Federation Tester. No entanto, alguns recursos extras podem ser ativados para aumentar a usabilidade do seu servidor com a federeção. Essa linha vai permitir que usuários adicionem seu servidor à uma lista de servidores (em um cliente como o Element) e vejam uma lista de todas as salas públicas hospedadas em seu servidor.

allow_public_rooms_over_federation: true

Essa linha vai permitir que convidados para o seu servidor vejam as salas públicas hospedadas nele sem autenticação.

allow_public_rooms_without_auth: true