Свой сервер: подробное руководство по установке Prosody

Материал из Мир Jabber
Перейти к навигацииПерейти к поиску

В этой статье приводится пример настройки Prosody - одного из самых популярных и легковесных jabber-серверов. Для сервера написано просто-таки огромное число модулей на все случаи жизни, поэтому в руководстве, основанном на версии 0.12.4, будет показано подключение актуальных и популярных функций. В качестве сертификатов будем использовать Let's Encrypt, а в качестве хранилища данных, в том числе архива сообщений - MySQL[1] - и все это на Debian GNU/Linux.

Рассмотрим особенности данной конфигурации.

DNS-записи[править]

Хотя для базового варианта своего jabber-сервера вполне достаточно бесплатного DynDNS-домена, для полноценной конфигурации все же нужно обзавестись собственным доменом, где можно будет добавить все необходимые DNS-записи и сделать субдомены для сервисов. Выбор регистратора и покупка домена остается за рамками данной статьи, тут только приводятся шаги, которые надо сделать после покупки домена в его админке.

Всего понадобится около 15 записей в DNS:

  1. Для удобства, чтобы в случае миграции сервера с одного IP на другой не приходилось переписывать все записи, стоит завести для него субдомен, который будет ссылаться на нужный IP с помощью А-записи (или 2 таких субдомена в случае использования IPv4+IPv6 - один с A-записью, а второй с AAAA), а все остальные записи сделать CNAME-алиасами для него. Например, для данного сервера (jabberworld.info) сделаны 2 субдомена xmpp.jabberworld.info, ссылающиеся на IPv4 и IPv6-адреса.
  2. Создаем субдомены для необходимых сервисов сервера[2] - conference (для конференций), proxy (прокси для прямой передачи файлов), pubsub (сервисы типа "Публикация/подписка", где может сохраняться самая разная информация) и upload (сервис для передачи файлов через HTTP Upload). Все эти записи создаем как CNAME на наш субдомен из 1-го пункта.
  3. Создаем ряд SRV-записей для нашего основного домена - они показывают, где именно какой сервис находится. Конечно, если у вас все на одном адресе, то будет работать и так, но мы ведь решили все делать правильно, верно? Итак, нужны такие SRV-записи:
_xmpp-client._tcp.EXAMPLE.COM (порт 5222) - чтобы указать, куда подключаться jabber-клиенту
_xmpps-client._tcp.EXAMPLE.COM (порт 5223) - аналогичная запись для TLS-подключений клиентов
_xmpp-server._tcp.EXAMPLE.COM (порт 5269) - чтобы указать, куда подключаться jabber-серверу
_xmpps-server._tcp.EXAMPLE.COM (порт 5270) - аналогичная запись для TLS-подключений серверов.
Записи ниже служат для работы сервиса аудио/видеозвонков через jabber[3]. Для максимальной совместимости будем использовать как STUN, так и TURN - все возможные варианты:
_stun._tcp.EXAMPLE.COM (порт 3478) - STUN через TCP
_stun._udp.EXAMPLE.COM (порт 3478) - STUN через UDP
_stuns._tcp.EXAMPLE.COM (порт 5349) - шифрованный STUN через TCP
_turn._tcp.EXAMPLE.COM (порт 3478) - TURN через TCP
_turn._udp.EXAMPLE.COM (порт 3478) - TURN через UDP
_turns._tcp.EXAMPLE.COM (порт 5349) - шифрованный TURN через TCP
Во всех случаях target'ом для записей служит наш алиас из первого пункта.
Для продвинутых

Вот как выглядят записи для данного сервера в админке бесплатного DNS-провайдера Hurricane Electric:

Jabber srv.png

Сертификаты[править]

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

Для работы с сертификатами от Let's Encrypt в Debian есть специальный пакет - certbot, поэтому установите его следующей командой:

sudo apt-get install certbot

