Поднимаем собственный Matrix сервер в Fedora

Matrix — это открытый, свободный, децентрализованный (федеративный) протокол для общения. Он поддерживает все функции современных мессенджеров. В этом HOWTO мы рассмотрим как можно поднять свой собственный Matrix сервер и настроить его общение с другими.

Основные преимущества Matrix

  • свободный и открытый: как клиент, так и сервер;
  • имеет множество реализаций;
  • федеративный, что означает, что каждый желающий может поднять свой собственный сервер и общаться с пользователями других серверов без каких-либо ограничений;
  • поддерживает надёжное шифрование как личных, так и групповых чатов на основе системы шифрования Double Ratchet, впервые представленной в Signal;
  • синхронизация сообщений с возможностью её хранения на сервере в зашифрованном виде;
  • верификация устройств собеседника;
  • поддержка ботов и транспортов в другие сети, например IRC, Slack, Gitter и т.д.;
  • удобный поиск сообщений на сервере;
  • push уведомления со стороны сервера;
  • голосовая связь посредством протокола WebRTC, в т.ч. групповые звонки (пока в статусе бета-тестирования);
  • редактирование, удаление сообщений, гибкая настройка прав доступа, быстрое создание закрытых чатов для неограниченного количества пользователей, стикеры и т.п.

Выбор сервера для Matrix

В настоящее время существует несколько поддерживаемых серверов для данного протокола:

  • Synapse (написан на Python);
  • Ruma (написан на Rust).

В нашей статье мы рассмотрим установку и настройку Synapse, поскольку он имеет наибольшую популярность, хорошо документирован и присутствует в основных репозиториях Fedora.

Установка сервера Synapse

Поскольку пакет уже присутствует в главном репозитории, откроем терминал и выполним следующую команду:

sudo dnf install matrix-synapse

На этом установка завершена. Можем приступать к настройке.

Создание конфигурации Synapse

Для начала сгенерируем базовый конфиг, который будем править для своих нужд. Сделать это достаточно просто:

cd /etc/synapse
sudo python -m synapse.app.homeserver --server-name example.org --config-path homeserver.yaml --generate-config --report-stats=no

После выполнения в каталоге /etc/synapse будет создан примерный файл конфигурации сервера homeserver.yaml для домена example.org (необходимо изменить на необходимый), а также сгенерированы самоподписанные сертификаты для TLS шифрования.

Установим правильного владельца и группу для файлов внутри каталога /etc/synapse:

