Нас приучили перешептываться в чужих домах. Нам выдали «бесплатные» мессенджеры, где стены имеют уши, владелец может в любой момент сменить замок, а наши самые сокровенные разговоры — просто строчка в логах для анализа рекламным движком. Мы стали цифровыми арендаторами, забыв, что можем строить сами.

Этот текст — не про аренду. Он о том, как выковать ключи, возвести стены и поднять флаг над своей собственной, неприступной цифровой цитаделью. Мы развернем на сервере Selectel полноценный узел связи: Matrix Synapse, сервер звонков Coturn и веб-клиент Element. Никаких контейнеров, никакой магии. Только чистая система, командная строка и стопроцентный контроль.

Используйте навигацию, если не хотите читать статью полностью:

Важно! В данном руководстве домен chat.lservers.ru и IP-адрес 45.131.42.83 используются в качестве рабочего примера. Необходимо заменить их на ваши реальные данные во всех конфигурационных файлах и командах.

Глава 1. Закладка фундамента

90% будущих проблем рождаются именно на этом этапе из-за спешки. Не торопитесь. Правильно заложенное основание — залог стабильной работы.

Подготовка сервера и DNS

Matrix Synapse — довольно требовательное к ресурсам приложение, особенно к оперативной памяти. Для стабильной работы чатов и звонков даже для небольшой команды нужен запас мощности.

Мы будем использовать виртуальный сервер, который отлично подходит для таких задач.

Подготовка сервера

1. Перейдем в панель управления Selectel. В верхнем меню выберем Продукты → Облачные серверы и нажмем Создать сервер.

2. Теперь выберем конфигурацию. Рекомендуемый минимум — 2 vCPU и 2 ГБ RAM. Это обеспечит отзывчивость интерфейса и быструю обработку сообщений. В качестве ОС укажем Debian 12 (Bookworm).

3. Обязательно нужно добавить публичный IP. В нашем примере это 45.131.42.83.

Настройка DNS

Теперь нужно сообщить всему миру, как найти нашу будущую цитадель.

1. В панели управления вашего доменного регистратора создайте одну A-запись.

  • Тип: A.

  • Имя (хост): chat.

  • Значение: 45.131.42.83.

2. Для полноценной федерации (общения с пользователями вне вашего сервера) настоятельно рекомендуется настроить PTR-запись.

  • Вернемся в панель управления.

  • Перейдем в карточку вашего сервера. В настройках сети найдем IP-адрес и опцию для редактирования PTR-записи.

  • Укажем полное имя сервера. В качестве примера — chat.lservers.ru.

Первое подключение и обновление

Подключитесь к серверу по SSH и первым делом приведите систему в актуальное состояние.

sudo apt update && sudo apt upgrade -y

Security Center

Рассказываем о лучших практиках и средствах ИБ, требованиях и изменениях в законодательстве.

Исследовать →

Глава 2. Монтаж несущих конструкций

Установим все программное обеспечение, прежде чем переходить к настройке.

Установка веб-сервера и утилит

Apache будет нашими воротами, а Certbot — ключом к шифрованию.

sudo apt install -y apache2 certbot

Сразу включим все необходимые модули Apache для дальнейшей работы.

sudo a2enmod proxy proxy_http ssl headers rewrite

Установка Matrix Synapse и Coturn

1. Устанавливаем зависимости и добавляем репозиторий Matrix.

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

2. Устанавливаем Synapse и Coturn.

sudo apt update
sudo apt install -y matrix-synapse-py3 coturn

Во время установки Synapse появится диалоговое окно. Введите ваше имя сервера. Пример: chat.lservers.ru.

Глава 3. Инженерные системы и коммуникации

Это самый ответственный этап. Точность здесь — залог успеха.

Получение SSL-сертификатов

Мы получим сертификаты до полной настройки сервисов, так как они нужны и для Apache, и для Coturn.

1. Временно остановим Apache, чтобы освободить 80 порт для проверки Certbot.

