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

  1. Um servidor rodando Debian 12.
  2. Um usuário não-sudo com privilégios de root.
  3. O Firewall descomplicado (UFW) está habilitado e em execução.
  4. Nomes de Domínio Qualificados (FQDN) para Matrix, Element e Coturn apontando para seu servidor. Usaremos matrix.example.com, element.example.com e coturn.example.com, respectivamente, para os três serviços.
  5. 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 -y Alguns 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//synapse/homeserver.yaml. 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.

Página de Login do Element Web

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

Cliente Element Servidor Doméstico Personalizado

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.

Login Personalizado do Servidor Doméstico Element

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.

Backup Seguro do Matrix

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.

Frase de Segurança do Element

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.

Confirmar Frase de Segurança do Element

Insira a frase novamente e clique em Continuar para prosseguir.

Popup de Chave de Segurança do Element

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.

Verificar Senha do Element

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.

Painel do Cliente Web do Element

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.

Criar uma Sala Privada no Matrix

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.

Painel do Element Auto-Hospedado

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.

Share: X/Twitter LinkedIn

Receba novas postagens na sua caixa de entrada

Sem spam. Cancele a assinatura a qualquer momento.