Como instalar e criar um servidor de bate-papo usando Matrix Synapse e Element no Rocky Linux 9
Nesta página
- Pré-requisitos
- Passo 1 - Configurar Firewall
- Passo 2 – Instalar e configurar o PostgreSQL
- Passo 3 - Instale o Matrix Synapse
- Passo 4 - Instale o Nginx
- Passo 5 – Instalar SSL
- Passo 6 - Configurar o SELinux
- Etapa 7 - Criar serviço Matrix Systemd
- Passo 8 - Configurar Matrix Synapse
- Etapa 9 – Configurar o Nginx
- Passo 10 - Instale o Coturn
- Passo 11 – Matriz de Acesso
- Passo 12 - Instalar Elemento
- Passo 13 - Configurar Elemento
- Conclusão
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 por meio de uma API padronizada que sincroniza em tempo real. Ele usa servidores domésticos para armazenar informações da conta e histórico de bate-papo. Se um servidor doméstico cair, outros servidores poderão 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 Synapse, uma implementação de servidor doméstico do Matrix. Element é um cliente web Matrix construído usando Matrix React SDK. Isso permitirá que você ofereça bate-papo Matrix na web. Você também pode usar o servidor com qualquer outro cliente Matrix. Também instalaremos o servidor Coturn para permitir chamadas de voz e vídeo. O serviço Coturn é opcional caso você não tenha interesse em utilizá-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 totalmente qualificados (FQDN) para Matrix, Element e Coturn apontando para o seu servidor. Usaremos matrix.example.com
, element.example.com
e coturn.example.com
respectivamente para os três serviços.
Certifique-se de que tudo esteja atualizado.
$ sudo dnf update
Poucos 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 Firewall
Antes de instalar qualquer pacote, a primeira etapa é configurar o firewall para abrir portas para HTTP, HTTPS e Synapse. Rocky Linux usa Firewalld Firewall. Verifique o status do firewall.
$ sudo firewall-cmd --state
running
O firewall funciona com zonas diferentes, e a zona pública é a zona 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ê deverá 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 ativá-las.
$ sudo firewall-cmd --runtime-to-permanent
$ sudo firewall-cmd --reload
Passo 2 – Instalar e configurar o PostgreSQL
Rocky Linux 9 vem com PostgreSQL 13 por padrão. Estaremos usando 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 integrado.
$ 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 instalar postgresql16-devel
exportar PATH=` PATH:/usr/pgsql-16/bin
O pacote postgresql-contrib
contém alguns utilitários 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
Initializing database ... 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 do sistema postgres
.
$ sudo -su postgres
Crie um novo usuário de banco de dados e um banco de dados para PostgreSQL. Será solicitada 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 - Instale o Matrix Synapse
Matrix Synapse não possui um pacote pré-construído para distribuições baseadas em CentOS como Rocky Linux. Portanto, iremos instalá-lo como um módulo Python do PyPI.
A primeira etapa é instalar os pré-requisitos necessários para o funcionamento do Synapse. 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 referido diretório.
$ virtualenv -p python3 ~/synapse/env
Ative o ambiente virtual.
$ source ~/synapse/env/bin/activate
Certifique-se de ter a versão mais recente do pip
e do 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á, junto com as bibliotecas Python que ele usa, em um ambiente virtual na pasta ~/synapse/env
. Ele também instalará a biblioteca PostgreSQL Python necessária para que o Synapse se conecte ao servidor PostgreSQL. O comando acima é uma combinação dos comandos pip install array-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 Matrix ID. Insira seu nome de domínio Matrix como valor. Isso funcionará como o endereço do seu 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 por meio da variável --report-stats
. Escolha sim
ou não
conforme sua escolha.
Você obterá a seguinte saída.
Generating config file homeserver.yaml
Generating log config file /home/navjot/synapse/matrix.example.com.log.config which will log to /home/navjot/synapse/homeserver.log
Generating signing key file /home/navjot/synapse/matrix.example.com.signing.key
A config file has been generated in 'homeserver.yaml' for server name 'matrix.example.com'. Please review this file and customise it to your needs.
Você pode alterar essas configurações posteriormente no arquivo ~/synapse/homeserver.yaml
ou /home/
. As chaves geradas pelo comando acima permitirão que seu servidor doméstico se identifique para outro servidor doméstico.
É hora de executar o servidor Matrix. Certifique-se de estar dentro do diretório Synapse e de que o ambiente virtual esteja ativo.
Inicie o servidor doméstico.
(env) $ synctl start
Você deverá ver uma saída semelhante.
This server is configured to use 'matrix.org' as its trusted key server via the
'trusted_key_servers' config option. 'matrix.org' is a good choice for a key
server since it is long-lived, stable and trusted. However, some admins may
wish to use another server for this purpose.
To suppress this warning and continue using 'matrix.org', admins should set
'suppress_key_server_warning' to 'true' in 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 - Instale 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 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
Quando terminar, salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.
Estaremos instalando a linha principal do Nginx, então habilite o pacote para ela.
$ 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 - high performance web server
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 do pacote Snapd para isso. Como o Rocky Linux não vem com ele, instale o instalador Snapd. Requer o repositório EPEL (Extra Packages for Enterprise Linux) para funcionar. Mas como já o instalamos na etapa 3, podemos seguir em frente diretamente.
Instale o pacote Snapd.
$ sudo dnf install snapd -y
Habilite e inicie o serviço Snap.
$ sudo systemctl enable snapd --now
Instale o pacote principal do Snap e certifique-se de que sua versão do Snapd esteja atualizada.
$ sudo snap install core
$ sudo snap refresh core
Crie os links necessários para que o Snapd funcione.
$ 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 comando a seguir 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 -d matrix.example.com
O comando acima fará download de um certificado para o diretório /etc/letsencrypt/live/matrix.example.com
em seu servidor.
Gere um certificado do grupo Diffie-Hellman.
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
Verifique o serviço de agendamento de renovação do Certbot.
$ systemctl list-timers
Você encontrará snap.certbot.renew.service
como um dos serviços programados 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 uma simulação do processo para verificar se a renovação do SSL está funcionando bem.
$ sudo certbot renew --dry-run
Se você não encontrar erros, está tudo pronto. Seu certificado será renovado automaticamente.
Passo 6 - Configurar o SELinux
O SELinux impede que você execute um serviço do sistema onde o binário está no diretório inicial do usuário. Por este motivo, se criarmos um arquivo de serviço para 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 com hosts externos.
$ sudo setsebool -P httpd_can_network_connect 1
Aplique a política para permitir que o Nginx conceda acesso ao PostgreSQL.
$ sudo setsebool -P httpd_can_network_connect_db 1
Etapa 7 - Criar serviço Matrix Systemd
O status do serviço Synapse não é salvo durante uma reinicialização, o que significa que se você reiniciar o servidor, precisará iniciá-lo manualmente. Para contornar esse problema, precisamos criar o arquivo Systemd para ele.
Antes de prosseguir, certifique-se de que o serviço Synapse esteja interrompido.
$ 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 usuário do sistema Linux sob o qual você instalou o Synapse.
# This assumes that Synapse has been installed by a user named username.
# This assumes that Synapse has been installed in a virtualenv in
# the user's home directory: `/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
# adjust the cache factor if necessary
# Environment=SYNAPSE_CACHE_FACTOR=2.0
[Install]
WantedBy=multi-user.target
Quando terminar, salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.
Recarregue o daemon de serviço.
$ 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ê deverá 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]: This server is configured to use 'matrix.org' as its trusted key server via the
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: 'trusted_key_servers' config option. 'matrix.org' is a good choice for a key
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: server since it is long-lived, stable and trusted. However, some admins may
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: wish to use another server for this purpose.
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: To suppress this warning and continue using 'matrix.org', admins should set
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: 'suppress_key_server_warning' to 'true' in 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 Matrix Synapse
Antes de prosseguir, crie primeiro uma chave de registro secreta. A chave deve ser protegida porque permitirá que qualquer pessoa registe um novo utilizador, mesmo que o registo 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 credenciais do PostgreSQL.
Encontre a seção a seguir no arquivo e comente-a conforme mostrado.
#database:
# name: sqlite3
# args:
# database: /home/navjot/synapse/homeserver.db
Adicione a seguinte seção abaixo dela. Substitua o campo sua-senha
pela senha de usuário do PostgreSQL que você criou na etapa 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 permite indicadores de presença que mostram se uma pessoa está online. Isso pode causar alto uso da CPU, portanto você pode desativá-lo. Cole a seguinte linha na parte inferior.
presence:
enabled: false
Quando terminar, salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.
Crie um novo usuário de matriz. Será solicitado seu nome de usuário e senha. Como este é o primeiro usuário que estamos criando, digite yes
quando for 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
New user localpart [navjot]: navjot
Password:
Confirm password:
Make admin [no]: yes
Sending registration request...
Success!
(env) $ deactivate
Você pode ver que usamos a porta 8008 no comando acima. Isso ocorre porque é a porta padrão que o Matrix Synapse escuta.
Por padrão, o registro de novos usuários está desabilitado, o que significa que você precisa registrar cada usuário manualmente como acima. Se quiser abrir registros públicos, você pode fazer isso 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 email. Para ativar a verificação de e-mail, cole as seguintes linhas.
registrations_require_3pid:
- email
email:
smtp_host: mail.example.com
smtp_port: 587
# If mail server has no authentication, skip these 2 lines
smtp_user: '[email '
smtp_pass: 'password'
# Optional, require encryption with STARTTLS
require_transport_security: true
app_name: 'HowtoForge Example Chat' # defines value for %(app)s in notif_from and email subject
notif_from: "%(app)s <[email >"
Para desativar a verificação de e-mail, cole a seguinte linha.
enable_registration_without_verification: true
Quando terminar, salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.
Reinicie o Synapse para aplicar a configuração.
$ sudo systemctl restart matrix-synapse
Etapa 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.
# enforce HTTPS
server {
# Client port
listen 80;
listen [::]:80;
server_name matrix.example.com;
return 301 https://$host$request_uri;
}
server {
server_name matrix.example.com;
# Client port
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
# Federation port
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;
# TLS configuration
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;
# Nginx by default only allows file uploads up to 1M in size
# Increase client_max_body_size to match max_upload_size defined in homeserver.yaml
client_max_body_size 50M;
}
}
Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado quando terminar. A configuração acima funciona partindo do pressuposto 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, 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;
# TLS configuration
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;
# Redirect
location ~ ^(/_matrix|/_synapse/client) {
return 301 "https://matrix.example.com$request_uri";
}
# Client homeserver autodiscovery
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" } }';
}
# Domain delegation
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 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 - Instale o Coturn
Você precisará instalar um Traversal Using Relays em torno do servidor NAT (TURN) para permitir chamadas de voz e vídeo. Para tanto, instalaremos o pacote Coturn. Se não precisar dessa funcionalidade, você 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 Turn (coturn.example.com
).
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email -d coturn.example.com
Gere um segredo de autenticação para 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
Examinaremos o arquivo e habilitaremos as configurações de que precisamos. Primeiro, habilite o método de autenticação removendo o comentário da linha use-auth-secret
.
# Be aware that use-auth-secret overrides some parts of lt-cred-mech.
# The use-auth-secret feature depends internally on lt-cred-mech, so if you set
# this option then it automatically enables lt-cred-mech internally
# as if you had enabled both.
#
# Note that you can use only one auth mechanism at the same time! This is because,
# both mechanisms conduct username and password validation in different ways.
#
# Use either lt-cred-mech or use-auth-secret in the conf
# to avoid any confusion.
#
use-auth-secret
A seguir, configuraremos a variável static-auth-secret
com o valor que criamos acima. Também precisaremos desse segredo para configurar o Synapse posteriormente.
# 'Static' authentication secret value (a string) for TURN REST API only.
# If not set, then the turn server
# will try to use the 'dynamic' value in the turn_secret table
# in the user database (if present). The database-stored value can be changed on-the-fly
# by a separate program, so this is why that mode is considered 'dynamic'.
#
static-auth-secret=u3ksgJ9X876sFMO00A8KabXwZvzVwCmV30wWvZ7DzGiepRwNRYSCTYzf2E8olNzdDHu7oO3XpT3l5bv5mVdhXEQ3pnoTWBquSVPFFBJtyD6y9gBxiMaD2TYTD2WohQLE9s7OKJVpkDeKTnZQnkmjrFadE3M9DRxPL1W5Lgdg6XLLKABgb5XGkutRgkJOV0JRH4sBYsot63fWq9mcGTm6nAMdIycvDVDOs7vhoeqRzcTbMF0wsfAHVJNhXpGGFDyZ
O próximo valor que precisamos alterar é o reino
. Refere-se ao domínio que escolhemos para Coturn.
# The default realm to be used for the users when no explicit
# origin/realm relationship is found in the database, or if the TURN
# server is not using any database (just the commands-line settings
# and the userdb file). Must be used with long-term credentials
# mechanism or with TURN REST API.
#
# Note: If the default realm is not specified, then realm falls back to the host domain name.
# If the domain name string is empty, or set to '(None)', then it is initialized as an empty string.
#
realm=coturn.example.com
A seguir, defina o número de sessões e sessões por usuário. Escolha um valor que funcione para o seu servidor.
# Per-user allocation quota.
# default value is 0 (no quota, unlimited number of sessions per user).
# This option can also be set through the database, for a particular realm.
#
user-quota=12
# Total allocation quota.
# default value is 0 (no quota).
# This option can also be set through the database, for a particular realm.
#
total-quota=1200
Em seguida, precisamos desabilitar o TCP, pois VOIP é UDP.
# Uncomment if no TCP relay endpoints are allowed.
# By default TCP relay endpoints are enabled (like in RFC 6062).
#
no-tcp-relay
Também precisamos configurar a localização dos certificados que criamos para o Coturn.
# Certificate file.
# Use an absolute path or path relative to the
# configuration file.
# Use PEM file format.
#
cert=/etc/letsencrypt/live/coturn.example.com/fullchain.pem
# Private key file.
# Use an absolute path or path relative to the
# configuration file.
# Use PEM file format.
#
pkey=/etc/letsencrypt/live/coturn.example.com/privkey.pem
Em seguida, precisamos desabilitar o tráfego para intervalos de IP privados e proibir peers em endereços multicast para melhorar a segurança.
# Flag that can be used to disallow peers on well-known broadcast addresses (224.0.0.0 and above, and FFXX:*).
# This is an extra security measure.
#
no-multicast-peers
...............
# Option to allow or ban specific ip addresses or ranges of ip addresses.
# If an ip address is specified as both allowed and denied, then the ip address is
# considered to be allowed. This is useful when you wish to ban a range of ip
# addresses, except for a few specific ips within that range.
#
# This can be used when you do not want users of the turn server to be able to access
# machines reachable by the turn server, but would otherwise be unreachable from the
# internet (e.g. when the turn server is sitting behind a NAT)
#
# Examples:
# 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
denied-peer-ip=2002::-2002:ffff:ffff:ffff:ffff:ffff:ffff:ffff
denied-peer-ip=fc00::-fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
denied-peer-ip=fe80::-febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff
Quando terminar, salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.
Reinicie o Coturn para aplicar a configuração.
$ sudo systemctl restart coturn
Abra o arquivo de configuração do Synapse (homeserver.yaml
) para adicionar 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 \etc\coturn\turnserver.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 – Matriz de Acesso
Você pode acessar o Matrix Chat usando o cliente web da Element em https://app.element.io
. Clique no botão Fazer login para continuar.
Clique no link Editar em Homeserver. Digite matrix.example.com
como seu servidor doméstico.
Se o cliente detectar seu servidor doméstico corretamente, o limite e o texto ficarão verdes, caso contrário serão mostrados em vermelho. Clique em Continuar para prosseguir.
Digite o nome de usuário e a senha que você criou na etapa 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á obrigatória sempre que você fizer login. Clique em Continuar para continuar.
Insira uma frase de segurança e clique no botão Continuar para prosseguir. Você será solicitado a confirmá-lo novamente na próxima tela.
Digite a frase novamente e clique em Continuar para prosseguir.
Você receberá um conjunto de chaves de segurança que poderá usar caso esqueça sua frase de segurança. Clique no botão Baixar para salvá-los.
Clique no botão Continuar para prosseguir.
Será solicitada a senha da sua conta. Digite a senha e clique no botão Continuar para finalizar a configuração do backup criptografado.
Criamos uma sala de bate-papo em grupo chamada HowtoForge usando o botão Criar um bate-papo em grupo na página inicial. Você receberá o seguinte pop-up ao clicar no botão.
Você pode restringir membros ao domínio expandindo o menu avançado e selecionando a opção. Conclua a criação da sala clicando no botão Criar sala.
Passo 12 - Instalar Elemento
Crie um diretório para 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 Elemento
Copie o mesmo arquivo de configuração do elemento.
$ 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 padrão do servidor doméstico Matrix para o seu servidor doméstico e remova a variável server_name
.
"m.homeserver": {
"base_url": "https://matrix.example.com",
"server_name": "example.com"
},
Se 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 impedir que convidados usem 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 -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;
# TLS configuration
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:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
}
Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.
Verifique a sintaxe do arquivo de configuração 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 definir as configurações do SELinux antes de acessar o Element. Execute os seguintes comandos para permitir a execução do Element.
$ 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 do 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 https://app.element.io
primeiro, certifique-se de estar conectado no aplicativo Element original e será solicitado que você corresponda aos caracteres emoji. Depois de verificado, você obterá o seguinte painel.
Conclusão
Isso conclui nosso tutorial sobre como instalar o servidor Matrix Synapse Chat junto com o cliente web Coturn e Element usando Nginx como servidor proxy em uma máquina Debian 12. Se você tiver alguma dúvida, poste-a nos comentários abaixo.