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

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

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

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

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

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

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

  1. Для удобства, чтобы в случае миграции сервера с одного IP на другой не приходилось переписывать все записи, стоит завести для него субдомен, который будет ссылаться на нужный IP с помощью А-записи (или 2 таких субдомена в случае использования IPv4+IPv6 - один с A-записью, а второй с AAAA), а все остальные записи сделать CNAME-алиасами для него. Например, для данного сервера (jabberworld.info) сделаны 2 субдомена xmpp.jabberworld.info, ссылающиеся на IPv4 и IPv6-адреса.
  2. Создаем субдомены для необходимых сервисов сервера[1] - 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[2]. Для максимальной совместимости будем использовать как 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 файлы, чтобы в дальнейшем их раздавал веб-сервер[3].

После всех приготовлений[4] создайте все необходимые сертификаты. Для этого воспользуйтесь следующими командами (выполнять надо от пользователя 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 месяца.

Так как ejabberd работает от своего пользователя и не имеет доступа к сертификатам, созданным certbot от рута, то надо каким-то образом предоставить доступ ejabberd'у к сертификатам. Делать это можно по-разному - кто-то, например, меняет права на созданные сертификаты и добавляет возможность ejabberd'у получать доступ к нужным файлам - правда, эти права сбрасываются после каждого обновления сертификатов. В моем случае я создал для ejabberd отдельный каталог - /etc/ejabberd/certs, куда копируются созданные сертификаты и уже там даются права для jabber-сервера.

lets-hook.sh

Настройка ejabberd[править]

Все подготовительные процедуры завершены, теперь можно приступать непосредственно к установке и настройке своего jabber-сервера. В Debian установить ejabberd можно командой

sudo apt-get install ejabberd

Зачастую самая свежая версия может находиться в backports, поэтому при необходимости можно указать конкретный репозиторий из вашего /etc/apt/sources.list с помощью ключа -t - например, -t bullseye-backports. Кроме того, с недавних пор у ejabberd появился официальный DEB и RPM-репозиторий - подробнее об этом можно почитать по этой ссылке.

Штатно ejabberd использует собственную базу данных - Mnesia. Ее объем ограничен 2 ГБ, поэтому если планируется большое количество пользователей, большие объемы сообщений или просто хочется использовать удобные популярные инструменты для работы с привычной вам базой - я бы рекомендовал использовать внешнюю базу данных - например, MySQL или MariaDB. Я так и поступил, тем более сделать это весьма просто - кроме ejabberd просто установите еще пакет erlang-p1-mysql командой

sudo apt-get install erlang-p1-mysql

Создайте базу для jabber-сервера, после чего импортируйте туда схему базы из /usr/share/ejabberd/sql/mysql.sql [5][6].

Далее приводится пример конфигурации jabber-сервера. Рассмотрим его подробнее.

ejabberd.yml
  • Первым делом указывается один или несколько хостов, которые будет обслуживать сервер - в конфигурационном файле выше он указан как EXAMPLE.COM.
  • Далее надо указать перечень файлов сертификатов, которые мы создали раньше.
  • Секция Listen описывает порты, которые слушает сервер. Тут перечисляются порты для STUN/TURN (3478) и их шифрованных аналогов (5349); порты для подключения клиентов (5222 и 5223) и серверов (5269 и 5270), а также ряд дополнительных портов. К ним относятся порты для админ-панели сервера (5281), веб-страницы для регистрации пользователей (5282), а также подключений к серверу через Websocket или BOSH и загрузка файлов через HTTP Upload (5283) - я постарался разнести различные сервисы по разным портам, чтобы в дальнейшем было проще, например, ограничить доступ к админ-панели определенными адресами, не блокируя при этом доступ к остальным функциям. Еще одним полезным сервисом является веб-клиент ConverseJS - под него выделен порт 5000 - о нем будет написано чуть ниже. Для некоторых описанных портов необходимо указывать внешний IP-адрес сервера - это нужно, чтобы сервис знал, какой именно адрес отдавать клиентам - это относится к настройкам STUN/TURN и Proxy. В качестве шаблона в показанном конфиге указаны адреса 123.123.123.123 для IPv4 и 2a01:0123:0123:0123:: для IPv6 - если не используете IPv6, то просто закомментируйте соответствующие строки.
  • Далее необходимо указать хост, с которого будет отдаваться картинка CAPTCHA.
  • Далее указывается один или несколько администраторских аккаунтов - с помощью них можно будет попасть в веб-интерфейс администрирования, зайти в любую конференцию, а также в браузере сервисов будут доступны дополнительные административные пункты.
  • После настроек шейпера идет довольно объемное описание различных модулей. Из интересного:
    • В server-info для mod_disco можно указать контакты администратора сервера, техподдержки или просто дополнительную информацию.
    • В mod_http_upload можно указать адрес, с которого будут отдаваться загруженные на сервер через HTTP Upload файлы. При желании можно использовать не встроенный веб-сервер, а тот, что был настроен для получения сертификатов[3]. Чуть ниже этой опции есть настройка времени устаревания файлов - в примере выше это 180 дней. Если у вас мало места на сервере, то можно поставить это значение поменьше. Кроме того, в разделе shaper_rules дополнительно можно указать *_upload_quota[7] - лимит на общий объем файлов пользователя[8], выше которого старые файлы начнут удаляться[7].
    • Аналогичным образом можно поступить с mod_muc_log - модулем, позволяющим вести логи конференций (при включении соответствующей опции в настройках этой конференции). В примере выше файлы просто складываются в определенный каталог, а дальше их уже раздает веб-сервер.
    • Для модуля proxy65 не забудьте указать внешний адрес сервера.
    • Если хотите получать уведомления о новых регистрациях - обратите внимание на параметр registration_watchers в секции mod_register. Тут в том числе можно запретить регистрацию пользователей вообще или ограничить ее определенными адресами (например, локальной сетью), а также задать приветственное сообщение, отправляемое каждому новому пользователю.
    • Ниже идет большой блок параметров STUN/TURN-сервера. Укажите внешние IP-адреса сервера и обслуживаемый домен; если у сервера нет IPv6-адреса - закомментируйте соответствующие блоки.
    • Предпоследней настройкой в секции модулей идет настройка веб-клиента ConverseJS. В ejabberd 21.12 настройки весьма базовые, но над этим модулем активно идет работа[9]. В минимальном варианте конфигурации можно просто указать Websocket-адрес для подключения к серверу (мы его объявляли в секции Listen). Можно даже не указывать файлы ConverseJS - по умолчанию они могут загружаться напрямую с сайта ConverseJS. Но если хочется большей автономности, то можно сделать так, чтобы их отдавал свой сервер. В свою очередь не обязательно их отдавать через встроенный в ejabberd веб-сервер - для этого можно использовать тот, что настроен для сертификатов - в этом есть даже определенные преимущества: например, файлы могут прозрачно сжиматься перед передачей клиенту, что обеспечит более быструю загрузку интерфейса ConverseJS. Если же хочется более продвинутой конфигурации ConverseJS (например, анонимный чат на сайте для работы техподдержки), то это делается передачей опций через специальную индексную страницу, но это уже выходит за рамки данного руководства.
  • Ну и последними опциями, требующими вмешательства, являются параметры подключения к созданной ранее базе данных. Если используется несколько виртуальных хостов для ejabberd - можно указать несколько баз через опцию host_config[5].

Фактически, после указания домена и IP-адресов, сертификатов, Jabber ID админа и параметров подключения к базе сервер готов к использованию. Запустите сервер, после чего создайте учетную запись администратора - сделать это можно либо в jabber-клиенте, либо в консоли с использованием ejabberdctl. В дальнейшем управлять сервером можно по адресу https://EXAMPLE.COM:5281/admin - само собой, подставьте в данном случае свой домен.

Если вы хотите удалять старые сообщения из базы данных сервера - воспользуйтесь следующей командой, помещенной в cron:

/usr/sbin/ejabberdctl delete_old_mam_messages all 30

где 30 - число дней, за которые надо хранить историю.

На этом все :)

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

  1. Да, если планируется использовать, например, конференции исключительно локально, то можно обойтись и без DNS-записей - сервер и так знает, куда ему подключаться, так как он этот сервис и предоставляет. Но если хочется полноценный сервис, с которым смогут взаимодействовать и другие сервера - то все же потребуются указанные записи в DNS.
  2. https://www.process-one.net/blog/how-to-set-up-ejabberd-video-voice-calling/
  3. Перейти обратно: 3,0 3,1 В таком случае ему нужно обеспечить доступ к каталогу /var/lib/ejabberd/upload/ - а лучше указать опцию docroot с путем за пределами домашнего каталога ejabberd, плюс воспользоваться опцией file_mode, чтобы файлы, созданные ejabberd, могли быть доступны для веб-сервера. Такое решение имеет еще одно преимущество: разнообразные клиенты (не только Jabber) будут гораздо охотнее показывать превью для обычных HTTP/HTTPS-ссылок (т.е., на 80 или 443-м порту), а не тех, где контент отдается на "необычном" порту - вроде 5283 в данном примере.
  4. Более подробно можно почитать тут: Свой сервер: подготовка веб-сервера и сертификатов
  5. Перейти обратно: 5,0 5,1 У ejabberd есть 2 варианта конфигурации с внешней базой: с указанием хоста внутри базы для всех значений (и таким образом повышенным расходом места для больших серверов) и без указания (и требующим отдельные базы для каждого виртуального хоста - этот вариант и рассмотрен в данном руководстве)
  6. В последних версиях ejabberd (24 и новее) этот шаг не обязателен - схема создастся автоматически
  7. Перейти обратно: 7,0 7,1 Удаляются они при достижении hard quota, а перестают удаляться при снижении до soft quota. Т.е., если хочется сохранить максимум файлов на доступном месте - просто поставьте оба значения одинаковыми
  8. При необходимости можно добавить нужные категории пользователей в разделе acl по аналогии с теми, что уже там есть (admin, local и так далее). Например, можно добавить группу VIP, которой выделить больше места для загрузки файлов, чем обычным пользователям, но меньше, чем админу
  9. Если вам важна данная функция - рекомендую обратить внимание на более новую версию сервера - например, на 22.05

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