Matrix Chat · 26 min read · Oct 27, 2025
Como Instalar e Criar um Servidor de Chat usando Matrix Synapse e Element no Rocky Linux 9

Matrix é um padrão aberto para comunicação descentralizada e criptografada de ponta a ponta. É uma coleção de servidores e serviços que se comunicam entre si usando uma API padronizada que sincroniza em tempo real. Ele usa homeservers para armazenar informações de conta e histórico de chat. Se um servidor doméstico ficar fora do ar, outros servidores podem continuar a comunicação sem problemas devido à natureza da descentralização. Você pode usar um servidor doméstico Matrix hospedado por outra pessoa ou hospedar o seu próprio para manter o controle sobre seus dados.
Neste tutorial, você aprenderá como instalar e criar um servidor de chat usando o Synapse, uma implementação de servidor doméstico do Matrix. O Element é um cliente web Matrix construído usando o Matrix React SDK. Isso permitirá que você ofereça chat Matrix na web. Você também pode usar o servidor com qualquer outro cliente Matrix. Também instalaremos o servidor Coturn para habilitar chamadas de voz e vídeo. O serviço Coturn é opcional se você não estiver interessado em usá-lo.
Pré-requisitos
- Um servidor rodando Debian 12.
- Um usuário não-sudo com privilégios de root.
- O Firewall descomplicado (UFW) está habilitado e em execução.
- Nomes de Domínio Qualificados (FQDN) para Matrix, Element e Coturn apontando para seu servidor. Usaremos
matrix.example.com,element.example.comecoturn.example.com, respectivamente, para os três serviços. - Certifique-se de que tudo está atualizado.
$ sudo dnf update
- Alguns pacotes que seu sistema precisa.
$ sudo dnf install wget curl nano unzip yum-utils policycoreutils-python-utils -yAlguns desses pacotes podem já estar instalados em seu sistema.
Passo 1 - Configurar o Firewall
Antes de instalar qualquer pacote, o primeiro passo é configurar o firewall para abrir portas para HTTP, HTTPS e Synapse. Rocky Linux usa o Firewall Firewalld. Verifique o status do firewall.
$ sudo firewall-cmd --state
running
O firewall funciona com diferentes zonas, e a zona pública é a padrão que usaremos. Liste todos os serviços e portas ativos no firewall.
$ sudo firewall-cmd --zone=public --list-all
Deve mostrar a seguinte saída.
public
target: default
icmp-block-inversion: no
interfaces: enp1s0
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
Abra as portas HTTP, HTTPS e Synapse no firewall.
$ sudo firewall-cmd --zone=public --add-port=8448/tcp
$ sudo firewall-cmd --zone=public --add-service=http
$ sudo firewall-cmd --zone=public --add-service=https
Verifique novamente o status do firewall.
$ sudo firewall-cmd --zone=public --list-all
Você deve ver uma saída semelhante.
public
target: default
icmp-block-inversion: no
interfaces: enp1s0
sources:
services: cockpit dhcpv6-client http https ssh
ports: 8448/tcp
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
Torne todas as alterações permanentes e recarregue o firewall para habilitar as mudanças.
$ sudo firewall-cmd --runtime-to-permanent
$ sudo firewall-cmd --reload
Passo 2 - Instalar e Configurar o PostgreSQL
Rocky Linux 9 vem com o PostgreSQL 13 por padrão. Usaremos o PostgreSQL 16 de seu repositório oficial.
Instale o repositório RPM do PostgreSQL.
$ sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
Desative o módulo PostgreSQL embutido.
$ sudo dnf -qy module disable postgresql
Agora, você pode instalar o PostgreSQL usando o seguinte comando.
$ sudo dnf install -y postgresql16-server postgresql16-contrib postgresql16-devel
sudo dnf install postgresql16-devel
export PATH=$PATH:/usr/pgsql-16/bin
O pacote postgresql-contrib contém algumas utilidades extras.
Verifique a versão.
$ psql --version
psql (PostgreSQL) 16.1
Inicialize o banco de dados PostgreSQL.
$ sudo /usr/pgsql-16/bin/postgresql-16-setup initdb
Inicializando o banco de dados ... OK
Habilite o serviço PostgreSQL.
$ sudo systemctl enable postgresql-16
Inicie o serviço PostgreSQL.
$ sudo systemctl start postgresql-16
Verifique o status do serviço PostgreSQL.
$ sudo systemctl status postgresql-16
? postgresql-16.service - PostgreSQL 16 database server
Loaded: loaded (/usr/lib/systemd/system/postgresql-16.service; enabled; preset: disabled)
Active: active (running) since Tue 2024-01-30 11:55:26 UTC; 10s ago
Docs: https://www.postgresql.org/docs/16/static/
Process: 9610 ExecStartPre=/usr/pgsql-16/bin/postgresql-16-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
Main PID: 9615 (postgres)
Tasks: 7 (limit: 12225)
Memory: 17.4M
CPU: 98ms
CGroup: /system.slice/postgresql-16.service
??9615 /usr/pgsql-16/bin/postgres -D /var/lib/pgsql/16/data/
??9616 "postgres: logger "
??9617 "postgres: checkpointer "
??9618 "postgres: background writer "
??9620 "postgres: walwriter "
??9621 "postgres: autovacuum launcher "
??9622 "postgres: logical replication launcher "
Jan 30 11:55:26 matrix.example.com systemd[1]: Starting PostgreSQL 16 database server...
Jan 30 11:55:26 matrix.example.com postgres[9615]: 2024-01-30 11:55:26.482 UTC [9615] LOG: redirecting log output to logging collector process
Jan 30 11:55:26 matrix.example.com postgres[9615]: 2024-01-30 11:55:26.482 UTC [9615] HINT: Future log output will appear in directory "log".
Jan 30 11:55:26 matrix.example.com systemd[1]: Started PostgreSQL 16 database server.
Você pode ver que o serviço está habilitado e em execução por padrão.
Faça login na conta de sistema postgres.
$ sudo -su postgres
Crie um novo usuário de banco de dados e um banco de dados para o PostgreSQL. Você será solicitado a fornecer uma senha ao criar o usuário.
$ createuser --pwprompt synapse
$ createdb --encoding=UTF8 --locale=C --template=template0 --owner=synapse synapsedb
Saia da conta postgres.
$ exit
Passo 3 - Instalar o Matrix Synapse
O Matrix Synapse não possui um pacote pré-construído para distribuições baseadas em CentOS como o Rocky Linux. Portanto, o instalaremos como um módulo Python do PyPI.
O primeiro passo é instalar os pré-requisitos necessários para o Synapse funcionar. Também precisamos do repositório EPEL que inclui o pacote python3-virtualenv.
$ sudo dnf install epel-release
$ sudo dnf install --enablerepo=crb libtiff-devel libjpeg-devel libzip-devel \
freetype-devel libwebp-devel libxml2-devel libxslt-devel \
libpq-devel python3-virtualenv libffi-devel openssl-devel \
python3-devel libicu-devel
$ sudo dnf groupinstall "Development Tools"
$ sudo dnf install postgresql16-devel
Crie um diretório para o Synapse.
$ mkdir -p ~/synapse
Crie um ambiente virtual Python no diretório mencionado.
$ virtualenv -p python3 ~/synapse/env
Ative o ambiente virtual.
$ source ~/synapse/env/bin/activate
Certifique-se de que você tem a versão mais recente do pip e setuptools.
(env) $ pip install --upgrade pip
(env) $ pip install --upgrade setuptools
Instale o Matrix Synapse.
(env) $ pip install "matrix-synapse[postgres]"
Isso fará o download do Synapse do PyPI e o instalará, juntamente com as bibliotecas Python que ele usa em um ambiente virtual sob a pasta ~/synapse/env. Também instalará a biblioteca Python do PostgreSQL necessária para o Synapse se conectar ao servidor PostgreSQL. O comando acima é uma combinação dos comandos pip install matrix-synapse e pip install psycopg2.
O próximo passo é gerar um arquivo de configuração com algumas configurações básicas. Mude para o diretório Synapse.
(env) $ cd ~/synapse
Execute o seguinte comando para gerar o arquivo de configuração.
(env) $ python -m synapse.app.homeserver \
--server-name matrix.example.com \
--config-path homeserver.yaml \
--generate-config \
--report-stats=[yes|no]
O valor da variável --server-name faz parte do seu ID Matrix. Insira o nome de domínio do seu Matrix como seu valor. Isso atuará como seu endereço de servidor doméstico.
Você pode escolher se deseja ou não enviar estatísticas anônimas sobre seu servidor doméstico de volta ao Matrix através da variável --report-stats. Escolha yes ou no conforme sua escolha.
Você receberá a seguinte saída.
Gerando arquivo de configuração homeserver.yaml
Gerando arquivo de configuração de log /home/navjot/synapse/matrix.example.com.log.config que registrará em /home/navjot/synapse/homeserver.log
Gerando arquivo de chave de assinatura /home/navjot/synapse/matrix.example.com.signing.key
Um arquivo de configuração foi gerado em 'homeserver.yaml' para o nome do servidor 'matrix.example.com'. Por favor, revise este arquivo e personalize-o de acordo com suas necessidades.
Você pode alterar essas configurações mais tarde no arquivo ~/synapse/homeserver.yaml ou no arquivo /home/. As chaves geradas pelo comando acima permitirão que seu servidor doméstico se identifique a outros servidores domésticos.
É hora de executar o servidor Matrix. Certifique-se de que você está dentro do diretório Synapse e que o ambiente virtual está ativo.
Inicie o servidor doméstico.
(env) $ synctl start
Você deve ver uma saída semelhante.
Este servidor está configurado para usar 'matrix.org' como seu servidor de chave confiável através da
'opção de configuração trusted_key_servers'. 'matrix.org' é uma boa escolha para um servidor de chave, pois é de longa duração, estável e confiável. No entanto, alguns administradores podem
preferir usar outro servidor para esse propósito.
Para suprimir este aviso e continuar usando 'matrix.org', os administradores devem definir
'suppress_key_server_warning' como 'true' em homeserver.yaml.
--------------------------------------------------------------------------------
started synapse.app.homeserver(homeserver.yaml)
Para parar o servidor, execute o seguinte comando.
(env) $ synctl stop
Desative o ambiente virtual.
(env) $ deactivate
Passo 4 - Instalar o Nginx
Para o ambiente de produção, é recomendado executar o servidor Synapse usando um proxy Nginx.
Rocky Linux 9 vem com uma versão mais antiga do Nginx. Você precisa usar o repositório oficial do Nginx para instalar a versão mais recente.
Crie e abra o arquivo /etc/yum.repos.d/nginx.repo para edição.
$ sudo nano /etc/yum.repos.d/nginx.repo
Cole o seguinte código nele.
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
Uma vez que você tenha terminado, salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.
Instalaremos a versão principal do Nginx, então habilite o pacote para isso.
$ sudo dnf config-manager --enable nginx-mainline
Instale o Nginx.
$ sudo dnf install nginx -y
Verifique a instalação.
$ nginx -v
nginx version: nginx/1.25.3
Habilite e inicie o serviço do servidor Nginx.
$ sudo systemctl enable nginx --now
Verifique o status do serviço.
$ sudo systemctl status nginx
? nginx.service - nginx - servidor web de alto desempenho
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: disabled)
Active: active (running) since Tue 2024-01-30 12:50:34 UTC; 4s ago
Docs: http://nginx.org/en/docs/
Process: 10810 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
Main PID: 10811 (nginx)
Tasks: 3 (limit: 12225)
Memory: 3.1M
CPU: 24ms
CGroup: /system.slice/nginx.service
??10811 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
??10812 "nginx: worker process"
??10813 "nginx: worker process"
Passo 5 - Instalar SSL
Precisamos instalar o Certbot para gerar o certificado SSL. Usaremos o instalador de pacotes Snapd para isso. Como o Rocky Linux não vem com ele, instale o instalador Snapd. Ele requer o repositório EPEL (Pacotes Extras para Linux Empresarial) para funcionar. Mas como já o instalamos no passo 3, podemos seguir em frente.
Instale o pacote Snapd.
$ sudo dnf install snapd -y
Habilite e inicie o serviço Snap.
$ sudo systemctl enable snapd --now
Instale o pacote core do Snap e certifique-se de que sua versão do Snapd está atualizada.
$ sudo snap install core
$ sudo snap refresh core
Crie os links necessários para o Snapd funcionar.
$ sudo ln -s /var/lib/snapd/snap /snap
$ echo 'export PATH=$PATH:/var/lib/snapd/snap/bin' | sudo tee -a /etc/profile.d/snapd.sh
Instale o Certbot.
$ sudo snap install --classic certbot
Use o seguinte comando para garantir que o comando Certbot possa ser executado criando um link simbólico para o diretório /usr/bin.
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Verifique a versão do Certbot.
$ certbot --version
certbot 2.8.0
Execute o seguinte comando para gerar um Certificado SSL.
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d matrix.example.com
O comando acima fará o download de um certificado para o diretório /etc/letsencrypt/live/matrix.example.com em seu servidor.
Gere um certificado de grupo Diffie-Hellman.
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
Verifique o serviço do agendador de renovação do Certbot.
$ systemctl list-timers
Você encontrará snap.certbot.renew.service como um dos serviços agendados para execução.
NEXT LEFT LAST PASSED UNIT ACTIVATES ----------------------------------------------------------------------------------------------------------------------------------
Tue 2024-01-30 14:37:50 UTC 29min left Tue 2024-01-30 13:05:13 UTC 1h 3min ago dnf-makecache.timer dnf-makecache.service
Tue 2024-01-30 15:13:00 UTC 1h 4min left - - snap.certbot.renew.timer snap.certbot.renew.service
Wed 2024-01-31 00:00:00 UTC 9h left Tue 2024-01-30 06:35:44 UTC 7h ago logrotate.timer logrotate.service
Faça um teste do processo para verificar se a renovação do SSL está funcionando bem.
$ sudo certbot renew --dry-run
Se você não ver erros, está tudo pronto. Seu certificado será renovado automaticamente.
Passo 6 - Configurar SELinux
O SELinux impede que você execute um serviço do sistema onde o binário está no diretório home de um usuário. Por esse motivo, se criarmos um arquivo de serviço para o Synapse, ele será bloqueado pelo SELinux. Para contornar o problema, precisamos executar o seguinte comando para permitir que o binário Python seja executado como um serviço do sistema.
$ sudo chcon -R -t bin_t /home/username/synapse/env/bin/python
Aplique a política para permitir conexões a hosts externos.
$ sudo setsebool -P httpd_can_network_connect 1
Aplique a política para permitir que o Nginx tenha acesso ao PostgreSQL.
$ sudo setsebool -P httpd_can_network_connect_db 1
Passo 7 - Criar Serviço Systemd do Matrix
O status do serviço Synapse não é salvo após uma reinicialização, o que significa que se você reiniciar o servidor, precisará iniciar o servidor manualmente. Para contornar esse problema, precisamos criar o arquivo Systemd para isso.
Antes de prosseguir, certifique-se de que o serviço Synapse esteja parado.
$ cd ~/synapse
$ source env/bin/activate
(env) $ synctl stop
(env) $ deactivate
Crie e abra o arquivo matrix-synapse.service no diretório /etc/systemd/system/ para edição.
$ sudo nano /etc/systemd/system/matrix-synapse.service
Cole o seguinte código nele. Substitua a variável username pelo seu usuário do sistema Linux sob o qual você instalou o Synapse.
# Isso assume que o Synapse foi instalado por um usuário chamado username.
# Isso assume que o Synapse foi instalado em um virtualenv no
diretório home do usuário: `/home/username/synapse/env`.
[Unit]
Description=Synapse Matrix homeserver
After=postgresql-16.service
[Service]
Type=notify
NotifyAccess=main
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-abort
WorkingDirectory=/home/username/synapse
ExecStart=/home/username/synapse/env/bin/python -m synapse.app.homeserver --config-path=/home/username/synapse/homeserver.yaml
SyslogIdentifier=matrix-synapse
# ajuste o fator de cache se necessário
# Environment=SYNAPSE_CACHE_FACTOR=2.0
[Install]
WantedBy=multi-user.target
Uma vez terminado, salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.
Recarregue o daemon de serviços.
$ sudo systemctl daemon-reload
Habilite o serviço Matrix Synapse.
$ sudo systemctl enable matrix-synapse
Inicie o serviço Matrix Synapse.
$ sudo systemctl start matrix-synapse
Verifique o status do serviço.
$ sudo systemctl status matrix-synapse
Você deve ver a seguinte saída.
? matrix-synapse.service - Synapse Matrix homeserver
Loaded: loaded (/etc/systemd/system/matrix-synapse.service; enabled; preset: disabled)
Active: active (running) since Tue 2024-01-30 14:20:20 UTC; 5s ago
Main PID: 14687 (python)
Tasks: 8 (limit: 12225)
Memory: 77.6M
CPU: 3.527s
CGroup: /system.slice/matrix-synapse.service
??14687 /home/navjot/synapse/env/bin/python -m synapse.app.homeserver --config-path=/home/navjot/synapse/homeserver.yaml
Jan 30 14:20:16 matrix.example.com systemd[1]: Starting Synapse Matrix homeserver...
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: Este servidor está configurado para usar 'matrix.org' como seu servidor de chave confiável através da
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: 'opção de configuração trusted_key_servers'. 'matrix.org' é uma boa escolha para um servidor de chave
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: pois é de longa duração, estável e confiável. No entanto, alguns administradores podem
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: desejar usar outro servidor para esse propósito.
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: Para suprimir este aviso e continuar usando 'matrix.org', os administradores devem definir
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: 'suppress_key_server_warning' como 'true' em homeserver.yaml.
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: --------------------------------------------------------------------------------
Jan 30 14:20:20 matrix.example.com systemd[1]: Started Synapse Matrix homeserver.
Passo 8 - Configurar o Matrix Synapse
Antes de prosseguir, crie uma chave de registro secreta primeiro. A chave deve ser protegida porque permitirá que qualquer pessoa registre um novo usuário, mesmo que o registro esteja desativado.
$ echo "registration_shared_secret: '$(cat /dev/urandom | tr -cd '[:alnum:]' | fold -w 256 | head -n 1)'"
registration_shared_secret: '1y75ja0RUxvbWcS6SdZhakenukUwHHEjOXWC9Mu3FpO0QenOnpKRsc6NBZSxuzPcHYsOEuIQziwVjSZcP87dlWK4ZkIGYniurMqNsCYL4xg5xXs4bJDuTJH2CUXab4U9liv399lmkIZFaMpJCLxV9lVWB9mKHILYsjeLgGY5wAARv1SiK07bFsQOwKJGFqIvsUXmxymx5QCNDzTHw8R4ShqZ7elnnZrbdYk4r2f7qogERNHvQaRV7IEYUIOtMhVP'
Copie a saída da linha acima e salve-a.
Você pode configurar o servidor Matrix através do arquivo /home/username/synapse/homeserver.yaml. Abra-o para edição.
$ nano ~/synapse/homeserver.yaml
Cole a saída do comando da chave de registro na parte inferior do arquivo.
Por padrão, o Synapse está configurado para usar o banco de dados SQLite. Precisamos editá-lo para adicionar as credenciais do PostgreSQL.
Encontre a seguinte seção no arquivo e comente-a como mostrado.
#database:
# name: sqlite3
# args:
# database: /home/navjot/synapse/homeserver.db
Adicione a seguinte seção abaixo dela. Substitua o campo your-password pela senha do usuário PostgreSQL que você criou no passo 3. Substitua localhost pelo endereço IP do seu servidor, se você estiver hospedando o banco de dados em outro lugar.
database:
name: psycopg2
args:
user: synapse
password: 'your-password'
database: synapsedb
host: localhost
cp_min: 5
cp_max: 10
Por padrão, o Synapse habilita indicadores de presença que mostram se uma pessoa está online. Isso pode causar alto uso de CPU, portanto, você pode desativá-lo. Cole a seguinte linha na parte inferior.
presence:
enabled: false
Uma vez terminado, salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.
Crie um novo usuário matrix. Você será solicitado a fornecer seu nome de usuário e senha. Como este é o primeiro usuário que estamos criando, digite yes quando perguntado se deseja tornar o usuário um administrador. Você precisará ativar o ambiente virtual para criar o usuário.
$ cd ~/synapse
$ source env/bin/activate
(env) $ register_new_matrix_user -c homeserver.yaml http://localhost:8008
Novo usuário localpart [navjot]: navjot
Senha:
Confirmar senha:
Tornar admin [não]: sim
Enviando solicitação de registro...
Sucesso!
(env) $ deactivate
Você pode ver que usamos a porta 8008 no comando acima. Isso porque é a porta padrão que o Matrix Synapse escuta.
Por padrão, o registro de novos usuários está desativado, o que significa que você precisa registrar cada usuário manualmente como acima. Se você quiser abrir registros públicos, pode fazê-lo editando o arquivo homeserver.yaml.
Abra-o para edição novamente.
$ nano ~/synapse/homeserver.yaml
Cole a seguinte linha na parte inferior.
enable_registration: true
Por padrão, o Synapse não permite registros sem verificação de e-mail. Para habilitar a verificação de e-mail, cole as seguintes linhas.
registrations_require_3pid:
- email
email:
smtp_host: mail.example.com
smtp_port: 587
# Se o servidor de e-mail não tiver autenticação, pule estas 2 linhas
smtp_user: '[email protected]'
smtp_pass: 'password'
# Opcional, exigir criptografia com STARTTLS
require_transport_security: true
app_name: 'HowtoForge Example Chat' # define o valor para %(app)s em notif_from e assunto do e-mail
notif_from: "%(app)s <[email protected]>"
Para desabilitar a verificação de e-mail, cole a seguinte linha em vez disso.
enable_registration_without_verification: true
Uma vez terminado, salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.
Reinicie o Synapse para aplicar a configuração.
$ sudo systemctl restart matrix-synapse
Passo 9 - Configurar o Nginx
Abra o arquivo /etc/nginx/nginx.conf para edição.
$ sudo nano /etc/nginx/nginx.conf
Adicione a seguinte linha antes da linha include /etc/nginx/conf.d/*.conf;.
server_names_hash_bucket_size 64;
Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.
Crie e abra o arquivo /etc/nginx/conf.d/synapse.conf para edição.
$ sudo nano /etc/nginx/conf.d/synapse.conf
Cole o seguinte código nele.
# impor HTTPS
server {
# Porta do cliente
listen 80;
listen [::]:80;
server_name matrix.example.com;
return 301 https://$host$request_uri;
}
server {
server_name matrix.example.com;
# Porta do cliente
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
# Porta de federação
listen 8448 ssl default_server;
listen [::]:8448 ssl default_server;
access_log /var/log/nginx/synapse.access.log;
error_log /var/log/nginx/synapse.error.log;
# Configuração TLS
ssl_certificate /etc/letsencrypt/live/matrix.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/matrix.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/matrix.example.com/chain.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
resolver 1.1.1.1 1.0.0.1 [2606:4700:4700::1111] [2606:4700:4700::1001] 8.8.8.8 8.8.4.4 [2001:4860:4860::8888] [2001:4860:4860::8844] valid=60s;
resolver_timeout 2s;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
tcp_nopush on;
gzip on;
location ~ ^(/_matrix|/_synapse/client) {
proxy_pass http://localhost:8008;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
# O Nginx por padrão só permite uploads de arquivos de até 1M de tamanho
# Aumente client_max_body_size para corresponder ao max_upload_size definido em homeserver.yaml
client_max_body_size 50M;
}
}
Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado uma vez terminado. A configuração acima funciona na suposição de que o endereço IP dos domínios example.com e matrix.example.com estão apontando para o mesmo servidor. Se não estiverem, então use o seguinte arquivo de configuração para o servidor example.com.
server {
server_name example.com;
listen 443 ssl http2;
listen [::]:443 ssl http2;
# Configuração TLS
ssl_certificate /etc/letsencrypt/live/matrix.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/matrix.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/matrix.example.com/chain.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
resolver 1.1.1.1 1.0.0.1 [2606:4700:4700::1111] [2606:4700:4700::1001] 8.8.8.8 8.8.4.4 [2001:4860:4860::8888] [2001:4860:4860::8844] valid=60s;
resolver_timeout 2s;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
# Redirecionar
location ~ ^(/_matrix|/_synapse/client) {
return 301 "https://matrix.example.com$request_uri";
}
# Descoberta automática do servidor doméstico do cliente
location /.well-known/matrix/client {
default_type application/json;
add_header Access-Control-Allow-Origin *;
return 200 '{ "m.homeserver": { "base_url": "https://matrix.example.com" } }';
}
# Delegação de domínio
location /.well-known/matrix/server {
default_type application/json;
add_header Access-Control-Allow-Origin *;
return 200 '{ "m.server": "matrix.example.com" }';
}
}
Verifique a sintaxe do arquivo de configuração do Nginx.
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Reinicie o serviço Nginx.
$ sudo systemctl restart nginx
Passo 10 - Instalar Coturn
Você precisará instalar um servidor TURN (Traversal Using Relays around NAT) para habilitar chamadas de voz e vídeo. Para isso, instalaremos o pacote Coturn. Se você não precisar dessa funcionalidade, pode pular esta etapa.
Instale o Coturn.
$ sudo dnf install coturn
Abra as portas TURN e UDP.
$ sudo firewall-cmd --zone=public --add-port=3478/{tcp,udp}
$ sudo firewall-cmd --zone=public --add-port=5349/{tcp,udp}
$ sudo firewall-cmd --zone=public --add-port=49152-65535/udp
$ sudo firewall-cmd --runtime-to-permanent
$ sudo firewall-cmd --reload
Gere um certificado SSL para o Turn ( coturn.example.com).
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d coturn.example.com
Gere um segredo de autenticação para o Coturn.
$ echo "static-auth-secret=$(cat /dev/urandom | tr -cd '[:alnum:]' | fold -w 256 | head -n 1)"
static-auth-secret=u3ksgJ9X876sFMO00A8KabXwZvzVwCmV30wWvZ7DzGiepRwNRYSCTYzf2E8olNzdDHu7oO3XpT3l5bv5mVdhXEQ3pnoTWBquSVPFFBJtyD6y9gBxiMaD2TYTD2WohQLE9s7OKJVpkDeKTnZQnkmjrFadE3M9DRxPL1W5Lgdg6XLLKABgb5XGkutRgkJOV0JRH4sBYsot63fWq9mcGTm6nAMdIycvDVDOs7vhoeqRzcTbMF0wsfAHVJNhXpGGFDyZ
Abra o arquivo de configuração para edição.
$ sudo nano /etc/coturn/turnserver.conf
Vamos percorrer o arquivo e habilitar as configurações que precisamos. Primeiro, habilite o método de autenticação descomentando a linha use-auth-secret.
# Esteja ciente de que use-auth-secret substitui algumas partes do lt-cred-mech.
# O recurso use-auth-secret depende internamente do lt-cred-mech, então se você definir
# esta opção, então ela habilita automaticamente o lt-cred-mech internamente
# como se você tivesse habilitado ambos.
#
# Note que você pode usar apenas um mecanismo de autenticação ao mesmo tempo! Isso ocorre porque,
# ambos os mecanismos realizam validação de nome de usuário e senha de maneiras diferentes.
#
# Use ou lt-cred-mech ou use-auth-secret na conf
# para evitar qualquer confusão.
#
use-auth-secret
Em seguida, configuraremos a variável static-auth-secret com o valor que criamos acima. Também precisaremos desse segredo para configurar o Synapse mais tarde.
# Valor do segredo de autenticação 'estático' (uma string) apenas para a API REST do TURN.
# Se não definido, o servidor TURN
# tentará usar o valor 'dinâmico' na tabela turn_secret
# no banco de dados do usuário (se presente). O valor armazenado no banco de dados pode ser alterado em tempo real
# por um programa separado, então é por isso que esse modo é considerado 'dinâmico'.
#
static-auth-secret=u3ksgJ9X876sFMO00A8KabXwZvzVwCmV30wWvZ7DzGiepRwNRYSCTYzf2E8olNzdDHu7oO3XpT3l5bv5mVdhXEQ3pnoTWBquSVPFFBJtyD6y9gBxiMaD2TYTD2WohQLE9s7OKJVpkDeKTnZQnkmjrFadE3M9DRxPL1W5Lgdg6XLLKABgb5XGkutRgkJOV0JRH4sBYsot63fWq9mcGTm6nAMdIycvDVDOs7vhoeqRzcTbMF0wsfAHVJNhXpGGFDyZ
O próximo valor que precisamos alterar é o realm. Ele se refere ao domínio que escolhemos para o Coturn.
# O domínio padrão a ser usado para os usuários quando nenhuma relação explícita
# origem/domínio é encontrada no banco de dados, ou se o servidor TURN não está usando nenhum banco de dados
# (apenas as configurações de linha de comando e o arquivo userdb). Deve ser usado com o mecanismo de credenciais de longo prazo
# ou com a API REST do TURN.
#
# Nota: Se o domínio padrão não for especificado, então o domínio cai para o nome do host.
# Se a string do nome do domínio estiver vazia, ou definida como '(Nenhum)', então é inicializada como uma string vazia.
#
realm=coturn.example.com
Em seguida, defina o número de sessões e sessões por usuário. Escolha um valor que funcione para seu servidor.
# Quota de alocação por usuário.
# o valor padrão é 0 (sem quota, número ilimitado de sessões por usuário).
# Esta opção também pode ser definida através do banco de dados, para um domínio específico.
#
user-quota=12
# Quota total de alocação.
# o valor padrão é 0 (sem quota).
# Esta opção também pode ser definida através do banco de dados, para um domínio específico.
#
total-quota=1200
Em seguida, precisamos desabilitar o TCP, pois VOIP é UDP.
# Descomente se nenhum ponto de retransmissão TCP for permitido.
# Por padrão, os pontos de retransmissão TCP estão habilitados (como na RFC 6062).
#
no-tcp-relay
Também precisamos configurar o local dos certificados que criamos para o Coturn.
# Arquivo de certificado.
# Use um caminho absoluto ou caminho relativo ao
# arquivo de configuração.
# Use o formato de arquivo PEM.
#
cert=/etc/letsencrypt/live/coturn.example.com/fullchain.pem
# Arquivo de chave privada.
# Use um caminho absoluto ou caminho relativo ao
# arquivo de configuração.
# Use o formato de arquivo PEM.
#
pkey=/etc/letsencrypt/live/coturn.example.com/privkey.pem
Em seguida, precisamos desabilitar o tráfego para intervalos de IP privados e proibir pares em endereços multicast para melhorar a segurança.
# Sinalizador que pode ser usado para proibir pares em endereços de broadcast bem conhecidos (224.0.0.0 e acima, e FFXX:*).
# Esta é uma medida de segurança extra.
#
no-multicast-peers
...............
# Opção para permitir ou proibir endereços IP específicos ou intervalos de endereços IP.
# Se um endereço IP for especificado como permitido e negado, então o endereço IP é
# considerado permitido. Isso é útil quando você deseja proibir um intervalo de IP
# endereços, exceto por alguns IPs específicos dentro desse intervalo.
#
# Isso pode ser usado quando você não deseja que os usuários do servidor TURN possam acessar
# máquinas acessíveis pelo servidor TURN, mas que de outra forma estariam inacessíveis a partir da
# internet (por exemplo, quando o servidor TURN está atrás de um NAT)
#
# Exemplos:
# denied-peer-ip=83.166.64.0-83.166.95.255
# allowed-peer-ip=83.166.68.45
denied-peer-ip=0.0.0.0-0.255.255.255
denied-peer-ip=10.0.0.0-10.255.255.255
denied-peer-ip=100.64.0.0-100.127.255.255
denied-peer-ip=127.0.0.0-127.255.255.255
denied-peer-ip=169.254.0.0-169.254.255.255
denied-peer-ip=172.16.0.0-172.31.255.255
denied-peer-ip=192.0.0.0-192.0.0.255
denied-peer-ip=192.0.2.0-192.0.2.255
denied-peer-ip=192.88.99.0-192.88.99.255
denied-peer-ip=192.168.0.0-192.168.255.255
denied-peer-ip=198.18.0.0-198.19.255.255
denied-peer-ip=198.51.100.0-198.51.100.255
denied-peer-ip=203.0.113.0-203.0.113.255
denied-peer-ip=240.0.0.0-255.255.255.255
denied-peer-ip=::1
denied-peer-ip=64:ff9b::-64:ff9b::ffff:ffff
denied-peer-ip=::ffff:0.0.0.0-::ffff:255.255.255.255
denied-peer-ip=100::-100::ffff:ffff:ffff:ffff
denied-peer-ip=2001::-2001:1ff:ffff:ffff:ffff:ffff:ffff:ffff
Uma vez terminado, salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.
Reinicie o Coturn para aplicar a configuração.
$ sudo systemctl restart coturn
Abra a configuração do Synapse ( homeserver.yaml) para adicionar as configurações do Coturn.
$ nano ~/synapse/homeserver.yaml
Cole as seguintes linhas nele. Substitua o valor turn_shared_secret pelo valor de static-auth-secret do arquivo ec urnserver.conf.
turn_uris: [ "turn:coturn.example.com?transport=udp", "turn:coturn.example.com?transport=tcp" ]
turn_shared_secret: 'static-auth-secret'
turn_user_lifetime: 86400000
turn_allow_guests: True
# vim:ft=yaml
Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.
Reinicie o Synapse para aplicar as alterações.
$ sudo systemctl restart matrix-synapse
Passo 11 - Acessar o Matrix
Você pode acessar o Chat Matrix usando o cliente web do Element em https://app.element.io. Clique no botão Entrar para prosseguir.

Clique no link Editar sob Servidor Doméstico. Insira matrix.example.com como seu servidor doméstico.

Se o cliente detectar seu servidor doméstico corretamente, a borda e o texto ficarão verdes, caso contrário, serão exibidos em vermelho. Clique em Continuar para prosseguir.

Insira o nome de usuário e a senha que você criou no passo 8 ao configurar o Synapse. Clique no botão Entrar para fazer login. Você será solicitado a criar um backup seguro e criptografado.

Selecione a opção Inserir uma Frase de Segurança para criar uma frase de segurança que será necessária toda vez que você fizer login. Clique em Continuar para prosseguir.

Insira uma frase de segurança e clique no botão Continuar para prosseguir. Você será solicitado a confirmá-la novamente na próxima tela.

Insira a frase novamente e clique em Continuar para prosseguir.

Você receberá um conjunto de chaves de segurança que pode usar se esquecer sua frase de segurança. Clique no botão Baixar para salvá-las.
Clique no botão Continuar para prosseguir.

Você será solicitado a fornecer sua senha de conta. Insira a senha e clique no botão Continuar para finalizar a configuração do backup criptografado.

Criamos uma sala de chat em grupo chamada HowtoForge usando o botão Criar um Chat em Grupo na página inicial. Você verá o seguinte popup quando clicar no botão.

Você pode restringir membros ao domínio expandindo o menu avançado e selecionando a opção. Finalize a criação da sala clicando no botão Criar sala.
Passo 12 - Instalar o Element
Crie um diretório para o Element.
$ sudo mkdir -p /var/www/html/element
Crie um novo arquivo para obter a versão mais recente do Element.
$ sudo nano /var/www/html/element/update.sh
Adicione as seguintes linhas a ele.
#!/bin/sh
set -e
install_location="/var/www/html/element"
latest="
$(curl -I https://github.com/element-hq/element-web/releases/latest | awk -F '/' '/^location/ {print substr($NF, 1, length($NF)-1)}')"
cd "$install_location"
[ ! -d "archive" ] && mkdir -p "archive"
[ -d "archive/element-${latest}" ] && rm -r "archive/element-${latest}"
[ -f "archive/element-${latest}.tar.gz" ] && rm "archive/element-${latest}.tar.gz"
wget "https://github.com/element-hq/element-web/releases/download/${latest}/element-${latest}.tar.gz" -P "archive"
tar xf "archive/element-${latest}.tar.gz" -C "archive"
[ -L "${install_location}/current" ] && rm "${install_location}/current"
ln -sf "${install_location}/archive/element-${latest}" "${install_location}/current"
ln -sf "${install_location}/config.json" "${install_location}/current/config.json"
Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.
Torne o arquivo executável.
$ sudo chmod +x /var/www/html/element/update.sh
Execute o script para baixar o Element.
$ sudo /var/www/html/element/update.sh
Passo 13 - Configurar o Element
Copie o mesmo arquivo de configuração do element.
$ sudo cp /var/www/html/element/current/config.sample.json /var/www/html/element/config.json
Abra o arquivo de configuração para edição.
$ sudo nano /var/www/html/element/config.json
Encontre as seguintes linhas.
"m.homeserver": {
"base_url": "https://matrix-client.matrix.org",
"server_name": "matrix.org"
},
Altere o endereço do servidor doméstico Matrix padrão para seu servidor doméstico e remova a variável server_name.
"m.homeserver": {
"base_url": "https://matrix.example.com",
"server_name": "example.com"
},
Se você quiser usar seu nome em vez de Element no título do site, altere o nome da marca.
"brand": "HowtoForge Example Chat",
Defina a variável disable_guests como verdadeira para proibir convidados de usar o Element.
"disable_guests": true,
Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.
Gere um certificado SSL para o cliente Element.
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d element.example.com
Crie e abra o arquivo /etc/nginx/conf.d/element.conf para edição.
$ sudo nano /etc/nginx/conf.d/element.conf
Cole as seguintes linhas nele.
server {
listen 80;
listen [::]:80;
server_name element.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
server_name element.example.com;
root /var/www/html/element/current;
index index.html;
access_log /var/log/nginx/element.access.log;
error_log /var/log/nginx/element.error.log;
add_header Referrer-Policy "strict-origin" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
# Configuração TLS
ssl_certificate /etc/letsencrypt/live/element.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/element.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/element.example.com/chain.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
resolver 1.1.1.1 1.0.0.1 [2606:4700:4700::1111] [2606:4700:4700::1001] 8.8.8.8 8.8.4.4 [2001:4860:4860::8888] [2001:4860:4860::8844] valid=60s;
resolver_timeout 2s;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
}
Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.
Verifique a sintaxe do arquivo de configuração do Nginx.
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Reinicie o serviço Nginx.
$ sudo systemctl restart nginx
Precisamos configurar as configurações do SELinux antes de acessar o Element. Execute os seguintes comandos para permitir que o Element seja executado.
$ sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/element(/.*)?"
$ sudo restorecon -Rv /var/www/html/element/
Você pode acessar o cliente Element através da URL https://element.example.com em seu navegador. Faça login e você será levado ao painel do aplicativo. Você será solicitado a verificar o aplicativo com o https://app.element.io primeiro, certifique-se de que você está logado no aplicativo Element original e será solicitado a combinar os caracteres emoji. Uma vez verificado, você receberá o seguinte painel.

Conclusão
Isso conclui nosso tutorial sobre como instalar o servidor de chat Matrix Synapse junto com Coturn e o cliente web Element usando o Nginx como servidor proxy em uma máquina Debian 12. Se você tiver alguma dúvida, poste nos comentários abaixo.
Receba novas postagens na sua caixa de entrada
Sem spam. Cancele a assinatura a qualquer momento.