Сертификаты от Let's Encrypt выдаются сроком на 3 месяца, поэтому в конце этого срока их нужно обновлять. Для подтверждения владения доменом, а также для автоматизации обновления сертификатов в дальнейшем со стороны Let's Encrypt делается запрос на веб-сервер для указанного домена, поэтому для полноценной работы стоит установить какой-нибудь популярный вариант и прописать там виртуальные хосты для нашего jabber-сервера, а также сервисов на нем (сертификаты будут делаться в том числе для сервисов). Пример конфигурации веб-сервера Apache для данного сервера:

apache_to_jabber_service_domains.conf

В каталогах сервера не обязательно должен быть какой-то контент, хотя, например, на основном домене можно разместить какую-то страничку, посвященную jabber-серверу, а на поддомене conference разместить чат-логи конференций. Субдомен upload можно приспособить под загружаемые через HTTP Upload файлы, чтобы в дальнейшем их раздавал веб-сервер[4].

После всех приготовлений[5] создайте все необходимые сертификаты. Для этого воспользуйтесь следующими командами (выполнять надо от пользователя root):

certbot certonly --webroot --webroot-path /var/www/EXAMPLE.COM/htdocs/ -d EXAMPLE.COM --rsa-key-size 4096
certbot certonly --webroot --webroot-path /var/www/conference.EXAMPLE.COM/htdocs/ -d conference.EXAMPLE.COM --rsa-key-size 4096
certbot certonly --webroot --webroot-path /var/www/upload.EXAMPLE.COM/htdocs/ -d upload.EXAMPLE.COM --rsa-key-size 4096
certbot certonly --webroot --webroot-path /var/www/pubsub.EXAMPLE.COM/htdocs/ -d pubsub.EXAMPLE.COM --rsa-key-size 4096
certbot certonly --webroot --webroot-path /var/www/proxy.EXAMPLE.COM/htdocs/ -d proxy.EXAMPLE.COM --rsa-key-size 4096

В параметрах после --webroot-path указывается каталог веб-сервера для данного домена, а после -d - сам домен.

После успешного выполнения команд будет выдана информация о созданном сертификате, в том числе 2 файла - цепочка ключей и приватный ключ - сохраните эти пути для дальнейшего использования, они нам еще пригодятся. Всего получится 10 файлов. certbot обновляет сертификаты автоматически, если срок их истечения составляет менее 30 дней - т.е., обновление происходит раз в 2 месяца.

Так как Prosody работает от своего пользователя и не имеет доступа к сертификатам, созданным certbot от рута, то надо каким-то образом предоставить серверу доступ к сертификатам. Самым простым и корректным вариантом на сейчас является выполнение следующей команды от рута[6]:

prosodyctl --root cert import /etc/letsencrypt/live

В дальнейшем эту команду можно использовать после каждого обновления сертификатов - например, указав ее в качестве deploy hook для certbot.

Установка и настройка Prosody[править]

Все подготовительные процедуры завершены, теперь можно приступать непосредственно к установке и настройке своего jabber-сервера. Для поддержки звонков потребуется еще STUN/TURN-сервер - в качестве него будем использовать Coturn. В Debian установить Prosody с поддержкой MySQL[1] и Coturn можно командой

apt-get install prosody coturn lua-dbi-mysql

Примечание: на момент написания статьи самая последняя версия Prosody - 0.12.4 - доступна в репозитории backports. Чтобы установить сервер оттуда - добавьте к команде выше ключ -t bookworm-backports (само-собой, репозиторий должен быть прописан в /etc/apt/sources.list).

Настройку начнем с Coturn - она очень простая и сводится к включению сервиса в файле /etc/default/coturn опции TURNSERVER_ENABLED=1, а также приведению конфиг-файла /etc/turnserver.conf к такому виду:

/etc/turnserver.conf

Фактически, изменения в конфиге сводятся по-большей части к следующему:

  • Указываем прослушиваемые порты - они должны быть такие же, как были указаны в SRV-записях в DNS.
  • Включаем use-auth-secret и указываем придуманный ключ-пароль - его мы потом укажем в конфиг-файле у Prosody.
  • Указываем realm - домен и сертификат с ключом для него.

