ejabberd2+MySQL

Случайно открыл ман по CUCM там говорят, что чатики итд это огого как нужно и если у Вас этого нет то у Вас нет и PBX. Пффф. Выбор был между Openfire и ejabberd2. Первое прожорливое, но красивое, второе на Эрланге(не прожорливое), конфиги писать в текстовый файлик, и если прочесть название статьи вы сами понимаете что я выбрал) + захотелось мне сделать поддержку ejabberd и привязать это все дело к Астериску.
1. Установка
2. Первоначальная настройка
3. Настройка
3.a Listen
3.b ACL
3.c Права доступа
3.d Шейпер
3.e Капча
3.f STUN
3.g Макросы
3.h Связь с БД
4. Подключаемые модули
!Поскольку жаббер открыл для себя первый раз в жизни, опечатки, косяки и прочее присутствуют в огромном множестве, кто заметил прошу писать.

1. Установка
1. Ставим из портов

cd /usr/ports/net-im/ejabberd/
make config-recursive
make install clean

2. Генерируем сертификат)

# cd /usr/local/etc/ejabberd/
# openssl req -new -x509 -nodes -newkey rsa:1024 -days 3650 -keyout privkey.pem -out server.pem -subj 
"/C=XX/ST=XX/L=XX/O=XX/OU=XX/CN=jabber.domen.ua/emailAddress="[email protected]
# cat privkey.pem >> server.pem 
# rm privkey.pem 
# mv server.pem ssl.pem

3. Правим inetrc

{file, resolv, "/etc/resolv.conf"}.
{lookup,["file", "dns"]}.

4. Теперь нужно создать БД и заполнить Файлик берем из distfiles и запиливаем в созданную БД.
Не забываем подключить odbc в конфиге джабера, и включить соответствующие модули(как это сделать дальше по тексту).

2. Первоначальная настройка
1.Для начала нужно создать учетку админа, для входа в веб админку:

ejabberdctl register admin jabber.domen.ua password

2. Правим ejabberd.cfg

{acl, admin, {user, "admin1", "example.org"}}.
{access, configure, [{allow, admin}]}

Права можно выдавать даже юзерам с других доменов
3. Перегружаем джабер /usr/local/etc/rc.d/ejabberd restart или ejabberdctl —node ejabberd@host restart
4. Открываем http://server:port/admin/ в браузере и входим с полным именем [email protected]
3.Настройка
При первом старте парсится конфигурационный файл, и настройки сохраняются в собственную БД джабера. В дальнейшем настройки будут браться из нее, настройки которые добавим в конф файл потом будут добавлены в базу. ejabberd никогда не изменяет конфиг файл. Изменения внесенный через админку, не будут отражены в конфиг файле, так что если хотите получить такой же сервер после рестарта даймона, сделайте изменения в конфиг файле.
Синтаксис файла:
Строки начинающиеся на % игнорируются(комменты).
Все строки завершаются .
Запись заключается в {} выражение внутри разделяется запятыми.
Для создания списка из многих параметров используется [].
Зарезервированные слова в нижнем регистре.
Строки записываются в двойных кавычках.
Каждая запись состоит из названия параметра, а все последующие значения этого параметра.
Пример содержит запись, зарезервированные слова, список и два строковых значения.
{hosts, [“jabber.example.net”, “im.example.com”]}.
Если конф файл не содержит опции ‘hosts’ , то будут использованы старые имена из базы.
Можно переопределить записи в БД, добавив в начало конфиг файла следующие строки:

override_global.
override_local.
override_acls.

Опции для кластера, локальной ноды и списки контроля доступа будут перезаписаны.
Теперь рассмотрим опции:
hosts определяет список обслуживаемых доменов.
Синтаксис:
{hosts, [HostName, …]}.
Пример:

{hosts, ["example.org"]}.
{hosts, ["example.net", "example.com", "jabber.somesite.org"]}.

host_config определяет индивидуальные настройки для каждого виртуального хоста.
Синтаксис:
{host_config, HostName, [Option, …]}
Примеры:

{host_config, "example.net", [{auth_method,   internal}]}.

{host_config, "example.com", [{auth_method,   ldap},
                              {ldap_servers,  ["localhost"]},
                              {ldap_uids,     [{"uid"}]},
                              {ldap_rootdn,   "dc=localdomain"},
                              {ldap_rootdn,   "dc=example,dc=com"},
                              {ldap_password, ""}]}.

С модулями дела обстоят сложнее,
{{add, OptionName}, OptionValue} для добавления специфического модуля к конкретному хосту.
Пример:

%% This ejabberd server has three vhosts:
{hosts, ["one.example.org", "two.example.org", "three.example.org"]}.

%% Configuration of modules that are common to all vhosts
{modules,
 [
  {mod_roster,     []},
  {mod_configure,  []},
  {mod_disco,      []},
  {mod_private,    []},
  {mod_time,       []},
  {mod_last,       []},
  {mod_version,    []}
 ]}.

%% Add some modules to vhost one:
{host_config, "one.example.org",
 [{{add, modules}, [
                    {mod_echo,       [{host, "echo-service.one.example.org"}]}
                    {mod_http_bind,  []},
                    {mod_logxml,     []}
                   ]
  }
 ]}.

