Похожие статьи

Последние обновления

Настраиваем свой сервер Matrix со звонками в Element X

Установку производить буду в Debian и также буду давать ссылки на страницы с рекомендациями по установке в первоисточнике, ибо проект ещё развивается и многое меняется. Особенно сильно меняется часть отвечающая за звонки.

Исправление пропавших iOS устройств в Android Studio

После очередного обновления Xcode в Android Studio пропали все устройства iOS, как физические так  и симуляторы. В самом Xcode при этом все устройства были прекрасно видны.

Монтируем EXT2, EXT3, EXT4 в Mac OS

Mac OS самостоятельно работать с файловой системой Linux, таких как EXT2, EXT3, EXT4, не может. Для решения этой проблемы есть платное решение extFS от Paragon, но есть и бесплатный вариант для тех кто не боится командной строки. Для этого нам понадобиться приложение fuse-ext2.

Настраиваем свой сервер Matrix со звонками в Element X

Установку производить буду в 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