Да, так как Coturn не может напрямую прочитать сертификаты из каталога Let's Encrypt - для правильной работы можно создать отдельный каталог, куда копировать сертификаты с нужными правами. В примере выше это /etc/turncerts. Команду копирования и изменения прав можно объединить в одном скрипте с командой копирования сертификатов для Prosody и вызывать этот скрипт в качестве deploy hook для Let's Encrypt (или просто по Cron'у, например, раз в неделю).

Закончив правку конфиг-файла, перезапускаем TURN-сервер:

systemctl restart coturn.service

Теперь переходим к настройке Prosody. Как уже говорилось, под него есть множество разнообразных модулей. Для удобства добавления модулей добавьте следующие пакеты:

apt-get install luarocks liblua5.4-dev lua-luaossl --no-install-recommends

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

prosodyctl install --server=https://modules.prosody.im/rocks/ mod_admin_web # Поддержка WEB-интерфейса для управления сервером
prosodyctl install --server=https://modules.prosody.im/rocks/ mod_vcard_muc # Поддержка vCard для конференций
prosodyctl install --server=https://modules.prosody.im/rocks/ mod_muc_moderation # Модерирование конференций и возможность удалять спам
prosodyctl install --server=https://modules.prosody.im/rocks/ mod_cloud_notify # Поддержка PUSH-уведомлений
prosodyctl install --server=https://modules.prosody.im/rocks/ mod_cloud_notify_extensions # Дополнительные модули для PUSH
prosodyctl install --server=https://modules.prosody.im/rocks/ mod_register_web # Поддержка регистрации через веб-страницу
prosodyctl install --server=https://modules.prosody.im/rocks/ mod_mam_adhoc # Возможность управлять настройками MAM-архива из jabber-клиента
prosodyctl install --server=https://modules.prosody.im/rocks/ mod_throttle_presence # Ограничиваем трафик статусов
prosodyctl install --server=https://modules.prosody.im/rocks/ mod_reload_modules # Ставим для возможности обновлять сертификаты без перезагрузки

Конфигурационный файл у Prosody состоит из нескольких секций:

  • Общие параметры
  • Параметры виртуал-хоста
  • Параметры сервисов.

Для удобства то, что относится к виртуал-хосту и его сервисам, вынесено в отдельный файл. Для включения нужного виртуал-хоста поместите симлинк на его конфиг в /etc/prosody/conf.d.

/etc/prosody/prosody.cfg.lua
Виртуал хост /etc/prosody/conf.avail/EXAMPLE.COM.cfg.lua

Файл конфигурации Prosody очень хорошо комментирован, поэтому рассмотрим ключевые моменты, а также опции, добавленные для дополнительно установленных модулей.

  • Первым в конфиг-файле идет Jabber ID будущего администратора - ему будут доступны команды управления сервером, а также будут присылаться различные уведомления.
  • В plugin_paths добавляется путь к каталогу с устанавливаемыми плагинами.
  • Далее идет обширный список модулей. Рассмотрим некоторые:
    • turn_external позволит нам подключить настроенный ранее Coturn к Prosody для работы звонков.
    • cloud_notify включит поддержку PUSH-уведомлений.
    • register_web включает регистрацию через веб-страницу. Она доступна по адресу https://EXAMPLE.COM:5281/register_web. Штатно тут включена простенькая CAPTCHA, но можно использовать reCaptcha, для этого дополнительно необходимо будет указать ключи для этого сервиса.
    • admin_adhoc позволит выполнять ряд команд на сервере с JID'а администратора из тех клиентов, которые умеют Ad-Hoc.
  • Далее следуют настройки, в которых можно усилить или ослабить проверки сертификатов для других серверов.
  • Следующей ключевой настройкой будет указание сервера баз данных. Как мы уже условились выше, для хранения данных сервера будем использовать MySQL или MariaDB. Prosody имеет весьма простую структуру базы и встроенную схему, поэтому дополнительных действий не требуется.
  • В archive_expires_after можем указать, как скоро нужно чистить архив сообщений для MAM. Для конференций есть отдельная настройка, она будет описана ниже.
  • В turn_external_host и turn_external_secret указывается адрес Coturn и тот самый ключ, который прописывали в /etc/turnserver.conf.
  • Далее - несколько опций касательно безопасности:
    • c2s_direct_tls_ports и s2s_direct_tls_ports включает работу с TLS-портами - они должны быть те же, что указывались в SRV-записях в DNS.
    • c2s_require_encryption и s2s_require_encryption означает использование исключительно шифрованных соединений между серверами, а также между сервером и клиентом.
    • tls_profile настраивает перечень шифров и протоколов, которые может использовать Prosody.
  • В contact_info можно перечислить контакты администратора и, например, адрес конференции поддержки сервера.
  • external_services описывает сервисы, которые предоставляет Coturn.

На этом настройка основной части завершена и далее идет настройка виртуальных хостов и их сервисов:

  • В секции VirtualHost идет указание SSL-сертификатов для домена, а также разрешение регистрации через jabber-клиент и включение веб-интерфейса для управления сервером, который доступен по адресу https://example.com:5281/admin.
  • invites и сопутствующие ему модули позволяют сделать регистрацию по приглашениям. Однако есть одно но (на сейчас): это отключит обычную регистрацию. Поэтому какой вариант оставить - решайте сами.

Далее перечисляется несколько компонентов - сервисов для данного сервера. В показанном примере это конференции, proxy, HTTP Upload и pubsub. Для каждого из них указывается своя пара сертификатов и ключей.

  • Для proxy можно указать субдомен, на котором он будет доступен, а опция proxy65_acl перечисляет домены, которые смогут передавать файлы через этот прокси.
  • Для конференций включается поддержка MAM и модерирования. В опциях задается включение MAM по-умолчанию, время устаревания MAM-архива, а также правила доступа на создание новых конференций.
  • Для модуля http_file_share перечисляются лимиты на размеры одиночных файлов, а также общий размер хранилища и время устаревания загруженных файлов. Для Prosody сделано несколько реализаций HTTP Upload - например, можно переключиться на mod_http_upload, если mod_http_file_share чем-то не устроит или вообще использовать внешний сервис через http_upload_external.

Закончив правку файлов конфигурации - перезапустите Prosody:

systemctl restart prosody

Теперь можете создать пользователя-администратора:

prosodyctl adduser admin@EXAMPLE.COM

А также проверить корректность конфигурации следующими командами:

prosodyctl check config
prosodyctl check certs
prosodyctl check turn

Во всех случаях в конце команда должна возвращать "All checks passed, congratulations!". Сервер готов к использованию!

Сноски[править]

  1. Перейти обратно: 1,0 1,1 На самом деле выбор MySQL обусловлен с одной стороны ее популярностью на веб-хостингах, с другой - возможностью хранить большие объемы данных, которые могут потребоваться, если вы хотите хранить, например, архив сообщений за длительное время. Однако если таких планов нет и это будет сервер для одного или нескольких человек со скромными запросами - то вполне можно обойтись Sqlite.
  2. Да, если планируется использовать, например, конференции исключительно локально, то можно обойтись и без DNS-записей - сервер и так знает, куда ему подключаться, так как он этот сервис и предоставляет. Но если хочется полноценный сервис, с которым смогут взаимодействовать и другие сервера - то все же потребуются указанные записи в DNS.
  3. https://prosody.im/doc/turn
  4. В таком случае ему нужно обеспечить доступ к каталогу /var/lib/prosody/upload*, плюс обеспечить нужные права веб-серверу, чтобы он мог читать файлы, загруженные через jabber-сервер. Альтернативный вариант - использовать веб-сервер, обслуживающий домен upload.EXAMPLE.COM в качестве прокси и заворачивающий все запросы на https://upload.EXAMPLE.COM:5281/file_share/. Такое решение имеет еще одно преимущество: разнообразные клиенты (не только Jabber) будут гораздо охотнее показывать превью для обычных HTTP/HTTPS-ссылок (т.е., на 80 или 443-м порту), а не тех, где контент отдается на "необычном" порту - вроде 5281 в данном примере.
  5. Более подробно можно почитать тут: Свой сервер: подготовка веб-сервера и сертификатов
  6. https://prosody.im/doc/letsencrypt

Ссылки[править]