3.a Listen каком порту ejabberd будет обслуживать определенный сервис, каждая запись состоит из следующих элементов:
Номер порта. Дополнительно ИП и/или транспортный протокол.
Модуль который висит на этом порту.
Опции для TCP сокета и для модуля.
Синтаксис:
{listen, [Listener, …]}.
Для определения Listener есть несколько вариантов:
{PortNumber, Module, [Option, …]}
{{PortNumber, IPaddress}, Module, [Option, …]}
{{PortNumber, TransportProtocol}, Module, [Option, …]}
{{PortNumber, IPaddress, TransportProtocol}, Module, [Option, …]}
IP адрес записывается в виде «10.11.12.13″ или «::FFFF:127.0.0.1″
Доступные модули:
ejabberd_c2s обработка c2s(клиент-сервер) соединений.
Опции: access, certfile, max_fsm_queue, max_stanza_size, shaper, starttls, starttls_required, tls, zlib
ejabberd_s2s_in обслуживание входящих s2s соединений.
Опции: max_stanza_size, shaper
ejabberd_service Взаимодействует с внешними компонентами (описано в XEP-0114)
Опции: access, hosts, max_fsm_queue, service_check_from, shaper
ejabberd_stun Обслуживает STUN Binding requests описано в RFC 5389.
Опции: certfile
ejabberd_http Обслуживает входящие HTTP соединения.
Опции: captcha, certfile, default_host, http_bind, http_poll, request_handlers, tls, trusted_proxies, web_admin
Описание опций для модулей:
{access, AccessName}
Описывает доступ к порту, по умолчанию all.
{backlog, Value}
Определяет максимальную длину очереди запросов ожидающих подключения. по умолчанию 5.
captcha веб страница позволяющая пользователям заполнять CAPTCHA запрос.
{certfile, Path}
Определяет полный путь к SSL сертификату по умолчанию. Для определения сертификата для определенного домена нужно использовать глобальную опцию domain_certfile.
{default_host, undefined|HostName}
Если HTTP запрос полученный ejabberd содержит HTTP заголовок Host с незнакомым виртуальным хостом, тогда выставляется заданный HostName. по умолчанию: undefined.
{hosts, [Hostname, …], [HostOption, …]}
внешний компонент который соединяется с ejabberd_service может обслуживать несколько hostnames. В HostOption вы можете определить опции компонентов. Сейчас доступна только одна опция требование пароля компонента при попытке конекта к ejabberd: {password, Secret}. Примечание: Вы не можете определить в одном ejabberd_service несколько разных сервисов: добавьте ejabberd_service для каждого сервиса.
http_bind
Включает HTTP Binding (XEP-0124 и XEP-0206). HTTP Bind вкл доступ через HTTP запросы к ejabberd из-за фаерволов которые не разрешают исходящие сокеты на порт 5222. Также нужно включить модуль mod_http_bind.
Если HTTP Bind вкл, он будет доступен по http://server:port/http-bind/. клиент также должен поддерживать HTTP Bind. Используется в веб клиентах таких как JWChat.
http_poll
Включает HTTP Polling (XEP-0025). HTTP Polling вкл доступ через HTTP запросы к ejabberd из-за фаерволов которые не разрешают исходящие сокеты на порт 5222.
Если HTTP Polling вкл, он будет доступен по http://server:port/http-poll/. клиент также должен поддерживать HTTP Polling. Используется в веб клиентах таких как JWChat.
http_poll_timeout глобальная опция определяющая максимальное время клиентской сессии без входящих POST запросов. по умолчанию 300 секунд. {http_poll_timeout, 300}.
{max_fsm_queue, Size}
Опция определяет максимальное число элементов в очереди FSM (Finite State Machine). Каждое сообщение в каждой очереди представляет собой одну XML строфу ожидающую отправки в соответствующий поток. если достигнут предел (например потому что получатель принимает очень медленно), тогда FSM и соответствующее соединение будет прервано и будет записано сообщение об ошибке. Значение зависит от железа. Но нет смысла ставить больше 1000. Опция может быть задана для ejabberd_service и ejabberd_c2s listeners, или глобально для ejabberd_s2s_out. Если не задано для ejabberd_service или ejabberd_c2s listeners, используется глобальное значение. Возможные значения ’undefined’ или целое число. По-умолчанию: ’undefined’.
{max_stanza_size, Size}
Опция определяет приблизительное(вычисляется с точностью до 1 блока прочитанных данных) максимальное значение в байтах XML строф. Пример {max_stanza_size, 65536}. По умолчанию бесконечность. Рекомендованные значения 65536 для c2s и 131072 для s2s. s2s max stanza должна быть всегда много больше чем для c2s . Изменяйте с осторожностью, может привести к нежелательным отключениям.
{request_handlers, [ {Path, Module}, …]}
Определяет 1 или несколько обработчиков HTTP запросов. Path это список путей; URIs которые начинаются на Path будут обработаны Module. Пример, Если вы хотите чтобы mod_foo обслуживал URIs которые начинаются на /a/b/, и также хотите чтобы mod_http_bind обслуживал URIs /http-bind/, используйте вот такую строку: {request_handlers, [{[“a”, “b”], mod_foo}, {[“http-bind”], mod_http_bind}]}
{service_check_from, true|false}
Используется только для ejabberd_service. XEP-0114 требует чтобы домен совпадал с хостнеймом компонента. Если эта опция установлена в false, ejabberd разрешит компонентам отправлять строфы с любым доменом в поле ’from’. по умолчанию true.
{shaper, none|ShaperName}
Определяет шейп для порта, по умолчанию none.
starttls
Определяет включено ли STARTTLS шифрование на порту. Необходимо так же задавать опцию certfile.
starttls_required
Требуется ли STARTTLS шифрование на порту. Также разрешает не шифрованные соединения. Также необходимо задавать параметр certfile.
tls
Определяет что трафик на определенном порту будет зашифрован используя SSL сразу после соединения. Это был традиционный метод на ранних этапах, сейчас не рекомендован к использованию. Также можно использовать в ejabberd_http для поддержки HTTPS.
{trusted_proxies, all | [IpString]}
Определяет какие прокси являются доверенными когда HTTP запрос содержит заголовок X-Forwarded-For Вы можете определить все(all), или список адресов. По умолчанию: [“127.0.0.1”]
web_admin
Включает веб-морду администратора http://server:port/admin/.
zlib
Включает потоковое Zlib сжатие (определено в XEP-0138) для соединения на порту.
Некоторые дополнительные глобальные параметры, которые задаются за пределами listen:
{s2s_use_starttls, false|optional|required|required_trusted}
Параметры шифрования между серверами
{s2s_certfile, Path}
Полный путь к SSL сертификату.
{domain_certfile, Domain, Path}
Полный путь к SSL сертификату для определенного домена.
{outgoing_s2s_options, [Family, …], Timeout}
Какую версию ИП использовать и таймаут. по умолчанию IPv4, потом IPv6, таймаут 10000 мс.
{s2s_dns_options, [ {Property, Value}, …]}
Определяет параметры использования днс преобразования: параметр timeout определяет таймаут в секундах(10с) с повтором (параметр retries ) через 2с.
{s2s_default_policy, allow|deny}
Политика для вх и исх s2s соединений. по умолчанию allow.
{{s2s_host, Host}, allow|deny}
Определяет если вх и исх s2s соединения для конкретного хоста.
{s2s_max_retry_delay, Seconds}
Максимальная разрешенная задержка для перезапроса, после неудачного подключения в секундах. по умолчанию 300с.
{max_fsm_queue, Size}
Опция определяет максимальное число элементов в очереди FSM (Finite State Machine). Каждое сообщение в каждой очереди представляет собой одну XML строфу ожидающую отправки в соответствующий поток. если достигнут предел (например потому что получатель принимает очень медленно), тогда FSM и соответствующее соединение будет прервано и будет записано сообщение об ошибке. Значение зависит от железа. Но нет смысла ставить больше 1000. Опция может быть задана для ejabberd_service и ejabberd_c2s listeners, или глобально для ejabberd_s2s_out. Если не задано для ejabberd_service или ejabberd_c2s listeners, используется глобальное значение. Возможные значения ’undefined’ или целое число. По-умолчанию: ’undefined’.
{route_subdomains, local|s2s}
Определяет сервер должен направить строку прямо к поддомену локально или отправить через транк с другому серверу.
Примеры:
3 домена. по умолчанию сертификат server.pem. Однако, c2s и s2s соединения к example.com используется example_com.pem.
порт 5222 слушает c2s со STARTTLS, а также поддерживает нешифрованные подключения.
порт 5223 слушает c2s со старым SSL.
порт 5269 слушает s2s со STARTTLS. Используется IPv6 вместо IPv4.
порт 3478 слушает STUN запросы через UDP.
порт 5280 слушает HTTP запросы, и обслуживает HTTP Poll
порт 5281 слушает HTTP запросы, используя HTTPS и поддерживает HTTP-Bind (BOSH) и Web Admin. Сокет принимает соединения только на адрес 127.0.0.1.

{hosts, ["example.com", "example.org", "example.net"]}.
{listen,
 [
  {5222, ejabberd_c2s, [
                        {access, c2s},
                        {shaper, c2s_shaper},
                        starttls, {certfile, "/etc/ejabberd/server.pem"},
                        {max_stanza_size, 65536}
                       ]},
  {5223, ejabberd_c2s, [
                        {access, c2s},
                        {shaper, c2s_shaper},
                        tls, {certfile, "/etc/ejabberd/server.pem"},
                        {max_stanza_size, 65536}
                       ]},
  {{5269, "::"}, ejabberd_s2s_in, [
                                   {shaper, s2s_shaper},
                                   {max_stanza_size, 131072}
                                  ]},
  {{3478, udp}, ejabberd_stun, []},
  {5280, ejabberd_http, [
                         http_poll
                        ]},
  {{5281, "127.0.0.1"}, ejabberd_http, [
                                        web_admin,
                                        http_bind,
                                        tls, {certfile, "/etc/ejabberd/server.pem"},
                                       ]}
 ]
}.
{s2s_use_starttls, optional}.
{s2s_certfile, "/etc/ejabberd/server.pem"}.
{domain_certfile, "example.com", "/etc/ejabberd/example_com.pem"}.
{outgoing_s2s_options, [ipv4, ipv6], 10000}.

Следующий пример:
c2s соединения на порт 5222 (все IPv4) на порт 5223 (SSL, с IP 192.168.0.1 и fdca:8ab6:a243:75ef::1) и запрещено для юзера ‘bad’.
s2s соединения на порт 5269 (все IPv4) с необходимым STARTTLS и доверенным сертификатом. Вх и исх соединения удаленных XMPP серверов запрещены, Разрешены только: «jabber.example.org» и «example.com».
Порт 5280 держит Web Admin и HTTP Polling на всех IPv4 адресах. Возможно также использовать их на различных портах.
Все пользователи за исключением administrators обрезаются до 1,000 B/s.
AIM транспорт aim.example.org на порту 5233 на localhost(127.0.0.1 and ::1) с паролем ‘aimsecret’.
ICQ транспорт JIT (icq.example.org и sms.example.org) на порту 5234 пароль ‘jitsecret’.
MSN транспорт msn.example.org порт 5235 пароль ‘msnsecret’.
Yahoo! транспорт yahoo.example.org порт 5236 пароль ‘yahoosecret’.
Gadu-Gadu транспорт gg.example.org порт 5237 пароль ‘ggsecret’.
Jabber Mail Component jmc.example.org порт 5238 пароль ‘jmcsecret’.
Включена опция предотвращающая проверки поля from в пакетах отправленных этим модулем. Компоненты могут отправлять пакеты под любым пользователем или даже любым сервером.

{acl, blocked, {user, "bad"}}.
{access, c2s, [{deny, blocked},
               {allow, all}]}.
{shaper, normal, {maxrate, 1000}}.
{access, c2s_shaper, [{none, admin},
                      {normal, all}]}.
{listen,
 [{5222, ejabberd_c2s, [
                        {access, c2s},
                        {shaper, c2s_shaper}
                       ]},
  {{5223, {192, 168, 0, 1}}, ejabberd_c2s, [
                                            {access, c2s},
                                            ssl, {certfile, "/path/to/ssl.pem"}
                                           ]},
  {{5223, {16#fdca, 16#8ab6, 16#a243, 16#75ef, 0, 0, 0, 1}},
   ejabberd_c2s, [
                  {access, c2s},
                  ssl, {certfile, "/path/to/ssl.pem"}
                 ]},
  {5269, ejabberd_s2s_in, []},
  {{5280, {0, 0, 0, 0}}, ejabberd_http, [
                                         http_poll,
                                         web_admin
                                        ]},
  {{5233, {127, 0, 0, 1}}, ejabberd_service, [
                                              {hosts, ["aim.example.org"],
                                                 [{password, "aimsecret"}]}
                                             ]},
  {{5233, "::1"}, ejabberd_service, [
                                     {hosts, ["aim.example.org"],
                                        [{password, "aimsecret"}]}
                                    ]},
  {5234, ejabberd_service, [{hosts, ["icq.example.org", "sms.example.org"],
                             [{password, "jitsecret"}]}]},
  {5235, ejabberd_service, [{hosts, ["msn.example.org"],
                             [{password, "msnsecret"}]}]},
  {5236, ejabberd_service, [{hosts, ["yahoo.example.org"],
                             [{password, "yahoosecret"}]}]},
  {5237, ejabberd_service, [{hosts, ["gg.example.org"],
                             [{password, "ggsecret"}]}]},
  {5238, ejabberd_service, [{hosts, ["jmc.example.org"],
                             [{password, "jmcsecret"}]}]},
  {5239, ejabberd_service, [{hosts, ["custom.example.org"],
                             [{password, "customsecret"}]},
                            {service_check_from, false}]}
 ]
}.
{s2s_use_starttls, required_trusted}.
{s2s_certfile, "/path/to/ssl.pem"}.
{s2s_default_policy, deny}.
{{s2s_host,"jabber.example.org"}, allow}.
{{s2s_host,"example.com"}, allow}.

Параметр auth_method определяет метод аутентификации.
Синтаксис:
{auth_method, [Method, …]}.
Доступные методы:
internal (default)
external
ldap
odbc
anonymous
pam
Создание аккаунтов доступно только в: internal, external, odbc.
resource_conflict
определяет действие когда клиент пытается подключится, а с его логина уже есть соединение.
Синтаксис:
{resource_conflict, setresource|closenew|closeold}.
Значение по умолчанию closeold.
fqdn
Определяет Fully Qualified Domain Name машины, если автоматически установить не удалось. FQDN используется для аутентификации некоторых клиентов которые используют DIGEST-MD5 SASL механизм.
Синтаксис:
{fqdn, undefined|FqdnString}.

3.b ACL
Синтаксис:
{acl, ACLName, ACLValue}.
ACLValue может быть:
all
{acl, all, all}. Все JIDы.
{user, Username}
{acl, admin, {user, «yozhik»}}. пользователь yozhik на первом виртуальном сервере
{user, Username, Server}
{acl, admin, {user, «yozhik», «example.org»}}. пользователь yozhik на example.org
{server, Server}
{acl, exampleorg, {server, «example.org»}}. любой JID на сервере example.org
{resource, Resource}
{acl, mucklres, {resource, «muckl»}}. любой JID с ресурсом muckl
{shared_group, Groupname}
{acl, techgroupmembers, {shared_group, «techteam»}}. Любой пользователь общего списка контактов techteam на вирт хосте
{shared_group, Groupname, Server}
{acl, techgroupmembers, {shared_group, «techteam», «example.org»}}. Любой пользователь общего списка контактов techteam на хосте example.org
{user_regexp, Regexp}
{acl, tests, {user_regexp, «^test[0-9]*$»}}. Любой пользователь совпадающий с условиями регулярки на вирт хосте
{user_regexp, Regexp, Server}
{acl, tests, {user_regexp, «^test», «example.org»}}. Любой пользователь совпадающий с условиями регулярки example.org
{server_regexp, Regexp}
{acl, icq, {server_regexp, «^icq\\.»}}. Совпадает с любым JID с сервера который совпадает с условием.
{resource_regexp, Regexp}
{acl, icq, {resource_regexp, «^laptop\\.»}}. Любой JID, с ресурсом соответствующим заданной регулярке.
{node_regexp, UserRegexp, ServerRegexp}
{acl, yozhik, {node_regexp, «^yozhik$», «^example.(com|org)$»}}. совпадает с любым пользователем соответствующим регулярке, на сервере соответствующим регулярке.
{user_glob, Glob}
{user_glob, Glob, Server}
{server_glob, Glob}
{resource_glob, Glob}
{node_glob, UserGlob, ServerGlob}
Тоже самое, но использует шаблоны шелла вместо регулярок
Шаблоны могут содержать:
* совпадение с любой строкой втч нулевой.
? совпадение с любым одиночным символом
[…] совпадение с любыми символами внутри скобок. ! — не.
Данные ACLName предопределены:
all — любой JID.
none — никакой JID.

3.c Права доступа
Записи ограничивают доступ к различным сервисам.
Синтаксис:
{access, AccessName, [ {allow|deny, ACLName}, …]}.
Когда JID проверяется на доступ к Accessname, сервер последовательно проверяет, совпадает ли этот JID в ACLs которая задана во втором элементе записи. Если совпадает, возвращается первый элемент из первой совпавшей записи, иначе возвращается deny.
Глобальные правила приоритетнее локальных(для вирт хоста)
Пример:

{access, configure, [{allow, admin}]}.
{access, something, [{deny, badmans},
                     {allow, all}]}.

Заданные AccessName предопределены:
all всегда возвращает ‘allow’.
none всегда возвращает ‘deny’.
Ограничение открытых сессий с помощью ACL
max_user_sessions определяет максимальное к-во открытых соединений на пользователя. по умолчанию бесконечность.
Синтаксис:
{access, max_user_sessions, [ {MaxNumber, ACLName}, …]}.
Ограничиваем к-во сессий до 5 на пользователя, для всех пользователей и 10 для админов:
{access, max_user_sessions, [{10, admin}, {5, all}]}.

max_s2s_connections
Несколько соединений к удаленному XMPP серверу с ACL, по умолчанию 1. также доступен параметр max_s2s_connections_per_node.
Синтаксис:
{access, max_s2s_connections, [ {MaxNumber, ACLName}, …]}.
Пример:
До 3 соединений с каждым удаленным сервером:
{access, max_s2s_connections, [{3, all}]}.

3.d Шейпер
Синтаксис:
{shaper, ShaperName, Kind}.
Сейчас доступен только 1 тип(kind) шейпера — maxrate
{maxrate, Rate}
Где Rate макс разрешенный вх поток Б/с. При превышении, ejabberd останавливает читать из сокета пока средняя скорость не опустится ниже максимально разрешенной.
Пример:
Шейпер называем ‘normal’ с ограничением до 1,000 bytes/second:
{shaper, normal, {maxrate, 1000}}.
Шейпер ‘fast’ с ограничением до 50,000 bytes/second:
{shaper, fast, {maxrate, 50000}}.
Язык устанавливается с помощью
{language, «ru»}.

3.e КАПЧА
Некоторые модули могут требовать ввод капчи, если клиент не поддерживает(XEP-0158), то выдается ссылка на веб, где эта капча и вбивается.
Опции:
{captcha_cmd, Path}
Путь к файлу генерирующего картинко) по умолчанию: undefined
{captcha_host, ProtocolHostPort}
ProtocolHostPort строка содержащая адрес где сервер слушает запросы. Запрос к пользователю приходит в виде: Protocol://Host:Port/captcha/ По умолчанию: protocol http, первый сконфигурированный хост, и port 80.
ejabberd_http listener должен быть включен с captcha.
Пример:

{hosts, ["example.org"]}.

{captcha_cmd, "/lib/ejabberd/priv/bin/captcha.sh"}.
{captcha_host, "example.org:5280"}.
%% {captcha_host, "https://example.org:443"}.
%% {captcha_host, "http://example.com"}.

{listen,
 [
  ...
  {5280, ejabberd_http, [
                         captcha,
                         ...
                        ]
  }

]}.

3.f STUN
ejabberd может выступать в роли STUN сервера (RFC 5389). Только Binding поддерживается. В этой роли ejabberd помогает клиентам с Jingle ICE (XEP-0176) определять их внешний порт и адрес.
Нужно включить ejabberd_stun. Если требуется можно задать certfile, ejabberd мультеплексирует TCP и TLS через TCP на том же порту. поскольку это не требуется для Binding и зарезервированно для TURN. Настраивается только удп транспорт.
Пример:

{listen,
 [
  ...
  {{3478, udp}, ejabberd_stun, []},
  {3478, ejabberd_stun, []},
  {5349, ejabberd_stun, [{certfile, "/etc/ejabberd/server.pem"}]},
  ...
 ]
}.

Также необходимо DNS SRV запись для того чтобы клиенты легко нашли STUN сервер для вашего XMPP домена.
Пример DNS SRV :

_stun._udp   IN SRV  0 0 3478 stun.example.com.
_stun._tcp   IN SRV  0 0 3478 stun.example.com.
_stuns._tcp  IN SRV  0 0 5349 stun.example.com.

Подключение дополнительных файлов конфигурации:
include_config_file
Синтаксис:
{include_config_file, Filename}.
{include_config_file, Filename, [Suboption, …]}.
Разрешенный подопции:
{disallow, [Optionname, …]}
Запрещает использовать эту подопцию в дополнительном файле. по умолчанию ничего.
{allow_only, [Optionname, …]}
Разрешает использовать эту подопцию в дополнительном файле. по умолчанию все.
Пример:

{include_config_file, "/etc/ejabberd/additional.cfg"}.
{include_config_file, "./example.org/additional_not_listen.cfg", [{disallow, [listen]}]}.

3.g Макросы:
{define_macro, ’MACRO’, Value}. обязательно большими буквами и в одиночных кавычках, а значение может быть любым правильным выражением на Эрланг.
Два способа юзать макросы, вместо значения просто ставим ’MACRO’, если макрос не был обьявлен ранее, то программа упадет. Или
{use_macro, ’MACRO’, Defaultvalue} если макрос не был определен то будет использоваться Defaultvalue.
Пример:

{define_macro, 'LOG_LEVEL_NUMBER', 5}.
{loglevel, 'LOG_LEVEL_NUMBER'}.
Или
{define_macro, 'NUMBER_PORT_C2S', 5222}.
{define_macro, 'PORT_S2S_IN', {5269, ejabberd_s2s_in, []}}.
{listen,
 [
  {'NUMBER_PORT_C2S', ejabberd_c2s, []},
  'PORT_S2S_IN',
  {{use_macro, 'NUMBER_PORT_HTTP', 5280}, ejabberd_http, []}
 ]
}.

3.h Связь с БД(MySQL)
Добавляем вот такую строчечку:
{odbc_server, {mysql, «localhost», Port, «test», «root», «password»}}.
По умолчанию открывается 10 соединений с БД, изменить можно
{odbc_pool_size, 10}.
Можно настроить фиктивные запросы к SQL серверу чтобы поддерживать соединение «на плаву»
{odbc_keepalive_interval, undefined}.
Если соединение отпало, ждем 30 сек и пересоединяемся
{odbc_start_interval, 30}.
Например для аутентификации через MySQL DB нужно указать
{auth_method, [odbc]}.

4. Модули
Какие дополнительные плюшки подгружаются после старта даймона.
Синтаксис:
{modules, [ {ModuleName, ModuleOptions}, …]}.
Пример:

{modules,
 [
  {mod_echo,      []}
 ]}.

Пример2(все записи через запятую, кроме последней!!)

{modules,
 [
  {mod_echo,      []},
  {mod_time,      []},
  {mod_version,   []}
 ]}.

Доступные модули:
mod_adhoc
mod_announce требуется mod_adhoc
mod_announce_odbc требуется mod_adhoc
mod_blocking требуется mod_privacy
mod_blocking_odbc требуется mod_privacy_odbc
mod_caps
mod_configure требуется mod_adhoc
mod_disco
mod_echo
mod_http_bind
mod_http_fileserver
mod_irc IRC transport
mod_irc_odbc
mod_last
mod_last_odbc
mod_muc
mod_muc_odbc
mod_muc_log требуется mod_muc or mod_muc_odbc
mod_offline
mod_offline_odbc
mod_ping
mod_pres_counter
mod_privacy
mod_privacy_odbc
mod_private
mod_private_odbc
mod_proxy65
mod_pubsub требуется mod_caps
mod_pubsub_odbc требуется mod_caps
mod_register
mod_register_web
mod_roster
mod_roster_odbc
mod_service_log
mod_shared_roster требуется mod_roster или mod_roster_odbc
mod_shared_roster_odbc требуется mod_roster или mod_roster_odbc
mod_shared_roster_ldap mod_roster или mod_roster_odbc
mod_sic
mod_stats
mod_time
mod_vcard
mod_vcard_ldap
mod_vcard_odbc
mod_vcard_xupdate требуется mod_vcard или mod_vcard_odbc
mod_vcard_xupdate_odbc требуется mod_vcard или mod_vcard_odbc
mod_version

Модули без суфиксов используют встроенную БД Mnesia
‘_odbc’, требуется поддержка стороних БД
‘_ldap’, требуется поддержк LDAP сервера.
Опции модулей:
iqdisc Определяет процедуру обработки IQ запросов к (например к example.org или [email protected]).
Синтаксис:
{iqdisc, Value}
Значения могут быть:
no_queue
непосредственная обработка. XMPP соединение блокирует обработку других запросов до полного своего завершения. Не рекомендуется к использованию.
one_queue
Обработка в параллельных потоках. Рекомендуется.
{queues, N}
Создается N потоков.
parallel
Для каждого пакета создается форк Эрланг процесса. Хоть Эрланг и не прожорливый, но сервер может прилечь(по умолчанию эмулятор Эрланга ограничен 32000 процессами).
Пример:

{modules,
 [
  ...
  {mod_time, [{iqdisc, no_queue}]},
  ...
 ]}.

host указывает Jabber ID сервиса предоставляемого ejabberd модулем.
Синтаксис:
{host, HostName}
Если использовать «@HOST@», то будет вставлено имя виртуального хоста.
Пример:

{modules,
 [
  ...
  {mod_echo, [{host, "mirror.example.org"}]},
  ...
 ]}.

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

{modules,
 [
  ...
  {mod_echo, [{host, "mirror.@HOST@"}]},
  ...
 ]}.

mod_announce
Позволяет делать массовые рассылки или устанавливать MoTD, или используя специальную команду или отослав сообщение специальному аккаунту. Аккаунты без скобок применимы только для заданного вирт хоста, в скобках применимы для всех вирт хостов.
example.org/announce/all (example.org/announce/all-hosts/all)
Всем зарегистрированным пользователям. Если пользователь онлайн и подключен к нескольким источникам, только самый приоритетный получит сообщение. Если пользователь офлайн, то сообщение будет доставлено, как только пользователь появится.
example.org/announce/online (example.org/announce/all-hosts/online)
Всем активным пользователям, Если пользователь подкл к нескольким источникам, все они получат сообщение.
example.org/announce/motd (example.org/announce/all-hosts/motd)
Устанавливает MOTD+ отсылается всем подкл пользователям.
example.org/announce/motd/update (example.org/announce/all-hosts/motd/update)
Устанавливает MOTD.
example.org/announce/motd/delete (example.org/announce/all-hosts/motd/delete)
Любое сообщение этому аккаунту удаляет текущий MOTD.
Опции:
{access, AccessName}
Кому разрешена рассылка и установка MOTD. по умолчанию никому.
Примеры:

{access, announce, [{allow, admin}]}.

{modules,
 [
  ...
  {mod_adhoc, []},
  {mod_announce, [{access, announce}]},
  ...
 ]}.

Модуль прожорлив, на тысячах пользователей лучше не вкл!
mod_disco
С помощью этого модуля, клиенты могут найти какие сервисы доступны на сервере.
Опции:
{iqdisc, Discipline}
Определяет обработку запросов при Service Discovery.
{extra_domains, [Domain, …]}
Задаем список дополнительных доменов для Service Discovery.
{server_info, [ {Modules, Field, [Value, …]}, … ]}
Доп информация о сервере(XEP-0157). В Modules Служебное слово ‘all’ — инфо распространяется на все сервисы или список модулей, в остальных случаях только для конкретного модуля. Поля Field и Value могут заполняться произвольно, а не только контактной информацией.
Для обслуживания ссылки на каталог пользователя:

{modules,
 [
  ...
  {mod_disco, [{extra_domains, ["users.domen.ua"]}]},
  ...
 ]}.

Для обслуживания ссылки на транспорт на других доменах

{modules,
 [
  ...
  {mod_disco, [{extra_domains, ["icq.example.com",
                                "msn.example.com"]}]},
  ...
 ]}.

Ссылки на несколько дружественных серверов:

{modules,
 [
  ...
  {mod_disco, [{extra_domains, ["example.org",
                                "example.com"]}]},
  ...
 ]}.

Все сервисы показывают abuse(для жалоб) адрес, для основного сервера и админский адрес для главного сервера и vJUD сервисов:

{modules,
 [
  ...
  {mod_disco, [{server_info, [
      {all,
       "abuse-addresses",
       ["mailto:[email protected]"]},
      {[mod_muc],
       "Web chatroom logs",
       ["http://www.example.org/muc-logs"]},
      {[mod_disco],
       "feedback-addresses",
       ["http://shakespeare.lit/feedback.php", "mailto:[email protected]", "xmpp:[email protected]"]},
      {[mod_disco, mod_vcard],
       "admin-addresses",
       ["mailto:[email protected]", "xmpp:[email protected]"]}
  ]}]},
  ...
 ]}.

mod_echo
Тупо отсылает обратно все сообщения отправителю(нужен при дебаге)
Опции:
{host, HostName}
Определяет Jabber ID сервиса. Если не задана Jabber ID будет имя виртуального хоста с префиксом ‘echo.’. Служебное слово «@HOST@» заменяется на реальное имя виртуального хоста.

{modules,
 [
  ...
  {mod_echo, [{host, "mirror.example.org"}]},
  ...
 ]}.

mod_http_bind
поддержка XMPP через Bosh (HTTP Binding) не предназначена для браузера, должен обрабатывать клиент

{modules,
 [
  ...
  {mod_http_bind, []},
  ...
]}.

Опции:
{max_inactivity, Seconds}
Максимальный таймаут в секундах. по умолчанию 30

{modules,
 [
  ...
  {mod_http_bind, [ {max_inactivity, 50} ]},
  ...
]}.

mod_http_fileserver
Небольшой файлсервер(отдает файлы с сервера по хттп)
Опции:
{docroot, Path}
Папка с файлами.
{accesslog, Path}
Путь к файлу лога(Апачеподобный).
{directory_indices, [Index, …]}
Когда посетитель запрашивает ссылку на каталог (например, http://htaccess.net.ru/doc/), и такой каталог существует, то веб-сервер отдает индексный файл из заданной папки.
{custom_headers, [ {Name, Value}, …]}
Определяет HTTP заголовок который будет добавлен ко всем ответам. по умолчанию: []
{content_types, [ {Name, Type}, …]}
Привязка к определенным расширениям файлов. Для удаления переопределите со значением: ‘undefined’.
{default_content_type, Type}
Определяет тип содержимого для файлов с незнакомым расширением. По умолчанию ‘application/octet-stream’.
Пример: Файлы из /var/www по адресу http://example.org:5280/pub/archive/. Определен новый тип ogg, png переопределен, а jpg удален.

{modules,
 [
  ...
  {mod_http_fileserver, [
                         {docroot, "/var/www"}, 
                         {accesslog, "/var/log/ejabberd/access.log"},
                         {directory_indices, ["index.html", "main.htm"]},
                         {custom_headers, [{"X-Powered-By", "Erlang/OTP"},
                                           {"X-Fry", "It's a widely-believed fact!"}
                                          ]},
                         {content_types, [{".ogg", "audio/ogg"},
                                          {".png", "image/png"},
                                          {".jpg", undefined}
                                         ]},
                         {default_content_type, "text/html"}
                        ]
  },
  ...
]}.

Не забываем добавить порт:

{listen, 
 [
  ...
  {5280, ejabberd_http, [
                         ...
                         {request_handlers, [
                                             ...
                                             {["pub", "archive"], mod_http_fileserver},
                                             ...
                                            ]
                         },
                         ...
                        ]
  },
  ...
]}.

mod_irc
Включает IRC транспорт для соединения с IRC каналами(кому это сейчас нужно????) пропускаем.
mod_last
Определяет когда пользователь в последний раз был онлайн
Опции:
{iqdisc, Discipline}
mod_muc
Многопользовательский чат. Пользователь может входить существующие комнаты или создавать свои. Чаты могут быть как публичными так и закрытыми.
Возможности чата:
Посылать приватные и массовые сообщения пользователям в комнате.
Приглашать других пользователей в комнату.
Устанавливать тему комнаты.
Создавать пароль комнаты.
Кик и бан пользователей в комнате.
Имя комнаты уникально.
Опции:>
{host, HostName}
Задает Jabber ID Для сервиса.Если не задано то будет имя виртуального хоста с префиксом ‘conference.’. Служебное слово «@HOST@» заменяется на реальное имя виртуального хоста.
{access, AccessName}
Кому разрешен чат. По Умолчанию всем.
{access_create, AccessName}
Кто может создавать комнаты, по умолчанию все на локальном сервере.
{access_persistent, AccessName}
Кто может изменять ’постоянные’ параметры комнаты. По умолчанию все аккаунты на локальном сервере.
{access_admin, AccessName}
Кто может администрировать чат. по умолчанию никто(только создатель комнаты). Администраторы могут отправлять обычные сообщения к service JID, и оно будет показано во всех активных комнатах, также администраторы могут отправлять сообщения группового чата к JID активной комнаты, и сообщение будет показано в комнате.
{history_size, Size}
Размер истории которая будет отображаться при входе в комнату. по умолчанию 20, 0-отключить хранение истории. Параметр влияет на историю всех комнат.
{max_users, Number}
Максимальное количество пользователей в комнате. Может быть уменьшено в каждой комнате, но не увеличено. по умоланию 200.
{max_users_admin_threshold, Number}
К-во админов или владельцев комнаты, которые могут войти при достижении максимального числа пользователей в комнате. По умолчанию 5.
{max_user_conferences, Number}
Максимальное к-во комнат к которому может подключиться пользователь. По умолчанию 10. Софтовое ограничение, при кластерной архитектуре может и больше.
{max_room_id, Number}
Максимальная длина номера комнаты. по умолчанию бесконечность.
{max_room_name, Number}
Максимальная длина имени комнаты. по умолчанию бесконечность.
{max_room_desc, Number}>
Максимальная длина описания комнаты. по умолчанию бесконечность.
{min_message_interval, Number}
Минимальный интервал между сообщениями в секундах. Применяется для всех комнат. дробное значение проходит). Если не задано, то неограниченно. Защита чата от проблем. Рекомендуемое значение 0.4 second. При превышении пользователю высылается сообщение об ошибке.
{min_presence_interval, Number}
Минимальный интервал смены статуса пользователя. Применяется для всех комнат. дробное значение проходит). Если не задано, то неограниченно. Рекомендуемое значение 4.
{default_room_options, [ {OptionName, OptionValue}, …]}
Позволяет установить требуемые опции для комнаты «по умолчанию» Создатель комнаты может менять эти параметры.
Доступные опции по умолчанию:
{allow_change_subj, true|false}
Позволяет пользователям менять тему комнаты.
{allow_private_messages, true|false}
Обмен приватными сообщениями в комнате.
{allow_private_messages_from_visitors, anyone|moderators|nobody}
Гости могут отправлять сообщения пользователям комнаты.
{allow_query_users, true|false}
пользователи могут отправлять IQ запросы другим пользователям.
{allow_user_invites, false|true}
Позволяет пользователям отправлять приглашения в комнату.
{allow_visitor_nickchange, true|false}
Позволяет гостям менять ник.
{allow_visitor_status, true|false}
Разрешить посетителям отправить текст статуса в сообщения о присутствии . Если запрещено текст статуса будет обрезан перед отправкой в чат.
{anonymous, true|false}
Пользователи в комнате не видят реальных JID. Модератор комнаты может всегда видеть реальные JID.
{captcha_protected, false}
Когда пользователь пытается войти в комнату и они не: owner, admin или member, то комната потребует ввести капчу.
{logging, false|true}
Логировать сообщения с помощью mod_muc_log.
{max_users, 200}
Максимальное количество пользователей в комнате.
{members_by_default, true|false}
Пользователь вошедший в комнату участник по умолчанию, поэтому у него есть право говорить.

