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.
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
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
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
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!
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.
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.
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'
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