sudo systemctl stop apache2

2. Получаем сертификат в режиме standalone.

sudo certbot certonly --standalone -d chat.lservers.ru

Настройка Synapse: единственный источник правды

Пакет Synapse для Debian имеет свою философию: основной файл homeserver.yaml лучше не трогать, а все изменения вносить в директорию conf.d.

1. Задаем имя сервера — это критически важный шаг. Debian-пакет ожидает, что имя сервера будет задано в отдельном, специально предназначенном для этого файле.

sudo nano /etc/matrix-synapse/conf.d/server_name.yaml

Удаляем все содержимое файла и вставляем только одну эту строку:

server_name: "chat.lservers.ru"

2. Создаем файл с остальными настройками.

sudo nano /etc/matrix-synapse/conf.d/90-custom.yaml

Вставляем в него проверенный конфиг. Обязательно генерируем новые уникальные ключи командами openssl rand -hex 32 и вставляем их.

# Разрешаем регистрацию на время настройки
enable_registration: true
enable_registration_without_verification: true

# Секретный ключ для сессионных токенов. ОБЯЗАТЕЛЕН для запуска.
macaroon_secret_key: "ВАШ_СГЕНЕРИРОВАННЫЙ_КЛЮЧ_MACAROON"

# Настройки для звонков через Coturn
turn_uris:
  - "turn:chat.lservers.ru:3478?transport=udp"
  - "turn:chat.lservers.ru:3478?transport=tcp"
    
# Секретный ключ для связи с Coturn. Должен совпадать с ключом в turnserver.conf.
turn_shared_secret: "ВАШ_СГЕНЕРИРОВАННЫЙ_КЛЮЧ_TURN"
    
turn_user_lifetime: 86400000
turn_allow_guests: true
max_upload_size: 4G

Примечание о базе данных. По умолчанию Synapse использует SQLite3, что отлично подходит для старта. Для высоконагруженных систем рекомендуется переход на PostgreSQL.

Настройка Coturn

1. Откроем файл конфигурации.

sudo nano /etc/turnserver.conf

2. Заменим все его содержимое, подставив домен и секретный ключ из предыдущего шага.

listening-port=3478
tls-listening-port=5349
fingerprint
use-auth-secret
static-auth-secret=ВАШ_СГЕНЕРИРОВАННЫЙ_КЛЮЧ_TURN
realm=chat.lservers.ru
lt-cred-mech
cert=/etc/letsencrypt/live/chat.lservers.ru/fullchain.pem
pkey=/etc/letsencrypt/live/chat.lservers.ru/privkey.pem
no-multicast-peers
no-cli

3. Активируем автозапуск. Для этого в файле /etc/default/coturn заменим TURNSERVER_ENABLED=0 на 1.

Настройка веб-клиента Element

1. Перейдем в директорию /tmp, найдем ссылку на последнюю версию на странице релизов Element и заменим ее.

cd /tmp
wget https://github.com/vector-im/element-web/releases/download/v1.11.80/element-v1.11.80.tar.gz

sudo mkdir -p /var/www/element
sudo tar -xzvf element-v*.tar.gz -C /var/www/element --strip-components=1
sudo cp /var/www/element/config.sample.json /var/www/element/config.json