sudo chown -R synapse:synapse /etc/synapse/*

Изменим права доступа: 0640 для различных конфигов и 0600 для ключей и сертификатов:

sudo chmod 0600 /etc/synapse/*.{dh,crt,key}
sudo chmod 0640 /etc/synapse/*.{config,yaml}

Сбросим для данного каталога контекст безопасности SELinux:

sudo restorecon -Rv /etc/synapse

Настройка сервера Synapse

Теперь можем приступить к настройке. Базовый файл конфигурации /etc/synapse/homeserver.yaml очень хорошо документирован, поэтому мы рассмотрим лишь самые необходимые его директивы, без которых нормальная работа сервера будет невозможна.

Настройка TLS:

# Сертификат TLS с цепочкой
tls_certificate_path: "/etc/synapse/example.org.tls.crt"

# Приватный ключ TLS сертификата в формате PEM
tls_private_key_path: "/etc/synapse/example.org.tls.key"

# Файл параметров механизма обмена ключами Диффи-Хеллмана
tls_dh_params_path: "/etc/synapse/example.org.tls.dh"

Настоятельно рекомендуется вместо сгенерированных автоматически самоподписанных сертификатов использовать полноценные от Let’s Encrypt. В сети уже существует огромное количество хороших статей по настройке Let’s Encrypt, поэтому мы опустим данную тему в данной статье. После получения сертификатов будет достаточно лишь исправить значение указанных выше директив и перезапустить сервер Synapse.

Основные настройки Synapse:

# Доменное имя Matrix сервера. Будет частью пользовательского ID.
server_name: "example.org"

# Разрешить или запретить хостинг веб-клиента.
web_client: False

# Публичный URL сервера.
public_baseurl: https://example.org:8448/

# Настройки СУБД.
database:
  # Тип движка СУБД. По умолчанию используется sqlite3.
  name: "sqlite3"
  # Параметры движка, например имя-пароль.
  args:
    # В случае sqlite3 это путь к файлу с БД.
    database: "/var/lib/synapse/homeserver.db"

# Каталог, в котором будут храниться все загруженные
# на сервер медиа-файлы и изображения.
media_store_path: "/var/lib/synapse/media_store"

# Каталог для загружаемых пользовательских файлов.
uploads_path: "/var/lib/synapse/uploads"

# Максимальный размер загружаемого на сервер файла.
max_upload_size: "10M"

# Максимальный размер изображения или прочего медиа-файла,
# для которого разрешено сгенерировать preview.
max_image_pixels: "32M"

# Разрешает или запрещает создавать preview для любых
# гиперссылок на стороне сервера.
url_preview_enabled: False

# Разрешает или запрещает анонимную регистрацию пользователей
# на текущем сервере из клиентов.
enable_registration: False

# Разрешает или запрещает анонимным пользователям без регистрации
# получать доступ к серверу и в том числе созданным на нём каналам.
allow_guest_access: False

Настроим виртуальные хосты, заменив весь блок listeners целиком:

# Настройка блока обработчиков протоколов.
listeners:
  # Главный обработчик HTTPS.
  -
    # Задаёт порт, который будет слушать наш сервер.
    port: 8448

    # Задаёт сетевые адреса интерфейсов, которые будет слушать сервер.
    # По умолчанию это все доступны на хосте IPv4 и IPv6 интерфейсы.
    bind_addresses:
      - '::'
      - '0.0.0.0'

    # Задаёт тип обработчика.
    type: http

    # Включает или отключает TLS шифрование. Должно быть включено всегда.
    tls: true

    # Включает или отключает X-Forwarded-For HTTP заголовок. Включать
    # необходимо только если нужно спрятать сервер за другой кэширующий
    # прокси, например nginx.
    x_forwarded: false

    # Задаёт список разрешённых ресурсов внутри обработчика.
    resources:
      -
        # List of resources to host on this listener.
        names:
          - client

        # Разрешает или запрещает сжатие данных для клиентов с поддержкой.
        compress: true

      - names: [federation]
        compress: false

Настройка журналов

Настроим ведение журналов. Для этого сначала создадим файл журнала:

sudo touch /var/log/homeserver.log

Установим для него корректные права доступа:

sudo chown synapse:synapse /var/log/homeserver.log
sudo chmod 0640 /var/log/homeserver.log

Откроем файл /etc/synapse/example.org.log.config в текстовом редакторе и укажем расположение файла журнала (здесь example.org — используемое доменное имя):

filename: /var/log/homeserver.log

Запуск сервера

Попробуем запустить наш сервер:

sudo systemctl start synapse.service

Его статус можно узнать при помощи следующей команды:

sudo systemctl status synapse.service

Если всё прошло успешно, добавим наш сервер в автозагрузку:

sudo systemctl enable synapse.service

Если возникли ошибки, то больше полезной информации можно будет найти в созданном файле журнала ошибок.

Регистрация первого пользователя

Сразу после установки на сервере не создано ни одного пользователя, поэтому воспользуемся штатной утилитой для их создания:

sudo register_new_matrix_user -c /etc/synapse/homeserver.yaml https://example.org:8448

Утилита предложит ввести имя пользователя без указания домена, пароль и его подтверждение, а также спросит нужно ли наделить его правами администратора сервера.

Настройка SRV записей

Чтобы наш сервер без проблем видели клиенты, а также другие серверы по федеративному протоколу, необходимо добавить новую SRV запись в DNS нашего домена example.org:

_matrix._tcp.example.org. 3600 IN SRV 10 0 8448 example.org.

Подключение к серверу

Для подключения к созданному серверу можно использовать любой из доступных Matrix клиентов:

  • Riot.im (веб, десктоп или мобильную версию);
  • nheko (присутствует в репозиториях Fedora).

В качестве homeserver (имя сервера для подключения) нужно указать наш домен, а в качестве полного username строку вида:

@username:example.org

Здесь username — логин зарегистрированного на сервере пользователя.

Литература

При написании данной статьи использовалась литература из следующих источников: