Редактирование: Свой сервер: подробное руководство по установке 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-адреса - закомментируйте соответствующие блоки.

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

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

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

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