2. Откроем config.json и укажем base_url (https://chat.lservers.ru) и server_name (chat.lservers.ru).

sudo nano /var/www/element/config.json
sudo chown -R www-data:www-data /var/www/element

Настройка Apache

Теперь настроим Apache в качестве реверс-прокси. Его задача — принимать все запросы из интернета, идущие на домен, и грамотно распределять их: обычные запросы от браузера отправлять к файлам веб-клиента Element, а служебные запросы от Matrix-клиентов — перенаправлять на сам сервер Synapse, который работает «внутри» системы.

Создаем файл /etc/apache2/sites-available/chat.lservers.ru.conf с этим содержанием:

# Этот блок отвечает за весь незащищенный трафик (HTTP).
# Его единственная задача — принудительно перенаправить пользователя на безопасную HTTPS-версию сайта.
<VirtualHost *:80>
    ServerName chat.lservers.ru
    Redirect permanent / https://chat.lservers.ru/
</VirtualHost>


# Это основная рабочая секция, которая обрабатывает защищенный трафик (HTTPS).
<VirtualHost *:443>
    ServerName chat.lservers.ru
    # Указываем, что при обращении к корню сайта нужно отдавать файлы веб-клиента Element.
    DocumentRoot /var/www/element

    # Включаем шифрование и указываем пути к SSL-сертификатам, полученным от Certbot.
    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/chat.lservers.ru/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/chat.lservers.ru/privkey.pem

    # Это самая важная часть. Все запросы, которые начинаются с /_matrix или /_synapse (служебные API-пути Matrix),
    # Apache перенаправляет внутрь сервера на порт 8008, где их слушает Synapse.
    ProxyPass /_matrix http://127.0.0.1:8008/_matrix nocanon
    ProxyPassReverse /_matrix http://127.0.0.1:8008/_matrix
    ProxyPass /_synapse http://127.0.0.1:8008/_synapse nocanon
    ProxyPassReverse /_synapse http://127.0.0.1:8008/_synapse

    # Эта секция задает права доступа к файлам веб-клиента.
    <Directory /var/www/element>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

Глава 4. Ввод в эксплуатацию

Перед началом работы вашего Matrix-сервера важно правильно настроить сетевую безопасность, активировать необходимые службы и создать первого администратора. 

Настроим файрвола

Чтобы обеспечить безопасность системы, нужно ограничить доступ к серверу только необходимыми портами.

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

sudo apt install -y ufw

2. Разрешаем входящие соединения по SSH, чтобы иметь возможность управлять сервером удаленно.

sudo ufw allow ssh

3. Разрешаем HTTP и HTTPS трафик для веб-сервера Apache.

sudo ufw allow 'Apache Full'

4. Открываем порты, используемые для TURN-сервера (например, Coturn), который обеспечивает NAT-трансляцию для WebRTC.

sudo ufw allow 3478
sudo ufw allow 5349

5. Включаем брандмауэр, активируя все ранее заданные правила.

sudo ufw enable

Рекомендация. Перед включением убедитесь, что все необходимые порты открыты, и вы можете подключиться к серверу по SSH.

Активация и запуск систем

Далее необходимо включить и запустить необходимые компоненты сервера, чтобы он начал работу.

1. Включаем конфигурацию виртуального хоста Apache для вашего домена (замените chat.lservers.ru.conf на ваш файл конфигурации).

sudo a2ensite chat.lservers.ru.conf

2. Включаем и запускаем TURN-сервер coturn, который обеспечивает NAT-трансляцию для WebRTC.

sudo systemctl enable --now coturn

3. Перезапускаем веб-сервер Apache, чтобы применить изменения.

sudo systemctl restart apache2

4. Перезапускаем сервер Matrix Synapse для применения новых настроек.

sudo systemctl restart matrix-synapse

Рекомендация. Проверьте статус служб после перезапуска командой systemctl status <имя_службы>.

Создание первого пользователя

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

sudo register_new_matrix_user -c /etc/matrix-synapse/homeserver.yaml http://127.0.0.1:8008 -u ваш-логин -p ваш-пароль --admin

Глава 5. Запечатывание периметра

Перейдите по ссылке до своего сервиса (https://chat.lservers.ru) и убедитесь, что все работает. После этого выполните самый важный шаг — закройте публичную регистрацию.

Для этого достаточно в файле /etc/matrix-synapse/conf.d/90-custom.yaml, установить параметр enable_registration в значение false и перезапустить Synapse.

sudo nano /etc/matrix-synapse/conf.d/90-custom.yaml
# ... меняем 'true' на 'false' ...
sudo systemctl restart matrix-synapse

Теперь ваша цитадель не только работает, но и надежно защищена от незваных гостей.

Как не надо делать

Это руководство родилось из реальных ошибок. Признаюсь: в какой-то момент, работая через файловый менеджер, я по-невнимательности затер homeserver.yaml. Это запустило цепную реакцию проблем, которые помогли выработать этот пуленепробиваемый метод. Не повторяйте моих ошибок, но знайте, как их исправить.

  • Ошибка «FileNotFoundError». После случайного удаления файла Synapse не мог запуститься. Решение — принудительная генерация конфига командой ... -m synapse.app.homeserver ... --generate-config.

  • Ошибка «Invalid server name 'None'». Сгенерированный конфиг оказался шаблоном, где имя сервера не было задано. Synapse не знал, кто он.

  • Ошибка «trusted_key_servers... must be a list». Тот же сгенерированный конфиг содержал пустые параметры, которые вызывали сбой.

Главный урок. Не боритесь с системой — поймите ее. Пакет Synapse для Debian «хочет», чтобы имя сервера было в /etc/matrix-synapse/conf.d/server_name.yaml, а остальные настройки — в других файлах. Следуя этой логике, можно получить стабильную систему.

Заключение

Вы построили больше, чем просто сервер. Вы построили пространство, где ваши разговоры — только ваши. Тишина, которую вы теперь слышите в эфире, где нет рекламных ботов и аналитических скриптов, — это и есть звук вашего цифрового суверенитета.

Управляйте сами!

Комментарии (5)


  1. Alexx_B
    02.09.2025 13:21

    так-то нынче модно аутентификацию пользователей заворачивать на mas, из экспериментальной фичи это уже зарелизилось недавно

    и звонки/конференции заворачивать в лайвкит, вместо coturn+jitsi. Со старыми звонками работают только старые клиенты (Element Classic), разработчик же рекомендует в новых инсталляциях использовать Element X. В отличие от десктопного и веб-клиентов, мобильные между собой договориться не могут, так что логичнее разворачивать то, что новое

    ну и чтобы клиенты нормально находили сервер, надо бы еще настроить делегирование (чтобы веб-сервер возвращал клиенту запросы /.well-known/matrix/client и /.well-known/matrix/server)

    (опционально - /.well-known/element/element.json, /.well-known/matrix/support и /.well-known/openid-configuration)

    P.S. еще хорошим тоном считается настраивать матрикс на TLD, а не SLD.


    1. loveprod Автор
      02.09.2025 13:21

      Честно говоря, мой первый инстинкт был сделать всё «красиво» и завернуть в Docker. Но в процессе я понял, что для начала нужна именно такая, почти «ламповая» инструкция. Нужно было сначала доказать, что это в принципе можно построить на голом железе, своими руками, прочувствовав каждую гайку и каждый конфиг. Это тот самый «нулевой уровень», который дает понимание, как эта махина вообще работает.
      Мой мануал — это как выдать бойцу АК-47. Просто, надежно, работает всегда, предсказуемо бьет по плечу. А то, что предлагаете вы — MAS, LiveKit, тонкая настройка делегирования — это уже профессиональный обвес: оптика, подствольник и эргономичная рукоятка. Это абсолютно правильный и логичный следующий шаг, который превращает «просто работает» в «работает идеально и современно».
      Так что еще раз спасибо. Вы, по сути, набросали идеальный план для сиквела.


      1. Alexx_B
        02.09.2025 13:21

        в докере вообще все просто разворачивается, у разработчика есть готовый скрипт, который запрашивает информацию и генерирует заполненные конфиги (`element-docker-demo`)


  1. PiterP
    02.09.2025 13:21

    Да уж, плакать хочется когда видишь, что кто-то это тормозное неудобное "нечто" не только использует, но ещë и рекламирует... Кактус он вкусный...


  1. Mapaxa864
    02.09.2025 13:21

    Этот текст — не про аренду.

    "YES, BUT..."

    Мы развернем на сервере Selecte