Песочница: различия между версиями

Материал из Мир Jabber
Перейти к навигацииПерейти к поиску
Строка 623: Строка 623:
* Первым делом указывается один или несколько хостов, которые будет обслуживать сервер - в конфигурационном файле выше он указан как '''EXAMPLE.COM'''.
* Первым делом указывается один или несколько хостов, которые будет обслуживать сервер - в конфигурационном файле выше он указан как '''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, то просто закомментируйте соответствующие строки.
* Секция '''Listen''' описывает порты, которые слушает сервер. Тут перечисляются порты для STUN/TURN ('''3478''') и их шифрованных аналогов ('''5349'''); порты для подключения клиентов ('''5222''' и '''5223''') и серверов ('''5269''' и '''5270'''), а также ряд дополнительных портов. К ним относятся порты для админ-панели сервера ('''5281'''), веб-страницы для регистрации пользователей ('''5282'''), а также подключений к серверу через [[ru_wikipedia:WebSocket|Websocket]] или [[wikipedia:BOSH (protocol)|BOSH]] и загрузка файлов через HTTP Upload ('''5283''') - я постарался разнести различные сервисы по разным портам, чтобы в дальнейшем было проще, например, ограничить доступ к админ-панели определенными адресами, не блокируя при этом доступ к остальным функциям. Еще одним полезным сервисом является веб-клиент ConverseJS - под него выделен порт '''5000''' - о нем будет написано чуть ниже. Для некоторых описанных портов необходимо указывать внешний IP-адрес сервера - это нужно, чтобы сервис знал, какой именно адрес отдавать клиентам - это относится к настройкам STUN/TURN и Proxy. В качестве шаблона в показанном конфиге указаны адреса '''123.123.123.123''' для IPv4 и '''2a01:0123:0123:0123::''' для IPv6 - если не используете IPv6, то просто закомментируйте соответствующие строки.
* Далее необходимо указать хост, с которого будет отдаваться картинка Captcha.
* Далее необходимо указать хост, с которого будет отдаваться картинка CAPTCHA.
* Далее указывается один или несколько администраторских аккаунтов - с помощью них можно будет попасть в веб-интерфейс администрирования, зайти в любую [[Конференции|конференцию]], а также в [[Браузер сервисов|браузере сервисов]] будут доступны дополнительные административные пункты.
* Далее указывается один или несколько администраторских аккаунтов - с помощью них можно будет попасть в веб-интерфейс администрирования, зайти в любую [[Конференции|конференцию]], а также в [[Браузер сервисов|браузере сервисов]] будут доступны дополнительные административные пункты.
* После настроек шейпера идет довольно объемное описание различных модулей. Из интересного:
* После настроек шейпера идет довольно объемное описание различных модулей. Из интересного:

Версия от 12:00, 21 августа 2022

В этой статье приводится пример конфигурирования ejabberd с поддержкой актуальных и популярных функций. В качестве основы взят конфиг-файл с работающего сервера версии 21.12, а в качестве сертификатов используется Let's Encrypt - и все это установлено на 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. Создаем субдомены для необходимых сервисов сервера - 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:
_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 файлы, чтобы в дальнейшем их раздавал веб-сервер.

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

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

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

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

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

Настройка 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.

Ниже приводится пример конфигурации 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 файлы. При желании можно использовать не встроенный веб-сервер, а тот веб-сервер, что был настроен для получения сертификатов. Чуть ниже этой опции есть настройка времени устаревания файлов - в примере выше это 180 дней. Если у вас мало места на сервере, то можно поставить это значение поменьше.
    • Аналогичным образом можно поступить с mod_muc_log - модулем, позволяющим вести логи конференций (при включении соответствующей опции в настройках этой конференции). В примере выше файлы просто складываются в определенный каталог, а дальше их уже раздает веб-сервер.
    • Для модуля proxy65 не забудьте указать внешний адрес сервера.
    • Если хотите получать уведомления о новых регистрациях - обратите внимание на параметр registration_watchers в секции mod_register. Тут в том числе можно запретить регистрацию пользователей вообще или ограничить ее определенными адресами (например, локальной сетью), а также задать приветственное сообщение, отправляемое каждому новому пользователю.
    • Ниже идет большой блок параметров STUN/TURN-сервера. Укажите внешние IP-адреса сервера и обслуживаемый домен; если у сервера нет IPv6-адреса - закомментируйте соответствующие блоки.