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

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

Внимание: Вы не вошли в систему. Ваш IP-адрес будет общедоступен, если вы запишете какие-либо изменения. Если вы войдёте или создадите учётную запись, её имя будет использоваться вместо IP-адреса, наряду с другими преимуществами.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий ниже, чтобы убедиться, что это нужная вам правка, и запишите страницу ниже, чтобы отменить правку.

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


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


# Для удобства, чтобы в случае миграции сервера с одного IP на другой не приходилось переписывать все записи, стоит завести для него субдомен, который будет ссылаться на нужный IP с помощью А-записи (или 2 таких субдомена в случае использования IPv4+IPv6 - один с A-записью, а второй с AAAA), а все остальные записи сделать CNAME-алиасами для него. Например, для данного сервера ('''jabberworld.info''') сделаны 2 субдомена '''xmpp.jabberworld.info''', ссылающиеся на IPv4 и IPv6-адреса.
# Для удобства, чтобы в случае миграции сервера с одного IP на другой не приходилось переписывать все записи, стоит завести для него субдомен, который будет ссылаться на нужный IP с помощью А-записи (или 2 таких субдомена в случае использования IPv4+IPv6 - один с A-записью, а второй с AAAA), а все остальные записи сделать CNAME-алиасами для него. Например, для данного сервера ('''jabberworld.info''') сделаны 2 субдомена '''xmpp.jabberworld.info''', ссылающиеся на IPv4 и IPv6-адреса.
# Создаем субдомены для необходимых сервисов сервера<ref>Да, если планируется использовать, например, конференции исключительно локально, то можно обойтись и без DNS-записей - сервер и так знает, куда ему подключаться, так как он этот сервис и предоставляет. Но если хочется полноценный сервис, с которым смогут взаимодействовать и другие сервера - то все же потребуются указанные записи в DNS.</ref> - '''conference''' (для [[Конференции|конференций]]), '''proxy''' (прокси для прямой [[Передача файлов|передачи файлов]]), '''pubsub''' (сервисы типа "Публикация/подписка", где может сохраняться самая разная информация) и '''upload''' (сервис для [[Передача файлов|передачи файлов]] через HTTP Upload). Все эти записи создаем как CNAME на наш субдомен из 1-го пункта.
# Создаем субдомены для необходимых сервисов сервера - '''conference''' (для [[Конференции|конференций]]), '''proxy''' (прокси для прямой [[Передача файлов|передачи файлов]]), '''pubsub''' (сервисы типа "Публикация/подписка", где может сохраняться самая разная информация) и '''upload''' (сервис для [[Передача файлов|передачи файлов]] через HTTP Upload). Все эти записи создаем как CNAME на наш субдомен из 1-го пункта.
# Создаем ряд SRV-записей для нашего основного домена - они показывают, где именно какой сервис находится. Конечно, если у вас все на одном адресе, то будет работать и так, но мы ведь решили все делать правильно, верно? Итак, нужны такие SRV-записи:
# Создаем ряд SRV-записей для нашего основного домена - они показывают, где именно какой сервис находится. Конечно, если у вас все на одном адресе, то будет работать и так, но мы ведь решили все делать правильно, верно? Итак, нужны такие SRV-записи:


