Установку производить буду в Debian и также буду давать ссылки на страницы с рекомендациями по установке в первоисточнике, ибо проект ещё развивается и многое меняется. Особенно сильно меняется часть отвечающая за звонки.
Начнём с базы - с самого чата и возможности обмена сообщениями. Установим Matrix Synapse.
Добавляем репозиторий:
sudo apt install -y lsb-release wget apt-transport-https sudo wget -O /usr/share/keyrings/matrix-org-archive-keyring.gpg https://packages.matrix.org/debian/matrix-org-archive-keyring.gpg echo "deb [signed-by=/usr/share/keyrings/matrix-org-archive-keyring.gpg] https://packages.matrix.org/debian/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/matrix-org.list sudo apt update sudo apt install matrix-synapse-py3
При установке нужно будет указать домен, по которому будет доступен наш чат, например matrix.example.com.
Установим PostgresSQL
sudo apt install postgresql postgresql-contrib
Настроим
sudo -su postgres createuser --pwprompt synapse createdb --encoding=UTF8 --locale=C --template=template0 --owner=synapse synapsedb exit
введенный пароль потом потребуется указать с настройках matrix
Установим reverse proxy, рекомендуется Nginx (но можно Apache или Caddy)
sudo apt install nginx
Также нам понадобится сертификат для домена, способ его получения уже на ваше усмотрение. Из бесплатных рекомендуется ZeroSSL с точки зрения меньших проблем со звонками на мобильных.
Создадим файл конфиграции
sudo nano /etc/nginx/conf.d/matrix.example.com.conf
и вставим содержимое
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 http2;
listen [::]:443 ssl http2;
# Federation port
listen 8448 ssl http2;
listen [::]:8448 ssl http2;
index index.php index.html;
access_log /var/www/matrix.example.com/logs/access.log;
error_log /var/www/matrix.example.com/logs/error.log;
location / {
try_files $uri $uri/ /index.php =404;
}
location ~ ^(/_matrix|/_synapse/client|/_synapse/admin) {
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://localhost:8008;
proxy_http_version 1.1;
proxy_buffering off;
# 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 100M;
}
location /_matrix/client/v3/sync {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://localhost:8008;
proxy_http_version 1.1;
proxy_buffering off;
}
location = /_synapse/client/v1/config/federation_whitelist {
return 200 '{"whitelist_enabled": true, "whitelist": [ "matrix.example.com" ]}';
default_type application/json;
}
# 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_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;
gzip on;
}
Настроим Matrix.
Добавим конфигурацию БД
sudo nano /etc/matrix-synapse/conf.d/database.yaml
содержимое
database:
name: psycopg2
args:
user: synapse
password: 'your-password'
database: synapsedb
host: localhost
cp_min: 5
cp_max: 10
генерируем секретный ключ macaroon
openssl rand -hex 32
добавим свою конфигурацию
sudo nano /etc/matrix-synapse/conf.d/custom.yaml
содержимое
# Секретный ключ для сессионных токенов
macaroon_secret_key: "сгенерированный_ранее_ключ"
max_upload_size: 100M suppress_key_server_warning: true search_all_users: true prefer_local_users: true presence: enabled: true # можно отключить для оптимизации
max_event_delay_duration: 24h rc_message: per_second: 0.5 burst_count: 30 rc_delayed_event_mgmt: # This needs to match at least the heart-beat frequency plus a bit of headroom # Currently the heart-beat is every 5 seconds which translates into a rate of 0.2s per_second: 1 burst_count: 20
Создадим секретный ключ для регистрации (registration_shared_secret). С его помощью можно создавать аккаунты через скрипт регистрации даже при выключенной публичной регистрации
echo "registration_shared_secret: '$(cat /dev/urandom | tr -cd '[:alnum:]' | fold -w 256 | head -n 1)'" | sudo tee /etc/matrix-synapse/conf.d/registration_shared_secret.yaml
Добавим конфигурацию для федерации
sudo nano /etc/matrix-synapse/conf.d/feeration.yaml
содержимое
federation_domain_whitelist:
- matrix.example.com
Добавим конфигурацию для предварительного просмотра ссылок (предложенный блэклист это минимальный набор в который рекомендуется добавить свои подсети с целью безопасности)
sudo nano /etc/matrix-synapse/conf.d/urlpreview.yaml
содержимое
url_preview_enabled: true
url_preview_ip_range_blacklist:
- 127.0.0.0/8
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
- 100.64.0.0/10
- 192.0.0.0/24
- 169.254.0.0/16
- 192.88.99.0/24
- 198.18.0.0/15
- 192.0.2.0/24
- 198.51.100.0/24
- 203.0.113.0/24
- 224.0.0.0/4
- ::1/128
- fe80::/10
- fc00::/7
- 2001:db8::/32
- ff00::/8
- fec0::/10
Отключим возможность регистрации
sudo nano /etc/matrix-synapse/conf.d/registration.yaml
содержимое
enable_registration: false
Перезагрузим Matrix и Nginx. В текущем состоянии мессенджер уже должен работать, но без звонков.
sudo systemctl restart matrix-synapse sudo systemctl restart nginx
Добавим первого пользователя с правами администратора
register_new_matrix_user -c /etc/matrix-synapse/conf.d/registration_shared_secret.yaml http://localhost:8008
Теперь настроим звонки. Для этого настроим ещё два сервиса Livekit SFU и MatrixRTC. Для оптимизации звонков можно установить Redis сервер, но не обязательно.
Установить Redis можно командой
sudo apt install redis
файл конфигурации
sudo nano /etc/redis/redis.conf
содержимое
bind 127.0.0.1 ::1
protected-mode yes
port 6379
timeout 0
tcp-keepalive 300
loglevel warning
logfile /var/log/redis/redis-server.log
dir /var/lib/redis # создайте дерикторию если её нет
Установим Livekit SFU
curl -sSL https://get.livekit.io | bash
cp -a bin/livekit-server /usr/bin/
добавим его как сервис
sudo nano /etc/systemd/system/lk-sfu.service
содержимое
[Unit]
Description=LiveKit Server
After=network.target
[Service]
Restart=always
WorkingDirectory=/var/lib/matrix-rtc
ExecStart=/usr/bin/livekit-server --config /etc/matrix-synapse/livekit.yaml
[Install]
WantedBy=multi-user.target
сгенерируем ключи (API KEY и API SECRET) для работы
# /usr/bin/livekit-server generate-keys
создадим конфиг файл
sudo nano /etc/matrix-synapse/livekit.yaml
содержимое
port: 7880
bind_addresses:
- ""
rtc:
tcp_port: 7881
port_range_start: 50000
port_range_end: 60000
use_external_ip: true
enable_loopback_candidate: false
room:
auto_create: false
redis: # если решили установить
address: localhost:6379
username: ""
password: ""
db: 0
use_tls: false
sentinel_master_name: ""
sentinel_username: ""
sentinel_password: ""
sentinel_addresses: []
cluster_addresses: []
max_redirects: null
keys:
API_KEY: API_SECRET # сгенерированные ранее
Установим MatrixRTC
wget https://github.com/element-hq/lk-jwt-service/releases/latest/download/lk-jwt-service_linux_amd64 chmod +x lk-jwt-service_linux_amd64
cp -a lk-jwt-service_linux_amd64 /usr/bin/
настроим сервис
sudo nano /etc/systemd/system/lk-jwt.service
содержимое
[Unit]
Description=LiveKit JWT Service
After=network.target
[Service]
Restart=always
User=www-data
Group=www-data
WorkingDirectory=/var/lib/matrix-rtc
Environment="LIVEKIT_URL=wss://lk.example.com" # домен для сервера звонков
Environment="LIVEKIT_SECRET=API_SECRET" # сгенерированный ранее
Environment="LIVEKIT_KEY=API_KEY" # сгенерированный ранее
Environment="LIVEKIT_JWT_BIND=localhost:8080"
Environment="LIVEKIT_FULL_ACCESS_HOMESERVERS=matrix.example.com" # основной домен самого matrix
ExecStart=/usr/bin/lk-jwt-service_linux_amd64
[Install]
WantedBy=multi-user.target
Для звонков можно использовать тот же домен, что и сам matrix, но лучше использовать свой домен для удобства дальнейшего масштабирования.
Настроим NGINX для звонков
sudo nano /etc/nginx/conf.d/lk.example.com.conf
содержимое
server {
# Client port
listen 80;
#listen [::]:80;
server_name lk.example.com;
return 301 https://$host$request_uri;
}
server {
# Client port
listen 443 ssl http2;
#listen [::]:443 ssl http2;
server_name lk.example.com;
access_log /var/www/matrix.example.com/logs/lk_access.log;
error_log /var/www/matrix.example.com/logs/lk_error.log;
# This is lk-jwt-service
location ~ ^(/sfu/get|/get_token|/healthz) {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location / {
proxy_pass http://127.0.0.1:7880/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_send_timeout 120;
proxy_read_timeout 120;
proxy_buffering off;
proxy_set_header Accept-Encoding gzip;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
# TLS configuration
ssl_certificate /etc/letsencrypt/live/lk.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/lk.example.com/privkey.pem;
#ssl_trusted_certificate /etc/letsencrypt/live/lk.example.com/chain.pem;
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;
}
добавим в конфиг nginx для matrix /etc/nginx/conf.d/matrix.example.com.conf
location = /.well-known/matrix/client {
return 200 '{"m.homeserver": {"base_url": "https://matrix.example.com"},"org.matrix.msc4143.rtc_foci":[{"type":"livekit","livekit_service_url":"https://lk.example.com"}]}';
default_type application/json;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE, OPTIONS';
add_header Access-Control-Allow-Headers 'X-Requested-With, Content-Type, Authorization';
}
добавим конфиг в сам matrix
sudo nano /etc/matrix-synapse/conf.d/livekit.yaml
содержимое
matrix_rtc:
transports:
- type: livekit
livekit_service_url: https://lk.example.com
livekit:
server: https://lk.example.com
key: API_KEY # сгенерированный ранее
secret: API_SECRET # сгенерированный ранее
enabled: true
jwt_duration_seconds: 43200
experimental_features:
msc3266_enabled: true
msc4140_enabled: true
msc4143_enabled: true
msc4222_enabled: true
msc4354_enabled: true