{members_only, false|true}
Только члены комнаты могут войти.
{moderated, true|false}
Только пользователи с правом голоса могут отправлять публичные сообщения.
{password, «roompass123″}
Пароль комнаты
{password_protected, false|true}
Требовать ввода пароля при входе в комнату
{persistent, false|true}
Оставлять комнату активной даже если последний участник вышел.
{public, true|false}
Комната общедоступна поэтому отображается в списке чатов.
{public_list, true|false}
Список участников общедоступен, даже без входа в комнату(посмотреть кто в комнате даже не заходя в нее)
{title, «Room Title»}
Человеко понятное название комнаты.
Примеры:
Всем разрешено пользоваться чатом. Все могут создавать комнаты, но только [email protected] может администрировать любую комнату. Он также и глобальный админ.Когда [email protected] отправляет сообщение ‘крэвэст’ на conference.example.org, то это будет отображено во всех активных комнатах. История отключена.

{acl, admin, {user, "admin", "example.org"}}.

{access, muc_admin, [{allow, admin}]}.

{modules,
 [
  ...
  {mod_muc, [{access, all},
             {access_create, all},
             {access_admin, muc_admin},
             {history_size, 0}]},
  ...
 ]}.

Только для платных зареганых в нашем домене аккаунтах и других серверах. Только админ может создавать и администрировать комнаты. Когда [email protected] Отправляет сообщение типа ‘крэвэст’ на conference.example.org, то это будет отображено во всех активных комнатах. Не задана опция history_size, поэтому история включена и размер истории 20.

{acl, paying_customers, {user, "customer1", "example.net"}}.
{acl, paying_customers, {user, "customer2", "example.com"}}.
{acl, paying_customers, {user, "customer3", "example.org"}}.
{acl, admin, {user, "admin", "example.org"}}.

{access, muc_admin, [{allow, admin},
                      {deny, all}]}.
{access, muc_access, [{allow, paying_customers},
                      {allow, admin},
                      {deny, all}]}.

{modules,
 [
  ...
  {mod_muc, [{access, muc_access},
             {access_create, muc_admin},
             {access_admin, muc_admin}]},
  ...
 ]}.

Пример 3: Опция Анти abuse(злоупотребления, жалобы) включена. Пользователь не может отправлять более 1 сообщения в 0.4 секунды и статус пользователя не может быть изменен чаще чем каждые 4 секунды. Длина Room ID и Room Names ограничена 20 символами, а описание комнаты 300 символов. ACL не определены, но некоторые ограничения пользователей могут быть установлены:

{modules,
 [
  ...
  {mod_muc, [{min_message_interval, 0.4},
             {min_presence_interval, 4},
             {max_room_id, 20},
             {max_room_name, 20},
             {max_room_desc, 300}]},
  ...
 ]}.

Пример 4 показывает как использовать default_room_option:

{modules,
 [
  ...
  {mod_muc, [{access, muc_access},
             {access_create, muc_admin},
             {default_room_options,
              [
               {allow_change_subj, false},
               {allow_query_users, true},
               {allow_private_messages, true},
               {members_by_default, false},
               {title, "New chatroom"},
               {anonymous, false}
              ]},
             {access_admin, muc_admin}]},
  ...
 ]}.

mod_muc_log
Логирование чата в HTML. Включив этот модуль, администратор чата может добавить логирование комнаты.
Возможности:
Детали комнаты добавляются наверх каждой страницы: Название комнаты, JID, автор,тема и конфигурация.
JID комнаты в сгенерированном HTML это ссылка на подключение к комнате.
Изменение темы и конфигурации отслеживается и отображается.
Входы, выходы, изменения ников, кики, ,баны и ‘/me’ отслеживаются и отображаются, включая причину, если доступно.
Генерация HTML файлов и XHTML 1.0 Transitional и поддержка CSS.
Временные метки «самовызовные» линки.
Линки вверху для быстрой навигации: предыдущий день, следующий день, вверх.
CSS используется для определения стилей, и можно использовать собственные CSS.
URLs в сообщениях и тема преобразовываются в гиперссылки.
Временная зона используется во временных метках и отображается в логе.
Произвольная ссылка может быть добавлена вверху каждой страницы.
Опции:
{access_log, AccessName}
Ограничивает кто может вкл/выкл логирование. По умолчанию muc_admin. Для этого правила по умолчанию у вас должно быть правило для muc_admin.
{cssfile, false|URL}
Использовать ли другой CSS или встроенный.
{dirname, room_jid|room_name}
Позволяет установить имя директории комнаты. Доступные значения room_jid и room_name. по умолчанию room_jid.
{dirtype, subdirs|plain}
Тип создаваемых директорий. subdirs подпапки будут создаваться для каждого года и месяца. при plain, имя будет содержать полную дату, без поддиректорий. по умолчанию subdirs.
{file_format, html|plaintext}
Формат логов, по умолчанию html.
{outdir, Path}
Полный путь к папке. По умолчанию www/muc.
{spam_prevention true|false}
Предотвращение спама, добавляет специальный атрибут, который препятствует индексацию поисковиками. По умолчанию true.
{timezone, local|universal}
Временная зона для логов. По умолчанию local(с операционки) также universal(GMT/UTC).
{top_link, {URL, Text}}
Линк в верхнем правом углу каждого лог файла. по умолчанию {«/», «Home»}.
Примеры:
Любой владелец комнаты может включить логирование, задан свой CSS (http://example.com/my.css). Имя файла будет содержать полную дату, и без поддиректорий. логи будут в /var/www/muclogs, временная зона GMT/UTC. Вверху ссылка будет Jabber.ru.

{access, muc, [{allow, all}]}.

{modules,
 [
  ...
  {mod_muc_log, [
                 {access_log, muc},
                 {cssfile, "http://example.com/my.css"},
                 {dirtype, plain},
                 {dirname, room_jid},
                 {outdir, "/var/www/muclogs"},
                 {timezone, universal},
                 {spam_prevention, true},
                 {top_link, {"http://www.jabber.ru/", "Jabber.ru"}}
                ]},
  ...
 ]}.

Пример 2: Только [email protected] и [email protected] могут включить логирование, используется встроенный CSS. Имя лога будет содержать день(номер) и поддиректории для каждого года и месяца. Логи будут в /var/www/muclogs, будет использоваться локальное время. Ссылка вверху Home.

{acl, admin, {user, "admin1", "example.org"}}.
{acl, admin, {user, "admin2", "example.net"}}.

{access, muc_log, [{allow, admin},
                   {deny, all}]}.

{modules,
 [
  ...
  {mod_muc_log, [
                 {access_log, muc_log},
                 {cssfile, false},
                 {dirtype, subdirs},
                 {outdir, "/var/www/muclogs"},
                 {timezone, local}
                ]},
  ...
 ]}.

mod_offline
Хранение офлайн сообщений. У ejabberdctl есть команда удаления истекших сообщений.
Опции:
{access_max_user_messages, AccessName}
Определяет квоту офлайн сообщений. При превышении новые сообщения игнорируются а отправитель получает сообщение о ошибке. По умолчанию max_user_offline_messages. Можно определить правило доступа подобно max_user_sessions.
Пример: для poweruser квота 5К, для админов 2К, для остальных 100.

{acl, admin, {user, "admin1", "localhost"}}.
{acl, admin, {user, "admin2", "example.org"}}.
{acl, poweruser, {user, "bob", "example.org"}}.
{acl, poweruser, {user, "jane", "example.org"}}.
{access, max_user_offline_messages, [ {5000, poweruser}, {2000, admin}, {100, all} ]}.
{modules,
 [
  ...
  {mod_offline,  [ {access_max_user_messages, max_user_offline_messages} ]},
  ...
 ]}.

mod_ping
Поддержка XMPP Ping и сообщениях о доступности(keep-alive)
Опции:
Configuration options:
{send_pings, true|false}
Отсылать пинг клиентам, которые не активны в течении ping_interval. Полезно для поддержания соединения клиента или проверки доступности, по умолчанию отключена.
{ping_interval, Seconds}
Как часто отправлять пинги подключенным клиентам, Если клиент не отсылает и не принимает никаких строк за этот промежуток времени, то отправляется пинг клиенту. По умолчанию 60 секунд.
{timeout_action, none|kill}
Что делать если клиент не ответил на пинг за 32секунды, по умолчанию ничего.
Пример:
Включает пинг при неактивности 4 минуты, а для клиентов которые не ответили на пинг за 32 секунды — прибить сессию.

{modules,
 [
  ...
  {mod_ping,  [{send_pings, true}, {ping_interval, 240}, {timeout_action, kill}]},
  ...
 ]}.

mod_pres_counter
Детектирование спама.
Опции:
{count, StanzaNumber}
Количество строк для (subscribe, unsubscribe, subscribed, unsubscribed) разрешено для любого направления (вх или выход) за промежуток времени. 2 пользователя подписанных друг на друга обычно генерируют 4 строфы, По умолчанию 5.
{interval, Seconds}
Временной интервал в секундах. По умолчанию 60.
Пример: включает модуль и разрешает до 5 строф для отправки или приема в сообщении о состоянии в интервал 60 секунд:

{modules,
 [
  ...
  {mod_pres_counter,  [{count, 5}, {interval, 60}]},
  ...
 ]}.

mod_privacy
Включает настройки приватности:
Конфиденциальность своих списков,
Добавление, удаление, исправление списков,
Настройка, изменение или отклонение активных списков,
Настройка, изменение или отклонение списка по умолчанию,
Блокировка сообщений на основе JID, группе, типе подписки(или глобально).
Блокировка входящих сообщений о доступности на основе JID, группе, типе подписки(или глобально).
Блокировка исходящих сообщений о доступности на основе JID, группе, типе подписки(или глобально).
Блокировка IQ stanzas на основе JID, группе, типе подписки(или глобально).
Блокировка всех видов общения на основе JID, группе, типе подписки(или глобально).
Опции:
{iqdisc, Discipline}
Тип обработки IQ запросов на Blocking Communication (jabber:iq:privacy).
mod_private
Поддержка Private XML хранилища (XEP-0049):
Например для хранения закладок, или особых настроек пользователя на стороне сервера
Опции:
{iqdisc, Discipline}
Тип обработки IQ запросов на Private XML (jabber:iq:private).
mod_proxy65
Поддержка SOCKS5 прокси. Позволяет серверу принимать участие в обмене файлами между 2 клиентами.
Опции:
{host, HostName}
Задает Jabber ID Для сервиса.Если не задано то будет имя виртуального хоста с префиксом ‘proxy.’. Служебное слово «@HOST@» заменяется на реальное имя виртуального хоста.
{name, Text}
Определяет название сервиса. По умолчанию «SOCKS5 Bytestreams».
{ip, IPTuple}
на каком ифейсе слушать. по умолчанию IP адрес от днс сервера, или, если не получилось, {127,0,0,1}.
{port, Number}
порт для входящих соединений. По умолчанию 7777.
{hostname, HostName}
Определяет имя хоста которое сообщает сервис когда устанавливает соединение между клиентами. Удобно когда сервис за натом. по умолчанию значение ip. Пример: «proxy.mydomain.org», «200.150.100.50″. Лучше не использовать днс.
{auth_type, anonymous|plain}
тип аутентификации на SOCKS5. Возможные значения: anonymous и plain. по умолчанию anonymous.
{access, AccessName}
ACL для инициатора передачи. по умолчанию all.
{max_connections, Number}>
Максимальное количество активных соединений на файл, инициатором передачи. по умолчанию без ограничений.

{shaper, none|ShaperName}
Шейпер на передачу. По умолчанию нет.
Пример 1: Самая простая конфигурация

{modules,
 [
  ...
  {mod_proxy65, []},
  ...
 ]}.
 

Пример 2: Более сложный

{acl, proxy_users, {server, "example.org"}}.
{access, proxy65_access, [{allow, proxy_users}, {deny, all}]}.

{acl, admin, {user, "admin", "example.org"}}.
{shaper, proxyrate, {maxrate, 10240}}. %% 10 Kbytes/sec
{access, proxy65_shaper, [{none, admin}, {proxyrate, proxy_users}]}.

{modules,
 [
  ...
  {mod_proxy65, [{host, "proxy1.example.org"},
                 {name, "File Transfer Proxy"},
                 {ip, {200,150,100,1}},
                 {port, 7778},
                 {max_connections, 5},
                 {access, proxy65_access},
                 {shaper, proxy65_shaper}]},
  ...
 ]}.

mod_pubsub
Подписка на определенный ресурс, с помощью этого механизма можно передавать актуальные данные между нодами в кластере. например в астериске между серверами мы можем передавать состояние телефончиков итд.
{host, HostName}
Задает Jabber ID Для сервиса.Если не задано то будет имя виртуального хоста с префиксом ‘pubsub.’. Служебное слово «@HOST@» заменяется на реальное имя виртуального хоста.
{access_createnode, AccessName}
Кто может создавать подписку, по умолчанию все.
{max_items_node, MaxItems}
Максимальное к-во пунктов которое может храниться на ноде. По-умолчанию 10.
{plugins, [ Plugin, …]}
Определяет какой плагин использовать. Первый в списке используется по умолчанию. Если не задано то: [“flat”]. PubSub клиенты могут определить какой плагин использовать при создании ноды: добавить type=’plugin-name’ к create(созданию) элементу строфы.
{nodetree, Nodetree}
Какой nodetree использовать. Если не задано: “tree”. Только один nodetree может быть на хосте, одинаков для всех плагинов ноды. “virtual” nodetree не хранит ноды в БД. Сохраняет ресурсы систем с множеством нод. Возможные плагины при “virtual” : [“flat”,”pep”] или [“flat”]. Кроме того, у всех нод будут дефолтные настройки, и это нельзя поменять. Нужно использовать лишь с чистой БД, никогда ранее не запущенной в режиме tree.
“dag” экспериментальная поддержка PubSub Collection Nodes (XEP-0248).
{ignore_pep_from_offline, false|true}
Должны или нет получать последнее PEP(иногда его называют PubSub, это не одно и то же, но связанные вещи. Принцип его работы довольно прост и напоминает списки рассылки: кто-то создает свою рассылку, PEP транспорт её считывает и рассылает всем подписчикам. Чаще всего это используется в дополнительных статусах.) в нашем списке контактов, если они офлайн когда мы вошли. если не определено то true,мы получим последний “статус” от онлайновых контактов.
{last_item_cache, false|true}
Кешировать или нет последние сообщения рассылки.по умолчанию не кеширует. На системах с небольшим к-вом нод, кеширование увеличивает производительность системы, но расходует память.
{pep_mapping, [ {Key, Value}, …]}
Определяет список Key-Value определенных плагинов нод с заданым PEP namespace.
Пример: Будет использоваться node_tune вместо node_pep для всех PEP нод с tune namespace:

{mod_pubsub, [{pep_mapping, [{"http://jabber.org/protocol/tune", "tune"}]}]}

Пример2: По умолчанию flat ноды, также разрешены flat, nodetree и pep ноды:

{modules,
 [
  ...
  {mod_pubsub, [
                {access_createnode, pubsub_createnode},
                {plugins, ["flat", "hometree", "pep"]}
               ]},
  ...
 ]}.

Пример3 Предыдущий конфиг, но с использованием ODBC(астер отказался так разговаривать):

{modules,
 [
  ...
  {mod_pubsub_odbc, [
                {access_createnode, pubsub_createnode},
                {plugins, ["flat_odbc", "hometree_odbc", "pep_odbc"]}
               ]},
  ...
 ]}.

mod_register
Поддержка In-Band Registration (XEP-0077). Включает следующие опции через клиент
Регистрация новых клиентов на сервереRegister a new account on the server.
Изменение пароля на сервере.
Удаление аккаунта.
Опции:
{access, AccessName}
Какие имена могут быть удалены, созданы. По умолчанию отключено.
{access_from, AccessName}
по умолчанию, ejabberd не позволяет регистрировать новые аккаунты из s2s или существующей c2s сессий. Можно изменить это поведение.
{captcha_protected, false|true}
Защита регистрации с помощью CAPTCHA. по умолчанию отключено.
{ip_access, [ {allow|deny, IPaddress}, …]}
С каких ипов можно регистрироваться. правило по умолчанию “allow” если не совпадает маска. Поддержка IPv6. по умолчанию(пусто) [].
{password_strength, Entropy}
Устанавливает минимум информационной энтропии для пароля. Значение Entropy число бит энтропии. рекомендуется минимум 32 bits. по умолчанию 0(нет проверки).
{welcome_message, {Subject, Body}}
Сообщение для всех вновь созданных аккаунтов. Можно использовать \n(новая строка)
{registration_watchers, [ JID, …]}
Кто будет уведомлен о новом пользователи.
{iqdisc, Discipline}
Задает способ обработки In-Band Registration (jabber:iq:register).
Пример 1 запрещаем создание слишком коротких имен, и регистрация только с локалки:

{acl, shortname, {user_glob, "?"}}.
{acl, shortname, {user_glob, "??"}}.
%% The same using regexp:
%%{acl, shortname, {user_regexp, "^..?$"}}.

{access, register, [{deny, shortname},
                    {allow, all}]}.

{modules,
 [
  ...
  {mod_register, [{access, register},
                  {ip_access, [{allow, "127.0.0.0/8"},
                               {deny, "0.0.0.0/0"}]}
  ]},
  ...
 ]}.

Пример 2: Позволяет существующим пользователям менять пароль, но запрещает создавать и удалять аккаунты

{access, register, [{deny, all}]}.

{modules,
 [
  ...
  {mod_register, [{access, register}]},
  ...
 ]}.

Пример 3 устанавливаем приветственное сообщение, и 2 учетки кому будем писать при создании пользователя:

{registration_timeout, 3600}.
{modules,
 [
  ...
  {mod_register,
   [
    {welcome_message, {"Welcome!", "Hi.\nWelcome to this Jabber server.\n Check http://www.jabber.org\n\nBye"}},
    {registration_watchers, ["[email protected]", "[email protected]"]}
   ]},
  ...
 ]}.

mod_register_web
Вебморда для:
Регистрация новых клиентов на сервереRegister a new account on the server.
Изменение пароля на сервере.
Удаление аккаунта.
Поддерживается капча.
Опция:
{registration_watchers, [ JID, …]}
Кто будет уведомлен о новом пользователи.
Пример для регистрации нужно посетить https://example.org:5281/register/:

{hosts, ["localhost", "example.org", "example.com"]}.

{listen, [
  ...
  {5281, ejabberd_http, [
    tls,
    {certfile, "/etc/ejabberd/certificate.pem"},
    register
  ]},
  ...
]}.

{modules,
 [
  ...
  {mod_register_web, []},
  ...
 ]}.

mod_roster
Поддержка ростера(списка контактов)
Опции:
{iqdisc, Discipline}
Обработка IQ Roster Management (jabber:iq:roster).
{versioning, false|true}
Подключает версии ростера, по умолчанию выкл.
{store_current_id, false|true}
Если опция включена, версия ростера сохраняется в БД(снижает нагрузку на БД и сервер). Если выкл, номер версии просчитывается на лету. ВАЖНО: Если юзаете mod_shared_roster, mod_shared_roster_odbc или mod_shared_roster_ldap, Нужно отключать эту опцию.
Пример с вкл вресионностью:

{modules,
 [
  ...
  {mod_roster, [{versioning, true}, {store_current_id, true}]},
  ...
 ]}.

mod_service_log
Поддержка логирования конечных пакетов пользователей через службу такую как Bandersnatch. Все пакеты пользователя инкапсулируются в тег route и отсылается на спец сервис.
Опции:
{loggers, [Names, …]}
Список сервисов которые будут получать пакеты
Пример логирование всех пользовательских пакетов к Bandersnatch на bandersnatch.example.com

{modules,
 [
  ...
  {mod_service_log, [{loggers, ["bandersnatch.example.com"]}]},
  ...
 ]}.

mod_shared_roster
Позволяет создавать списки пользователей, и пользователям не нужно ручками добавлять все контакты. Правится только через вебморду. у каждой группы есть уникальный идентификатор и следующие параметры:
Name Имя групы в ростереster.
Description Описание группы.
Members Список учеток в группе, вводится по одному в админке. Специальная директива @all@ соответствует всем зареганым пользователям на вирт хосте(не более 100 пользователей); @online@ Все пользователи онлайн.
Displayed groups
Список групп которым будут отображена в ростер эта группа. группа с других вирт хостов будет идентифицироваться как groupid@vhost
Есть поддержка mod_shared_roster_ldap
mod_sic
Проверка Server IP (XEP-0279). Позволяет клиентам посмотреть их внешний ИП.
Опции:
{iqdisc, Discipline}
Способ обработки urn:xmpp:sic:0.
mod_stats сбор статистики с сервера
Общее к-во зарегистрированных пользователей на текущем вирт. хосте (users/total).
Общее к-во зарегистрированных пользователей на всех вирт. хостах (users/all-hosts/total).
Общее к-во пользователей онлайн на текущем вирт. хосте (users/online).
Общее к-во пользователей онлайн на всех вирт. хостах (users/all-hosts/online).
Опции:
{iqdisc, Discipline}
Способ обработки Statistics Gathering (http://jabber.org/protocol/stats)
Мало клиентов поддерживает эту опцию.
Получить список онлайн пользователей на текущем вирт хосте:

<iq to='example.org' type='get'>
  <query xmlns='http://jabber.org/protocol/stats'>
    <stat name='users/online'/>
  </query>
</iq>

mod_time
Используя XEP, можно узнать время в других расположениях «сущности».
Опции:
{iqdisc, Discipline}
Обработка Entity Time (jabber:iq:time).
mod_vcard
Позволяет хранить и получать vCard.
mod_vcard_ldap тоже самое но через домен.
mod_vcard_xupdate
Клиенты могут хранить аватары в vCard.
mod_version отображать версию софта
Опции:
{show_os, true|false}
Показывать ОС, по умолчанию да.
{iqdisc, Discipline}
Процесс обработки Software Version (jabber:iq:version)
IQ (Info/Query) — особый вид строф, реализующий механизм типа «запрос-ответ». Интерпретация IQ-строф позволяет «сущности» сделать запрос и получить ответ от другой «сущности». Тип данных, передающихся в запросе или ответе определяет пространство имён (namespace) дочернего элемента по отношению к IQ.

Общий конфиг получился где-то таким

%%global override
override_local.
override_acls.
override_global.
%%work in this host
{hosts, ["jabber.domen.ua"]}.
%%ACL
{acl, admin, {user, "bos"}}.
{acl, local, {user_regexp, ""}}.
{acl, shortname, {user_glob, "?"}}.
{acl, shortname, {user_glob, "??"}}.
%%ACCESS
{access, pubsub_createnode, [{allow, all}]}.
{access, register, [{deny, shortname},{allow, all}]}.
{access, c2s, [{deny, blocked}, {allow, all}]}.
{access, c2s_shaper, [{none, admin}, {normal, all}]}.
{access, s2s_shaper, [{fast, all}]}.
{access, announce, [{allow, admin}]}.
{access, configure, [{allow, admin}]}.
{access, muc_admin, [{allow, admin}]}.
{access, muc, [{allow, all}]}.
%%SHAPER
{shaper, normal, {maxrate, 128000}}.
{shaper, fast, {maxrate, 256000}}.
%%OTHER
{auth_method, odbc}.
{odbc_server, {mysql, "localhost", "jabber", "jabber_admin", "passwordddd"}}.
{odbc_pool_size, 3}.
{max_user_sessions, 10000}.
{language, "ru"}.
{welcome_message, {"Welcome!","Problems? Just call 12640"}}.
{resource_conflict, closeold}.
%%% listen ports
{listen,
 [
   {5222, ejabberd_c2s, [
   {certfile, "/usr/local/etc/ejabberd/ssl.pem"}, starttls,
   {access, c2s},
   {shaper, c2s_shaper},
   {max_stanza_size, 65536},
   zlib
   ]},
 {5280, ejabberd_http, [
 web_admin,
 {certfile, "/usr/local/etc/ejabberd/ssl.pem"},
 tls
 ]}
 ]}.
{s2s_use_starttls, true}.
{s2s_certfile, "/usr/local/etc/ejabberd/ssl.pem"}.
{outgoing_s2s_port, 5269}.
%%MODULES
{modules,
[
{mod_register, [{welcome_message, {"Welcome!","Welcome to this Jabber server."}},{registration_watchers,["[email protected]"]},{access, register}]},
{mod_roster_odbc,[]},
{mod_shared_roster_odbc,[]},
{mod_privacy_odbc, []},
{mod_adhoc, []},
{mod_announce_odbc, [{access, announce}]},
{mod_configure, []},
{mod_caps, []},
{mod_disco, []},
{mod_stats, []},
%%{mod_vcard_odbc, [{search, true},{matches, infinity},{allow_return_all, true}]},
{mod_offline_odbc,[]},
{mod_private_odbc, []},
{mod_pubsub,[{access_createnode, pubsub_createnode},{ignore_pep_from_offline, true}, {last_item_cache, false},{plugins, ["flat", "hometree", "pep"]}]},
{mod_muc_odbc, [{access, all},{access_create, muc_admin}, {access_persistent, muc_admin}, {access_admin, muc_admin}, {history_size, 30}, {min_message_interval, 0.4}, {min_presence_interval, 4} ]},
%%{mod_muc_log, []},     ------------not implemented by me
{mod_time, []},
{mod_last_odbc, []},
%%{mod_pres_counter, []},
{mod_proxy65, [{host, "proxy40.jabber.domen.ua"},{name, "File Transfer Proxy"},{ip, {10,109,68,40}},{port, 7778},{max_connections, 5}]},
{mod_version, [{show_os, true}]}
]}.