:: '''_xmpp-client._tcp.EXAMPLE.COM''' (порт '''5222''') - чтобы указать, куда подключаться [[Клиенты Jabber|jabber-клиенту]]
:: '''_xmpp-client._tcp.EXAMPLE.COM''' (порт '''5222''') - чтобы указать, куда подключаться [[Клиенты Jabber|jabber-клиенту]]
:: '''_xmpps-client._tcp.EXAMPLE.COM''' (порт '''5223''') - аналогичная запись для [https://xmpp.org/extensions/xep-0368.html TLS-подключений клиентов]
:: '''_xmpps-client._tcp.EXAMPLE.COM''' (порт '''5223''') - аналогичная запись для TLS-подключений клиентов
:: '''_xmpp-server._tcp.EXAMPLE.COM''' (порт '''5269''') - чтобы указать, куда подключаться [[Публичные серверы Jabber|jabber-серверу]]
:: '''_xmpp-server._tcp.EXAMPLE.COM''' (порт '''5269''') - чтобы указать, куда подключаться [[Публичные серверы Jabber|jabber-серверу]]
:: '''_xmpps-server._tcp.EXAMPLE.COM''' (порт '''5270''') - аналогичная запись для [https://xmpp.org/extensions/xep-0368.html TLS-подключений серверов].
:: '''_xmpps-server._tcp.EXAMPLE.COM''' (порт '''5270''') - аналогичная запись для TLS-подключений серверов.


:: Записи ниже служат для работы сервиса аудио/видеозвонков через jabber<ref name="avcalls">https://www.process-one.net/blog/how-to-set-up-ejabberd-video-voice-calling/</ref>. Для максимальной совместимости будем использовать как [[ru_wikipedia:STUN|STUN]], так и [[ru_wikipedia:Traversal Using Relay NAT|TURN]] - все возможные варианты:
:: Записи ниже служат для работы сервиса аудио/видеозвонков через jabber<ref name="avcalls">https://www.process-one.net/blog/how-to-set-up-ejabberd-video-voice-calling/</ref>:


:: '''_stun._tcp.EXAMPLE.COM''' (порт '''3478''') - [[ru_wikipedia:STUN|STUN]] через [[ru_wikipedia:TCP|TCP]]
:: '''_stun._tcp.EXAMPLE.COM''' (порт '''3478''') - [[ru_wikipedia:STUN|STUN]] через [[ru_wikipedia:TCP|TCP]]
Строка 30: Строка 30:


:: Во всех случаях target'ом для записей служит наш алиас из первого пункта.
:: Во всех случаях target'ом для записей служит наш алиас из первого пункта.
{{Hider hiding|
|title=Для продвинутых
|content=
:: Самый полный вариант подразумевает в том числе создание SRV-записей для каждого из сервисов-субдоменов - тех, к которым будут подключаться сторонние серверы. Например, для конференций это может выглядеть так:


:: '''_xmpp-server._tcp.conference.EXAMPLE.COM''' (порт '''5269''')
:: '''_xmpps-server._tcp.conference.EXAMPLE.COM''' (порт '''5270''' для TLS)
:: Но, как уже говорилось выше, это для совсем уж необычных конфигураций - когда сам домен указывает на один адрес (например, там может работать веб-сервер, предоставляющий чат-логи на сайте https://conference.example.com), а сам jabber-сервер при этом находится совершенно на другом.
}}
Вот как выглядят записи для данного сервера в админке бесплатного DNS-провайдера [https://dns.he.net Hurricane Electric]:
Вот как выглядят записи для данного сервера в админке бесплатного DNS-провайдера [https://dns.he.net Hurricane Electric]:


Строка 91: Строка 82:
В каталогах сервера не обязательно должен быть какой-то контент, хотя, например, на основном домене можно разместить какую-то страничку, посвященную jabber-серверу, а на поддомене '''conference''' разместить чат-логи [[Конференции|конференций]]. Субдомен '''upload''' можно приспособить под загружаемые через HTTP Upload файлы, чтобы в дальнейшем их раздавал веб-сервер<ref name="http_upload"></ref>.
В каталогах сервера не обязательно должен быть какой-то контент, хотя, например, на основном домене можно разместить какую-то страничку, посвященную jabber-серверу, а на поддомене '''conference''' разместить чат-логи [[Конференции|конференций]]. Субдомен '''upload''' можно приспособить под загружаемые через HTTP Upload файлы, чтобы в дальнейшем их раздавал веб-сервер<ref name="http_upload"></ref>.


После всех приготовлений<ref>Более подробно можно почитать тут: [[Свой сервер: подготовка веб-сервера и сертификатов]]</ref> создайте все необходимые сертификаты. Для этого воспользуйтесь следующими командами (выполнять надо от пользователя '''root'''):
После всех приготовлений создайте все необходимые сертификаты. Для этого воспользуйтесь следующими командами (выполнять надо от пользователя '''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/EXAMPLE.COM/htdocs/ -d EXAMPLE.COM
  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/conference.EXAMPLE.COM/htdocs/ -d conference.EXAMPLE.COM
  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/upload.EXAMPLE.COM/htdocs/ -d upload.EXAMPLE.COM
  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/pubsub.EXAMPLE.COM/htdocs/ -d pubsub.EXAMPLE.COM
  certbot certonly --webroot --webroot-path /var/www/proxy.EXAMPLE.COM/htdocs/ -d proxy.EXAMPLE.COM --rsa-key-size 4096
  certbot certonly --webroot --webroot-path /var/www/proxy.EXAMPLE.COM/htdocs/ -d proxy.EXAMPLE.COM


В параметрах после '''--webroot-path''' указывается каталог веб-сервера для данного домена, а после '''-d''' - сам домен.
В параметрах после '''--webroot-path''' указывается каталог веб-сервера для данного домена, а после '''-d''' - сам домен.
Строка 134: Строка 125:
  sudo apt-get install erlang-p1-mysql
  sudo apt-get install erlang-p1-mysql


[[Свой сервер: подготовка базы данных|Создайте базу для jabber-сервера]], после чего импортируйте туда схему базы из '''/usr/share/ejabberd/sql/mysql.sql''' <ref name="ejabberd_mysql"></ref>.
Создайте базу для jabber-сервера, после чего импортируйте туда схему базы из '''/usr/share/ejabberd/sql/mysql.sql''' <ref name="ejabberd_mysql"></ref>.


Далее приводится пример конфигурации jabber-сервера. Рассмотрим его подробнее.
Далее приводится пример конфигурации jabber-сервера. Рассмотрим его подробнее.
Строка 211: Строка 202:
   'TLS_OPTIONS':
   'TLS_OPTIONS':
     - "no_sslv3"
     - "no_sslv3"
    - "no_tlsv1"
#    - "no_tlsv1"
    - "no_tlsv1_1"
#    - "no_tlsv1_1"
     - "cipher_server_preference"
     - "cipher_server_preference"
     - "no_compression"
     - "no_compression"
Строка 426: Строка 417:
     - normal
     - normal
   s2s_shaper: fast
   s2s_shaper: fast
  soft_upload_quota:
    - 1000: admin
    - 250
  hard_upload_quota:
    - 1000: admin
    - 250


modules:
modules:
Строка 483: Строка 468:
   db_type: sql
   db_type: sql
   assume_mam_usage: true
   assume_mam_usage: true
   default: always
   default: roster
   compress_xml: true
   compress_xml: true
   use_cache: true
   use_cache: true
Строка 541: Строка 526:
     welcome_message:
     welcome_message:
     subject: "Добро пожаловать на Jabber-сервер!"
     subject: "Добро пожаловать на Jabber-сервер!"
     body: "Приветствую. Ведите себя хорошо. Доступен веб-клиент ConverseJS по адресу https://xmpp.EXAMPLE.COM. Лимит на загружаемые файлы - 100 МБ, общий размер - 250 МБ. Срок хранения - 180 дней."
     body: "Приветствую. Ведите себя хорошо. Доступен веб-клиент ConverseJS по адресу https://xmpp.EXAMPLE.COM. Лимит на загружаемые файлы - 100 МБ. Срок хранения - 180 дней."
   mod_roster:
   mod_roster:
     versioning: true
     versioning: true
Строка 639: Строка 624:
host_config:
host_config:
  "EXAMPLE.COM":
  "EXAMPLE.COM":
   sql_database: "jabber_example_com"
   sql_database: "JABBERDB"


sql_username: "jabberuser"
sql_username: "DBUSER"
sql_password: "MYSECRETPASSWORD"
sql_password: "SUPERPASSWORD"
sql_port: 3306
sql_port: 3306


Строка 661: Строка 646:
* После настроек шейпера идет довольно объемное описание различных модулей. Из интересного:
* После настроек шейпера идет довольно объемное описание различных модулей. Из интересного:
** В '''server-info''' для '''mod_disco''' можно указать контакты администратора сервера, техподдержки или просто дополнительную информацию.
** В '''server-info''' для '''mod_disco''' можно указать контакты администратора сервера, техподдержки или просто дополнительную информацию.
** В '''mod_http_upload''' можно указать адрес, с которого будут отдаваться загруженные на сервер через HTTP Upload файлы. При желании можно использовать не встроенный веб-сервер, а тот, что был настроен для получения сертификатов<ref name="http_upload">В таком случае ему нужно обеспечить доступ к каталогу '''/var/lib/ejabberd/upload/''' - а лучше указать опцию '''docroot''' с путем за пределами домашнего каталога ejabberd, плюс воспользоваться опцией '''file_mode''', чтобы файлы, созданные ejabberd, могли быть доступны для веб-сервера. Такое решение имеет еще одно преимущество: разнообразные клиенты (не только Jabber) будут гораздо охотнее показывать превью для обычных HTTP/HTTPS-ссылок (т.е., на 80 или 443-м порту), а не тех, где контент отдается на "необычном" порту - вроде 5283 в данном примере.</ref>. Чуть ниже этой опции есть настройка времени устаревания файлов - в примере выше это 180 дней. Если у вас мало места на сервере, то можно поставить это значение поменьше. Кроме того, в разделе '''shaper_rules''' дополнительно можно указать '''*_upload_quota'''<ref name="quota"></ref> - лимит на общий объем файлов пользователя<ref>При необходимости можно добавить нужные категории пользователей в разделе '''acl''' по аналогии с теми, что уже там есть (admin, local и так далее). Например, можно добавить группу VIP, которой выделить больше места для загрузки файлов, чем обычным пользователям, но меньше, чем админу</ref>, выше которого старые файлы начнут удаляться<ref name="quota">Удаляются они при достижении '''hard quota''', а перестают удаляться при снижении до '''soft quota'''. Т.е., если хочется сохранить максимум файлов на доступном месте - просто поставьте оба значения одинаковыми</ref>.
** В '''mod_http_upload''' можно указать адрес, с которого будут отдаваться загруженные на сервер через HTTP Upload файлы. При желании можно использовать не встроенный веб-сервер, а тот, что был настроен для получения сертификатов<ref name="http_upload">В таком случае ему нужно обеспечить доступ к каталогу '''/var/lib/ejabberd/upload/''' - а лучше указать опцию '''docroot''' с путем за пределами домашнего каталога ejabberd, плюс воспользоваться опцией '''file_mode''', чтобы файлы, созданные ejabberd, могли быть доступны для веб-сервера</ref>. Чуть ниже этой опции есть настройка времени устаревания файлов - в примере выше это 180 дней. Если у вас мало места на сервере, то можно поставить это значение поменьше.
** Аналогичным образом можно поступить с '''mod_muc_log''' - модулем, позволяющим вести логи конференций (при включении соответствующей опции в настройках этой конференции). В примере выше файлы просто складываются в определенный каталог, а дальше их уже раздает веб-сервер.
** Аналогичным образом можно поступить с '''mod_muc_log''' - модулем, позволяющим вести логи конференций (при включении соответствующей опции в настройках этой конференции). В примере выше файлы просто складываются в определенный каталог, а дальше их уже раздает веб-сервер.
** Для модуля '''proxy65''' не забудьте указать внешний адрес сервера.
** Для модуля proxy65 не забудьте указать внешний адрес сервера.
** Если хотите получать уведомления о новых регистрациях - обратите внимание на параметр '''registration_watchers''' в секции '''mod_register'''. Тут в том числе можно запретить регистрацию пользователей вообще или ограничить ее определенными адресами (например, локальной сетью), а также задать приветственное сообщение, отправляемое каждому новому пользователю.
** Если хотите получать уведомления о новых регистрациях - обратите внимание на параметр '''registration_watchers''' в секции '''mod_register'''. Тут в том числе можно запретить регистрацию пользователей вообще или ограничить ее определенными адресами (например, локальной сетью), а также задать приветственное сообщение, отправляемое каждому новому пользователю.
** Ниже идет большой блок параметров STUN/TURN-сервера. Укажите внешние IP-адреса сервера и обслуживаемый домен; если у сервера нет IPv6-адреса - закомментируйте соответствующие блоки.
** Ниже идет большой блок параметров STUN/TURN-сервера. Укажите внешние IP-адреса сервера и обслуживаемый домен; если у сервера нет IPv6-адреса - закомментируйте соответствующие блоки.
** Предпоследней настройкой в секции модулей идет настройка веб-клиента ConverseJS. В ejabberd 21.12 настройки весьма базовые, но над этим модулем активно идет работа<ref name="conversejs">Если вам важна данная функция - рекомендую обратить внимание на более новую версию сервера - например, на 22.05</ref>. В минимальном варианте конфигурации можно просто указать Websocket-адрес для подключения к серверу (мы его объявляли в секции '''Listen'''). Можно даже не указывать файлы ConverseJS - по умолчанию они могут загружаться напрямую [https://conversejs.org с сайта ConverseJS]. Но если хочется большей автономности, то можно сделать так, чтобы их отдавал свой сервер. В свою очередь не обязательно их отдавать через встроенный в ejabberd веб-сервер - для этого можно использовать тот, что настроен для сертификатов - в этом есть даже определенные преимущества: например, файлы могут прозрачно сжиматься перед передачей клиенту, что обеспечит более быструю загрузку интерфейса ConverseJS. Если же хочется более продвинутой конфигурации ConverseJS (например, анонимный чат на сайте для работы техподдержки), то это делается передачей опций через специальную индексную страницу, но это уже выходит за рамки данного руководства.
** Предпоследней настройкой в секции модулей идет настройка веб-клиента ConverseJS. В ejabberd 21.12 настройки весьма базовые, но над этим модулем активно идет работа<ref name="conversejs">Если вам важна данная функция - рекомендую обратить внимание на более новую версию сервера - например, на 22.05</ref>. В минимальном варианте конфигурации можно просто указать Websocket-адрес для подключения к серверу (мы его объявляли в секции '''Listen'''). Можно даже не указывать файлы ConverseJS - по умолчанию они могут загружаться напрямую [https://conversejs.org с сайта ConverseJS]. Но если хочется большей автономности, то можно сделать так, чтобы их отдавал свой сервер. В свою очередь не обязательно их отдавать через встроенный в ejabberd веб-сервер - для этого можно использовать тот, что настроен для сертификатов - в этом есть даже определенные преимущества: например, файлы могут прозрачно сжиматься перед передачей клиенту, что обеспечит более быструю загрузку интерфейса ConverseJS. Если же хочется более продвинутой конфигурации ConverseJS (например, анонимный чат на сайте для работы техподдержки), то это делается передачей опций через специальную индексную страницу, но это уже выходит за рамки данного руководства.
* Ну и последними опциями, требующими вмешательства, являются параметры подключения к созданной ранее базе данных. Если используется несколько виртуальных хостов для ejabberd - можно указать несколько баз через опцию '''host_config'''<ref  name="ejabberd_mysql">У ejabberd есть 2 варианта конфигурации с внешней базой: с указанием хоста внутри базы для всех значений (и таким образом повышенным расходом места для больших серверов) и без указания (и требующим отдельные базы для каждого виртуального хоста - этот вариант и рассмотрен в данном руководстве)</ref>.
** Ну и последними опциями, требующими вмешательства, являются параметры подключения к созданной ранее базе данных. Если используется несколько виртуальных хостов для ejabberd - можно указать несколько баз через опцию '''host_config'''<ref  name="ejabberd_mysql">У ejabberd есть 2 варианта конфигурации с внешней базой: с указанием хоста внутри базы для всех значений (и таким образом повышенным расходом места для больших серверов) и без указания (и требующим отдельные базы для каждого виртуального хоста - этот вариант и рассмотрен в данном руководстве)</ref>.


Фактически, после указания домена и IP-адресов, сертификатов, [[Jabber ID]] админа и параметров подключения к базе сервер готов к использованию. Запустите сервер, после чего создайте учетную запись администратора - сделать это можно либо в [[Клиенты Jabber|jabber-клиенте]], либо в консоли с использованием '''ejabberdctl'''. В дальнейшем управлять сервером можно по адресу [https://EXAMPLE.COM:5281/admin https://EXAMPLE.COM:5281/admin] - само собой, подставьте в данном случае свой домен.
Фактически, после указания домена и IP-адресов, сертификатов, [[Jabber ID]] админа и параметров подключения к базе сервер готов к использованию. Запустите сервер, после чего создайте учетную запись администратора - сделать это можно либо в [[Клиенты Jabber|jabber-клиенте]], либо в консоли с использованием '''ejabberdctl'''. В дальнейшем управлять сервером можно по адресу [https://EXAMPLE.COM:5281/admin https://EXAMPLE.COM:5281/admin] - само собой, подставьте в данном случае свой домен.
Если вы хотите удалять старые сообщения из базы данных сервера - воспользуйтесь следующей командой, помещенной в cron:
/usr/sbin/ejabberdctl delete_old_mam_messages all 30
где 30 - число дней, за которые надо хранить историю.


На этом все :)
На этом все :)

Обратите внимание, что все добавления и изменения текста статьи рассматриваются как выпущенные на условиях лицензии GNU Free Documentation License 1.2 (см. Мир Jabber:Авторские права). Если вы не хотите, чтобы ваши тексты свободно распространялись и редактировались любым желающим, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого.
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ МАТЕРИАЛЫ, ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ!

В целях защиты вики от автоматического спама в правках просим вас решить следующую каптчу:

Отменить Справка по редактированию (в новом окне)

Шаблон, используемый на этой странице: