Установка и настройка ejabberd (XMPP)

В мире существует довольно большое количество различных протоколов обмена сообщениями, среди которых хочется выделить открытый протокол XMPP. Протокол XMPP спроектирован легко расширяемым, поэтому помимо возможности передачи текстовых сообщений, имеется возможность передачи голоса, видео и файлов по сети. Проект ejabberd является одним из самых популярных XMPP серверов, который поддерживает внушительное количество стандартов (XEP) и в тоже время претендует на скромное количество ресурсов системы, несмотря на то, что написан на Erlang. К основным достоинствам ejabberd можно отнести:

  • модульная архитектура сервера;
  • поддержка работы группы ejabberd серверов в кластере;
  • присутствует веб-интерфейс для администрирования;
  • поддержка различных языков (в том числе русский);
  • поддержка большого количества стандартов протокола XMPP;
  • возможность использования внешних хранилищ через ODBC для хранения данных (PostgreSQL, LDAP и т.д.);
  • поддержка SASL и StartTLS на клиентских и межсерверных соединениях.

Установка и настройка сервера, описанная в данной статье, происходила на базе операционной системы FreeBSD версии 9.1, а хранение всей служебной информации было возложено на СУБД PostgreSQL 9.1. В данной статье ничего не будет сказано про установку PostgreSQL, поскольку на сайте уже есть соответствующий материал.

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

  1. # cd /usr/ports/lang/erlang
  2. # make install clean

Из предложенных опций выбраны были следующие:

  • HIPE
  • KQUEUE
  • ODBC
  • OPENSSL
  • SCTP
  • SMP
  • THREADS
  • UNIXODBC

После завершения установки Erlang можно переходить установке ejabberd. На момент написания статьи в портах доступна версия ejabberd 2.1.11.

  1. # /usr/ports/net-im/ejabberd
  2. # make install clean

Из предложенных опций я выбрал всего одну — ODBC. Для обеспечения связи ejabberd с PostgreSQL необходимо установить соответствующий драйвер ODBC, которого в портах, к сожалению нет. В связи с этим придется SVN,ом выкачать исходники модуля, скомпилить его и установить руками. Subversion устанавливается через порт /usr/ports/devel/subversion (в опциях обязательно поставьте галку напротив NEON). Кому не охота заниматься установкой Subversion, в конце статьи прикреплен архив с исходниками (последняя актуальная версия на момент написания статьи).
  1. # pwd
  2. /usr/local/etc/ejabberd
  3. # svn checkout https://svn.process-one.net/ejabberd-modules modules
  4. # cd modules/pgsql/trunk
  5. # ./build.sh
  6. # chown root:wheel ebin/*
  7. # chmod 444 ebin/*
  8. # mv ebin/* /usr/local/lib/erlang/lib/ejabberd-2.1.11/ebin/

Хочу отметить, что с драйвером скачаются и другие модули. Некоторые модули представляют особый интерес, например, mod_webpresence, который позволяет определять статус аккаунта посредством Web в виде иконки, обычного текста, xml и т.п. Компиляция и установка модуля mod_webpresence аналогична ODBC драйверу PostgreSQL, а про его подключение и конфигурацию написано в файле mod_webpresence/readme.txt (далее в статье будет приведен пример конфигурации модуля). На этом моменте установку ejabberd можно считать завершенной и переходить ко втором этапу — конфигурированию.

На втором этапе первым делом необходимо создать базу данных, пользователя базы данных и произвести импорт схемы БД, с которой будет работать ejabberd. Создать базу данных можно любым удобным для вас способом, я сделал это консольным клиентом psql.

  1. CREATE ROLE "ejabberd" WITH LOGIN ENCRYPTED PASSWORD 'your_pass';
  2. CREATE DATABASE "ejabberd" WITH OWNER "ejabberd" ENCODING 'UTF-8';

P.S. В PostgreSQL версии 9.1 и выше по умолчанию включен параметр standard_conforming_strings, из-за которого в ejabberd отваливается сервис MUC с ошибкой: 503 service unavailable. Поэтому для созданной базы данных необходимо отключить данный параметр:

  1. ALTER DATABASE "ejabberd" SET standard_conforming_strings = off;

Теперь можно произвести импорт схемы базы данных.

  1. # cd /usr/ports/net-im/ejabberd
  2. # make extract
  3. # psql -U ejabberd -W -f work/ejabberd-2.1.11/src/odbc/pg.sql ejabberd
  4. # make clean

На данном этапе осталось только рихтануть конфиги и можно запускать сервер в работу. Конфигурационные файлы сервера хранятся в директории — /usr/local/etc/ejabberd. После чистой установки в директории будет три файла с расширением *.exaxmple, переименуйте/скопируйте файлы убрав расширение. Таким образом, в директории /usr/local/etc/ejabberd должны быть следующие конфигурационные файлы:

  • ejabberd.cfg — главный конфигурационный файл;
  • ejabberdctl.cfg — конфигурационный файл утилиты ejabberdctl;
  • inetrc — конфигурационный файл для DNS.

Файл ejabberd.cfg у меня выглядит так:

  1. %%%
  2. %%%               Конфигурационный файл ejabberd
  3. %%%
  4. %%%'
  5.  
  6. %%% Параметры, используемые в данном файле подробно описаны
  7. %%% в документации "Installation and Operation Guide".
  8. %%% Документацию можно найти в сети по такому адресу:
  9. %%% http://www.process-one.net/en/ejabberd/docs/
  10.  
  11. %%% Конфигурационный файл оформлен в соответствии с синтаксисом Erlang.
  12. %%% В случае, если вы хотите немного разобраться в синтаксисе, то вот
  13. %%% основные сведения:
  14. %%%
  15. %%%  - С символа % начинаются комментарии
  16. %%%
  17. %%%  - Каждый терм заканчивается точкой, например:
  18. %%%      override_global.
  19. %%%
  20. %%%  - Кортеж имеет строгое определение, так элементы
  21. %%%    заключаются в {} и разделяются запятой:
  22. %%%      {loglevel, 4}.
  23. %%%
  24. %%%  - Список заключается в квадратные скобки []
  25. %%%    и может состоять из нескольких элементов:
  26. %%%      [http_poll, web_admin, tls]
  27. %%%
  28. %%%  - Все ключевые слова в конфиге ejabberd задаются
  29. %%%    в нижнем регистре. Строки заключаются в двойные кавычки
  30. %%%    и могут содержать любые символы.
  31. %%%      {language, "en"}.
  32. %%%      {ldap_rootdn, "dc=example,dc=com"}.
  33. %%%
  34. %%%  - Данный терм содержит кортеж, список, ключевое слово и строки:
  35. %%%      {hosts, ["jabber.example.net", "im.example.com"]}.
  36. %%%
  37.  
  38.  
  39. %%%.   =======================
  40. %%%'   Переопределение сохраненных параметров
  41.  
  42. %%
  43. %% Переопределить старые значения, сохраненные в БД.
  44. %%
  45.  
  46. %%
  47. %% Переопределить глобальные параметры (разделяемые между всеми узлами ejabberd в кластере).
  48. %%
  49. %%override_global.
  50.  
  51. %%
  52. %% Переопределить локальные параметры (только для конкретного ejabberd узла).
  53. %%
  54. %%override_local.
  55.  
  56. %%
  57. %% Очистить Access Control Lists перед применением нового (х/з как понять, но наверно нового, то есть из этого файла).
  58. %%
  59. %%override_acls.
  60.  
  61.  
  62. %%%.   =========
  63. %%%'   Отладка
  64.  
  65. %%
  66. %% loglevel: уровень отладки.
  67. %% 0: не выводить ничего в лог (не рекомендуется)
  68. %% 1: выводить в лог сообщения, только о серьезных ошибках
  69. %% 2: выводить в лог сообщения о ошибках
  70. %% 3: выводить в лог сообщения о предупреждениях
  71. %% 4: выводить в лог информационные сообщения
  72. %% 5: все, что можно выводить в лог файл
  73. %%
  74. {loglevel, 3}.
  75.  
  76. %%
  77. %% watchdog_admins: Полезно только для разработчиков. Если процессы ejabberd
  78. %% потребляют слишком много памяти, то отправить об этом уведомление на
  79. %% указанные здесь адреса.
  80. %%
  81. %%{watchdog_admins, ["bob@example.com"]}.
  82.  
  83.  
  84. %%%.   ================
  85. %%%'   Обслуживаемые домены
  86.  
  87. %%
  88. %% hosts: список обслуживаемых доменов.
  89. %% Вы можете определить один или несколько доменов, например:
  90. %% {hosts, ["example.net", "example.com", "example.org"]}.
  91. %%
  92. {hosts, ["info-x.org"]}.
  93.  
  94. %%
  95. %% route_subdomains: Делегировать поддомены на другие XMPP сервера.
  96. %% Например, если ejabberd обслуживает домен example.org и вы хотите,
  97. %% чтоб он взаимодействовал с другим XMPP сервером, обслуживающим
  98. %% домен  im.example.org.
  99. %%
  100. %%{route_subdomains, s2s}.
  101.  
  102.  
  103. %%%.   ===============
  104. %%%'   Сетевые параметры
  105.  
  106. %%
  107. %% listen: указывает, на каких портах принимать подключения каждому
  108. %% из ejabberd сервисов. Так же возможно задать опции отдельно для
  109. %% каждого сервиса.
  110. %%
  111. {listen,
  112.  [
  113.   %%
  114.   %% Сервис для работы с клиентами
  115.   %%
  116.   {5222, ejabberd_c2s, [
  117.       %%
  118.       %% Для поддержки шифрованных подключений,
  119.       %% раскомментируйте строку и укажите полный
  120.       %% путь до сертификата:
  121.       %%
  122.       {certfile, "/usr/local/etc/ejabberd/ssl.pem"}, starttls,
  123.       {access, c2s},
  124.       {shaper, c2s_shaper},
  125.       {max_stanza_size, 65536},
  126.       zlib
  127.     ]},
  128.  
  129.   %%
  130.   %% Включить поддержку старого метода для SSL подключений:
  131.   %%
  132.   {5223, ejabberd_c2s, [
  133.       {access, c2s},
  134.       {shaper, c2s_shaper},
  135.       {certfile, "/usr/local/etc/ejabberd/ssl.pem"}, tls,
  136.       {max_stanza_size, 65536}
  137.     ]},
  138.  
  139.   %%
  140.   %% Сервис для работы с другими XMPP серверами
  141.   %%
  142.   {5269, ejabberd_s2s_in, [
  143.       {shaper, s2s_shaper},
  144.       {max_stanza_size, 131072}
  145.     ]},
  146.  
  147.   %%
  148.   %% ejabberd_service: взаимодействует с внешними компонентами (транспорты и т.п.)
  149.   %%
  150.   %%{8888, ejabberd_service, [
  151.   %%			    {access, all},
  152.   %%			    {shaper_rule, fast},
  153.   %%			    {ip, {127, 0, 0, 1}},
  154.   %%			    {hosts, ["icq.example.org", "sms.example.org"],
  155.   %%			     [{password, "secret"}]
  156.   %%			    }
  157.   %%			   ]},
  158.  
  159.   %%
  160.   %% ejabberd_stun: обрабатывает запросы STUN
  161.   %%
  162.   {{3478, udp}, ejabberd_stun, []},
  163.  
  164.   %% HTTP сервис (описание отдельных опций доступно в документации)
  165.   {{5280, "127.0.0.1"}, ejabberd_http, [
  166.       {request_handlers, [
  167.             %%{["pub", "archive"], mod_http_fileserver}
  168.  
  169.             %% указываем по какому адресу будет доступен
  170.             %% функционал сервиса webpresence
  171.             {["presence"], mod_webpresence}
  172.           ]},
  173.       captcha,
  174.       http_bind,
  175.       http_poll
  176.       %%register,
  177.       %%web_admin
  178.     ]}
  179.  
  180.  ]}.
  181.  
  182. %%
  183. %% s2s_use_starttls: Включить STARTTLS + Dialback для S2S подключений.
  184. %% Возможные значения: false optional required required_trusted
  185. %% При включении, необходимо указать сертификат в опции ниже.
  186. %%
  187. {s2s_use_starttls, optional}.
  188.  
  189. %%
  190. %% s2s_certfile: путь до сертификата.
  191. %%
  192. {s2s_certfile, "/usr/local/etc/ejabberd/ssl.pem"}.
  193.  
  194. %%
  195. %% domain_certfile: использовать различные сертификаты для обслуживаемых доменов.
  196. %%
  197. %%{domain_certfile, "example.org", "/path/to/example_org.pem"}.
  198. %%{domain_certfile, "example.com", "/path/to/example_com.pem"}.
  199.  
  200. %%
  201. %% S2S белый или черный список
  202. %%
  203. %% Политика s2s по умолчанию для неизвестных хостов.
  204. %%
  205. {s2s_default_policy, allow}.
  206.  
  207. %%
  208. %% Разрешить или запретить взаимодействие с конкретными серверами.
  209. %%
  210. %%{{s2s_host, "goodhost.org"}, allow}.
  211. %%{{s2s_host, "badhost.org"}, deny}.
  212.  
  213. %%
  214. %% Опции для исходящих S2S подключений
  215. %%
  216. %% Желаемые протоколы (будет использоваться первый доступный) и таймаут
  217. %% в миллисекундах.
  218. %%
  219. {outgoing_s2s_options, [ipv4], 10000}.
  220.  
  221.  
  222. %%%.   ==============
  223. %%%'   Аутентификация
  224.  
  225. %%
  226. %% auth_method: метод аутентификации пользователей.
  227. %% По умолчанию используется внутренний метод аутентификации.
  228. %% Если вы хотите использовать другой метод аутентификации,
  229. %% то закомментируйте терм ниже и раскомментируйте нужный вам.
  230. %%
  231. %%{auth_method, internal}.
  232. %%
  233. %% Хранить пароли в открытом или хешированном виде:
  234. %%{auth_password_format, plain}.
  235. %%{auth_password_format, scram}.
  236. %%
  237. %% Задание вручную FQDN,  если ejabberd не смог корректно
  238. %% его определить:
  239. {fqdn, "xmpp.info-x.org"}.
  240.  
  241. %%
  242. %% Аутентификация через внешний скрипт.
  243. %% Скрипт должен быть доступным для запуска сервером ejabberd.
  244. %%
  245. %%{auth_method, external}.
  246. %%{extauth_program, "/path/to/authentication/script"}.
  247.  
  248. %%
  249. %% Аутентификация через ODBC
  250. %% Не забудьте задать параметры подключения к СУБД в секции ниже.
  251. %%
  252. {auth_method, odbc}.
  253.  
  254. %%
  255. %% Аутентификация через PAM
  256. %%
  257. %%{auth_method, pam}.
  258. %%{pam_service, "pamservicename"}.
  259.  
  260. %%
  261. %% Аутентификация через LDAP
  262. %%
  263. %%{auth_method, ldap}.
  264. %%
  265. %% Список серверов LDAP:
  266. %%{ldap_servers, ["localhost"]}.
  267. %%
  268. %% Использовать шифрованное подключение к LDAP:
  269. %%{ldap_encrypt, none}.
  270. %%{ldap_encrypt, tls}.
  271. %%
  272. %% Порт для подключение к LDAP:
  273. %%{ldap_port, 389}.
  274. %%{ldap_port, 636}.
  275. %%
  276. %% Пользователь для поиска по LDAP:
  277. %%{ldap_rootdn, "dc=example,dc=com"}.
  278. %%
  279. %% Пароль для пользователя LDAP:
  280. %%{ldap_password, "******"}.
  281. %%
  282. %% Корень для поиска в LDAP:
  283. %%{ldap_base, "dc=example,dc=com"}.
  284. %%
  285. %% Атрибут в LDAP, содержащий ID пользователя:
  286. %%{ldap_uids, [{"mail", "%u@mail.example.org"}]}.
  287. %%
  288. %% Фильтр для поиска в LDAP:
  289. %%{ldap_filter, "(objectClass=shadowAccount)"}.
  290.  
  291. %%
  292. %% Anonymous login support:
  293. %%   auth_method: anonymous
  294. %%   anonymous_protocol: sasl_anon | login_anon | both
  295. %%   allow_multiple_connections: true | false
  296. %%
  297. %%{host_config, "public.example.org", [{auth_method, anonymous},
  298. %%                                     {allow_multiple_connections, false},
  299. %%                                     {anonymous_protocol, sasl_anon}]}.
  300. %%
  301. %% To use both anonymous and internal authentication:
  302. %%
  303. %%{host_config, "public.example.org", [{auth_method, [internal, anonymous]}]}.
  304.  
  305.  
  306. %%%.   ==============
  307. %%%'   Параметры БД
  308.  
  309. %% По умолчанию ejabberd использует внутреннюю БД Mnesia,
  310. %% поэтому настройка данной секции для вас может быть не обязательна.
  311. %% Если же у вас есть необходимость использовать внешнее хранилище,
  312. %% то в данной секции приведены примеры конфигурации ejabberd
  313. %% для работы с внешними хранилищами.
  314. %% За деталями обращайтесь в документацию ejabberd.
  315.  
  316. %%
  317. %% MySQL:
  318. %%
  319. %%{odbc_server, {mysql, "server", "database", "username", "password"}}.
  320. %%
  321. %% При необходимости можно указать порт для подключения:
  322. %%{odbc_server, {mysql, "server", 1234, "database", "username", "password"}}.
  323.  
  324. %%
  325. %% PostgreSQL:
  326. %%
  327. {odbc_server, {pgsql, "localhost", "ejabberd", "ejabberd", "1234"}}.
  328. %%
  329. %% При необходимости можно указать порт для подключения:
  330. %%{odbc_server, {pgsql, "server", 1234, "database", "username", "password"}}.
  331. %%
  332. %% Если вы используете PostgreSQL и у вас очень большая БД (по размеру)
  333. %% и нужен быстрая, но менее точная замена для "select count(*) from users",
  334. %% то включите данную опцию.
  335. %%
  336. %%{pgsql_users_number_estimate, true}.
  337.  
  338. %%
  339. %% ODBC совместимый или MSSQL сервер:
  340. %%
  341. %%{odbc_server, "DSN=ejabberd;UID=ejabberd;PWD=ejabberd"}.
  342.  
  343. %%
  344. %% Максимальное количество открытых подключений к СУБД для каждого
  345. %% виртуального хоста:
  346. %%
  347. {odbc_pool_size, 3}.
  348.  
  349. %%
  350. %% Выполнять с определенным интервалом бесполезный SQL запрос,
  351. %% для поддерживания подключения к базе данных (keep alive).
  352. %% интервал задается в секундах: например, 28800 значит 8 часов
  353. %%
  354. %%{odbc_keepalive_interval, undefined}.
  355.  
  356.  
  357. %%%.   ===============
  358. %%%'   Шейперы
  359.  
  360. %%
  361. %% Шейпер "normal" с лимитом скорости в 1000 B/s
  362. %%
  363. {shaper, normal, {maxrate, 1000}}.
  364.  
  365. %%
  366. %% Шейпер "fast" с лимитом скорости в 50000 B/s
  367. %%
  368. {shaper, fast, {maxrate, 50000}}.
  369.  
  370. %%
  371. %% Максимальное количество элементов в очереди FSM.
  372. %% В документации подробно расписано значение данного параметра.
  373. %%
  374. {max_fsm_queue, 1000}.
  375.  
  376.  
  377. %%%.   ====================
  378. %%%'   Списки контроля доступа
  379.  
  380. %%
  381. %% ACL 'admin'  дает права администратора конкретным XMPP аккаунтам.
  382. %% При необходимости вы можете указать здесь несколько записей.
  383. %%
  384. %%{acl, admin, {user, "aleksey", "localhost"}}.
  385. %%{acl, admin, {user, "ermine", "example.org"}}.
  386. {acl, admin, {user, "nekit", "info-x.org"}}.
  387.  
  388.  
  389. %%
  390. %% Заблокированные пользователи
  391. %%
  392. %%{acl, blocked, {user, "baduser", "example.org"}}.
  393. %%{acl, blocked, {user, "test"}}.
  394.  
  395. %%
  396. %% Локальные пользователи: не изменяйте данную ACL.
  397. %%
  398. {acl, local, {user_regexp, ""}}.
  399.  
  400. %%
  401. %% Еще примеры ACL
  402. %%
  403. %%{acl, jabberorg, {server, "jabber.org"}}.
  404. %%{acl, aleksey, {user, "aleksey", "jabber.ru"}}.
  405. %%{acl, test, {user_regexp, "^test"}}.
  406. %%{acl, test, {user_glob, "test*"}}.
  407.  
  408. %%
  409. %% Определение ACL для виртуального хоста.
  410. %%
  411. %%{host_config, "localhost",
  412. %% [
  413. %%  {acl, admin, {user, "bob-local", "localhost"}}
  414. %% ]
  415. %%}.
  416.  
  417.  
  418. %%%.   ============
  419. %%%'   Правила доступа
  420.  
  421. %% Максимальное количество одновременных подключений к серверу для одного пользователя:
  422. {access, max_user_sessions, [{10, all}]}.
  423.  
  424. %% Максимальное количество offline сообщений для пользователя:
  425. {access, max_user_offline_messages, [{5000, admin}, {300, all}]}.
  426.  
  427. %% Правило доступа для локальных пользователей (This rule allows access only for local users):
  428. {access, local, [{allow, local}]}.
  429.  
  430. %% Только не заблокированные пользователи могут подключаться к серверу:
  431. {access, c2s, [{deny, blocked},
  432. 	       {allow, all}]}.
  433.  
  434. %% Ограничение скорости для пользователей, кроме админов:
  435. {access, c2s_shaper, [{none, admin},
  436. 		      {normal, all}]}.
  437.  
  438. %% Все S2S соединения пропускаются через шейпер "fast"
  439. {access, s2s_shaper, [{fast, all}]}.
  440.  
  441. %% Только админы могут отправлять объявления (announcement messages) пользователям:
  442. {access, announce, [{allow, admin}]}.
  443.  
  444. %% Только админы могут использовать интерфейс конфигурирования:
  445. {access, configure, [{allow, admin}]}.
  446.  
  447. %% Админам сервера разрешено админить сервис MUC:
  448. {access, muc_admin, [{allow, admin}]}.
  449.  
  450. %% Локальные пользователи могут создавать комнаты:
  451. {access, muc_create, [{allow, local}]}.
  452.  
  453. %% Всем пользователям разрешено использовать сервис MUC:
  454. {access, muc, [{allow, all}]}.
  455.  
  456. %% Только локальные пользователи могут создавать узлы Pubsub:
  457. {access, pubsub_createnode, [{allow, local}]}.
  458.  
  459. %% Регистрация по требованию позволяет любому зарегистрироваться на сервере.
  460. %% Чтобы запретить, замените 'allow' на 'deny'.
  461. {access, register, [{deny, all}]}.
  462.  
  463. %% Частота регистрации аккаунтов с конкретного IP, то есть можно создать
  464. %% один аккаунт в течении определенного времени. Задается в секундах.
  465. %% Чтобы выключить, укажите infinity .
  466. %%{registration_timeout, 600}.
  467.  
  468. %%
  469. %% Права доступа для виртуального хоста.
  470. %%
  471. %%{host_config, "localhost",
  472. %% [
  473. %%  {access, c2s, [{allow, admin}, {deny, all}]},
  474. %%  {access, register, [{deny, all}]}
  475. %% ]
  476. %%}.
  477.  
  478.  
  479. %%%.   ================
  480. %%%'   Язык по умолчанию
  481.  
  482. %%
  483. %% language: Язык по умолчанию для сообщений от сервера.
  484. %%
  485. {language, "ru"}.
  486.  
  487. %%
  488. %% Различные языки для каждого из виртуальных хостов.
  489. %%
  490. %%{host_config, "localhost",
  491. %% [{language, "ru"}]
  492. %%}.
  493.  
  494.  
  495. %%%.   =======
  496. %%%'   Капча
  497.  
  498. %%
  499. %% Полный путь до скрипта, генерирующего изображение капчи.
  500. %% С дистрибутивом ejabberd для генерации изображения капчи поставляется
  501. %% скрипт, который использует тулзу convert из пакета ImageMagick.
  502. %% Во FreeBSD скрипт лежит тут:
  503. %% /usr/local/lib/erlang/lib/ejabberd-2.1.11/priv/bin/captcha.sh
  504. %%
  505. %% Устанавливать ImageMagick для такой мелкой цели мне не захотелось.
  506. %% У меня в системе была установлена библиотека gd, поэтому я пошел
  507. %% другим путем: установил для perl модуль /usr/ports/graphics/p5-GD
  508. %% для работы с либой gd и написал скрипт для генерации капчи на perl.
  509. %% Если кому нужно, то в конце статьи я прикрепил его.
  510. %%
  511. {captcha_cmd, "/usr/local/etc/ejabberd/captcha/captcha.pl"}.
  512.  
  513. %%
  514. %% URL и порт, на который будут направлены пользователи для проверки капчей.
  515. %% У меня HTTP сервис ejabberd спрятан за апачем. Если делать напрямую, то
  516. %% параметр может иметь вид: {captcha_host, "http:/hostname:5280"}.
  517. %%
  518. {captcha_host, "http://www.fastbsd.ru/ejabberd"}.
  519.  
  520. %%
  521. %% Ограничение запросов к капче в минуту для JID/IP (защита от DoS).
  522. %%
  523. {captcha_limit, 5}.
  524.  
  525. %%%.   =======
  526. %%%'   Конфигурация модулей
  527.  
  528. %%
  529. %% Указанные здесь модули будут доступны на всех виртуальных хостах.
  530. %% Описание всех опций, которые здесь использованы, приведено в документации.
  531. %% Так же хочу отметить, что некоторые модули имеют постфикс в виде _odbc,
  532. %% это необходимо для их работы с БД.
  533. %%
  534. {modules,
  535.  [
  536.   {mod_adhoc,    []},
  537.   {mod_announce_odbc, [{access, announce}]}, % recommends mod_adhoc
  538.   {mod_blocking_odbc,[]}, % requires mod_privacy
  539.   {mod_caps,     []},
  540.   {mod_configure,[]}, % requires mod_adhoc
  541.   {mod_disco,    [{all, "admin-address", ["mailto:admin@info-x.org", "xmpp:nekit@info-x.org"]}]},
  542.   %%{mod_echo,   [{host, "echo.localhost"}]},
  543.   {mod_irc_odbc,      [{access, all}, {default_encoding, "UTF-8"}]},
  544.   {mod_http_bind, []},
  545.   %%{mod_http_fileserver, [
  546.     %%{docroot, "/var/www"},
  547.     %%{accesslog, "/var/log/ejabberd/access.log"}
  548.    %%]},
  549.   {mod_last_odbc,   []},
  550.   {mod_muc_odbc,      [
  551.       {host, "conference.@HOST@"},
  552.       {access, muc},
  553.       {access_create, muc_create},
  554.       {access_persistent, muc_create},
  555.       {access_admin, muc_admin},
  556.       {history_size, 30},
  557.       {max_users, 1000},
  558.       {min_presence_interval, 4},
  559.       % параметры по умолчанию для новой комнаты
  560.       {default_room_options,		[
  561.             {allow_change_subj, false},
  562.             {allow_private_messages, true},
  563.             {allow_private_messages_from_visitors, moderators},
  564.             {allow_user_invites, false},
  565.             {allow_visitor_nickchange, false},
  566.             {anonymous, true},
  567.             {captcha_protected, true},
  568.             {logging, true},
  569.             {members_by_default, false},
  570.             {members_only, false},
  571.             {moderated, true},
  572.             {password_protected, false},
  573.             {persistent, true},
  574.             {public, true},
  575.             {public_list, false}
  576.           ]}
  577.      ]},
  578.   {mod_muc_log,  [
  579.       {cssfile, false},
  580.       {dirtype, plain},
  581.       {file_format, html},
  582.       {outdir, "/var/log/ejabberd/muc"},
  583.       {spam_prevention, true},
  584.       {timezone, local},
  585.       {top_link, {"http://www.info-x.org/", "www.info-x.org"}}
  586.     ]},
  587.   {mod_offline_odbc,  [{access_max_user_messages, max_user_offline_messages}]},
  588.   {mod_ping,     [
  589.       {send_pings, true},
  590.       {ping_interval, 600},
  591.       {timeout_action, kill}
  592.     ]},
  593.   %%{mod_pres_counter,[{count, 5}, {interval, 60}]},
  594.   {mod_privacy_odbc,  []},
  595.   {mod_private_odbc,  []},
  596.   %%{mod_proxy65,[]},
  597.   {mod_pubsub_odbc,   [
  598.       {access_createnode, pubsub_createnode},
  599.       {ignore_pep_from_offline, true}, % reduces resource comsumption, but XEP incompliant
  600.       %%{ignore_pep_from_offline, false},  % XEP compliant, but increases resource comsumption
  601.       {last_item_cache, false},
  602.       {plugins, ["flat_odbc", "hometree_odbc", "pep_odbc"]}  % pep requires mod_caps
  603.     ]},
  604.   {mod_register, [
  605.       %%
  606.       %% Защитить процесс регистрации капчей.
  607.       %%
  608.       %%{captcha_protected, true},
  609.  
  610.       %%
  611.       %% Минимальная энтропия для пароля.
  612.       %%
  613.       %%{password_strength, 32},
  614.  
  615.       %%
  616.       %% После успешной регистрации пользователь получит
  617.       %% сообщение, заданное здесь.
  618.       %%
  619.       {welcome_message, {"Welcome!", "Hi.\nWelcome to this XMPP server."}},
  620.  
  621.       %%
  622.       %% Отправлять уведомление на указанные здесь аккаунты
  623.       %% о регистрации нового пользователя на сервере..
  624.       %%
  625.       {registration_watchers, ["nekit@info-x.org"]},
  626.  
  627.       %%
  628.       %% Ограничение доступа к регистрации по подсетям
  629.       %%
  630.       {ip_access, [{allow, "127.0.0.0/8"}, {deny, "0.0.0.0/0"}]},
  631.  
  632.       %%
  633.       %% Локальные c2s или удаленные s2s пользователи не могут
  634.       %% регистрировать аккаунты (см. в документацию)
  635.       %%
  636.       %%{access_from, deny},
  637.  
  638.       {access, register}
  639.     ]},
  640.   %%{mod_register_web, [
  641.       %%
  642.       %% Отправлять уведомление на указанные здесь аккаунты
  643.       %% о регистрации нового пользователя на сервере..
  644.       %%
  645.       %%{registration_watchers, ["admin1@example.org"]}
  646.   %%		 ]},
  647.   {mod_roster_odbc,   [
  648.       {versioning, true},
  649.       {store_current_id, true}
  650.     ]},
  651.   %%{mod_service_log,[]},
  652.   %%{mod_shared_roster_odbc,[]},
  653.   %%{mod_sic,      []},
  654.   {mod_stats,    []},
  655.   {mod_time,     []},
  656.   {mod_vcard_odbc,    [
  657.       {search, true},
  658.       {matches, 50},
  659.       {allow_return_all, false}
  660.     ]},
  661.   {mod_vcard_xupdate_odbc, []},
  662.   {mod_version,  [
  663.       {show_os, true}
  664.     ]},
  665.   % конфигурация модуля webpresence
  666.   {mod_webpresence, [
  667.       {host, "webstatus.@HOST@"},
  668.       {access, local},
  669.       {pixmaps_path, "/usr/local/etc/ejabberd/modules/mod_webpresence/trunk/data/pixmaps"},
  670.       %%{port, 80},
  671.       {path, "presence"},
  672.       {baseurl, "http://www.fastbsd.ru/ejabberd/presence/"}
  673.     ]}
  674.  ]}.
  675.  
  676. %%
  677. %% Параметры модулей отдельно для каждого виртуального хоста.
  678. %%
  679. %%{host_config, "localhost",
  680. %% [{{add, modules},
  681. %%   [
  682. %%    {mod_echo, [{host, "mirror.localhost"}]}
  683. %%   ]
  684. %%  }
  685. %% ]}.
  686.  
  687.  
  688. %%%.
  689. %%%'
  690.  
  691. %%% $Id$
  692.  
  693. %%% Local Variables:
  694. %%% mode: erlang
  695. %%% End:
  696. %%% vim: set filetype=erlang tabstop=8 foldmarker=%%%',%%%. foldmethod=marker:

Файл ejabberdctl.cfg у меня выглядит так:
  1. #
  2. # В данном файле вы можете изменить опции, которые передает
  3. # утилита ejabberdctl в переменные окружение для erlang,а.
  4. #
  5.  
  6. #' POLL: Kernel polling ([true|false])
  7. #
  8. # Для использования данной фичи необходимо, чтобы ядро и erlang
  9. # были скомпилированы с поддержкой polling,а .
  10. #
  11. # По умолчанию: true
  12. #
  13. POLL=true
  14.  
  15. #.
  16. #' SMP: поддержка SMP ([enable|auto|disable])
  17. #
  18. # В документации Erlang/OTP сказано:
  19. # enable: запуск Erlang с поддержкой SMP. Может произойти сбой
  20. #   при запуске, если SMP не поддерживается.
  21. # auto: запуск Erlang с поддержкой SMP только, если оно доступно
  22. #   и в системе имеется более одного логического/физического
  23. #   процессора.
  24. # disable: запуск Erlang без поддержки SMP.
  25. #
  26. # По умолчанию: auto
  27. #
  28. SMP=auto
  29.  
  30. #.
  31. #' ERL_MAX_PORTS: Максимальное количество одновременно открытых портов Erlang,ом
  32. #
  33. # На каждое подключение ejabberd использует два или три порта:
  34. #   для клиента или для другого Jabber сервера.
  35. # Примите это во внимание, устанавливая данный предел.
  36. #
  37. # По умолчанию: 32000
  38. # Maximum: 268435456
  39. #
  40. #ERL_MAX_PORTS=32000
  41.  
  42. #.
  43. #' FIREWALL_WINDOW: Диапазон допустимых портов (полезно при использовании фаервола)
  44. #
  45. # Если ejabberd работает в кластере и в системе включен фаервол,
  46. # то возможно задать статический диапазон портов, используемых
  47. # для взаимодействия узлов (node).
  48. #
  49. # По умолчанию: not defined
  50. # Пример: 4200-4210
  51. #
  52. #FIREWALL_WINDOW=
  53.  
  54. #.
  55. #' INET_DIST_INTERFACE: IP на котором принимаются соединения с других узлов (node)
  56. #
  57. # Соединение, например, может устанавливать ejabberdctl или 
  58. # другие узлы (node) из кластера.
  59. # Учтите, что IP указывается в соответствии с синтаксисом Erlang.
  60. #
  61. # Default: {127,0,0,1}
  62. #
  63. INET_DIST_INTERFACE={127,0,0,1}
  64.  
  65. #.
  66. #' ERL_EPMD_ADDRESS: IP на котором сервис epmd принимает подключения
  67. #
  68. # ВАЖНО: Данная опция работает только с Erlang/OTP R14B03 и новее.
  69. #
  70. # Параметр может принимать список IP адресов, разделенных
  71. # запятыми. Следует отметить, что демон epmd будет принимать
  72. # подключения на 127.0.0.1, даже если он не указан в списке.
  73. # По умолчанию соединения принимаются отовсюду.
  74. #
  75. # По умолчанию: 0.0.0.0
  76. #
  77. ERL_EPMD_ADDRESS=127.0.0.1
  78.  
  79. #.
  80. #' ERL_PROCESSES: Максимальное количество процессов Erlang
  81. #
  82. # Для работы ejabberd, Erlang порождает необходимое количество процессов
  83. # (которые сами по себе потребляют очень мало ресурсов). При большой
  84. # нагрузке на ejabberd данный лимит может быть исчерпан, что повлечен
  85. # за собой увеличение задержек при работе с клиентами. Так как слово
  86. # "процесс" употребляется в контексте Erlang (а не операционной системы),
  87. # то не стоит волноваться о том, что тут указано довольно большое значение.
  88. #
  89. # По умолчанию: 250000
  90. # Максимум: 268435456
  91. #
  92. #ERL_PROCESSES=250000
  93.  
  94. #.
  95. #' ERL_MAX_ETS_TABLES: Максимальное количество ETS и таблиц Mnesia
  96. #
  97. # Количество конкурирующих (одновременных) ETS и таблиц Mnesia ограничено.
  98. # Когда достигается лимит, то в логах можно увидеть такое сообщение:
  99. #   ** Too many db tables **
  100. # Вы можете без опаски увеличивать значение данного параметра, что хоть
  101. # и повлечет увеличение использования памяти, но оно все же будет невелико.
  102. #
  103. # По умолчанию: 1400
  104. #
  105. #ERL_MAX_ETS_TABLES=1400
  106.  
  107. #.
  108. #' ERL_OPTIONS: Дополнительные параметры Erlang
  109. #
  110. # В данном параметре возможно указать дополнительные опции, которые
  111. # будут переданы в процесс(ы) erlang при запуске ejabberd. Некоторыми
  112. # полезными опциями являются -noshell, -detached, -heart. Когда ejabberd
  113. # запускается системным скриптом rc.d, то опции -noshell, -detached
  114. # применяются автоматически. За подробностями в ман erl(1).
  115. #
  116. # It might be useful to add "-pa /usr/local/lib/ejabberd/ebin" if you
  117. # want to add local modules in this path.
  118. #
  119. # По умолчанию: ""
  120. #
  121. #ERL_OPTIONS=""
  122.  
  123. #.
  124. #' ERLANG_NODE: Имя узла (node) Erlang
  125. #
  126. # В данном параметре возможно указать имя узла erlang для ejabberd.
  127. # Возможны различные форматы:
  128. # ERLANG_NODE=ejabberd
  129. #   Lets erlang add hostname to the node (ejabberd uses short name in this case)
  130. # ERLANG_NODE=ejabberd@hostname
  131. #   Erlang uses node name as is (so make sure that hostname is a real
  132. #   machine hostname or you'll not be able to control ejabberd)
  133. # ERLANG_NODE=ejabberd@hostname.domainname
  134. #   The same as previous, but erlang will use long hostname
  135. #   (За подробностями в ман erl(1))
  136. #
  137. # По умолчанию: ejabberd@localhost
  138. #
  139. ERLANG_NODE=ejabberd@localhost
  140.  
  141. #.
  142. #' EJABBERD_PID_PATH: Путь до PID файла
  143. #
  144. # В данном параметре задаются полный путь до PID (Process identifier) файла.
  145. # Если параметр задан, то ejabberd запишет полученный при старте
  146. # от системы идентификатор в указанный файл. При остановке сервиса
  147. # файл автоматически будет удален.
  148. # Учтите, что ejabberd должен иметь права записи в директорию, иначе
  149. # процесс не запустится.
  150. #
  151. # По умолчанию: пусто, то есть не записывать PID файл
  152. #
  153. EJABBERD_PID_PATH=/var/run/ejabberd/ejabberd.pid
  154.  
  155. #.
  156. #'
  157. # vim: foldmarker=#',#. foldmethod=marker:

Файл inetrc я не изменял и оставил так, как есть. Конфигурационные файлы достаточно хорошо прокомментированы, поэтому дополнительно по ним сказать нечего. Осталось добавить сервис в автозагрузку и попробовать запустить.
  1. # echo 'ejabberd_enable="YES"' >> /etc/rc.conf
  2. # service ejabberd start

Если при редактировании конфигов ошибок допущено не было, то проблем возникнуть не должно и вы сможете увидеть на экране примерно следующее:
  1. # sockstat -4 -l | grep ejabberd
  2. ejabberd beam.smp   15934 8  tcp4   127.0.0.1:38487       *:*
  3. ejabberd beam.smp   15934 15 tcp4   *:5222                *:*
  4. ejabberd beam.smp   15934 16 tcp4   *:5223                *:*
  5. ejabberd beam.smp   15934 17 tcp4   *:5269                *:*
  6. ejabberd beam.smp   15934 18 tcp4   127.0.0.1:5280        *:*
  7. ejabberd beam.smp   15934 23 udp4   *:3478                *:*
  8. ejabberd epmd       15932 3  tcp4   127.0.0.1:4369        *:*

Если же сервис не стартовал, то смотрите логи в /var/log/ejabberd. К сожалению, формат выплевываемых ошибок сервером дико неудобный, но разобраться все же можно. Обычно проблемы возникают из-за некорректных прав доступа или опечаток в конфигурационном файле. Для отладки будет полезна команда ejabberdctl live, которая запускает сервер не отсоединяя его от терминала и все сообщения выводятся на консоль. Только учтите, что сервер будет запущен с правами пользователя выполнившего эту команду и все создаваемые сервером файлы будут иметь соответствующие права (я первый раз долго возился с проблемой запуска сервера командой service ejabberd start после отладки). Поэтому можно использовать такую команду для отладки:
  1. # su ejabberd -c 'ejabberdctl live'

После запуска сервера нужно создать первый аккаунт, который будет иметь права администратора (права настраивались в секции ACL).
  1. # ejabberdctl register nekit info-x.org 1234

Теперь можно подключаться к серверу, используя созданный аккаунт. Администрировать сервер можно через админку (если вы ее включили при конфигурировании) или через Jabber клиент (особенно удобно это делать через Gajim или Psi+). На этой ноте я завершаю рассказ про настройку XMPP сервера ejabberd. Если возникнут замечания, то прошу в комменты, а с вопросами обращайтесь в форум.

Комментарии

Аватар пользователя kobzar

При попытке стартонуть 

Crash dump was written to: /var/log/ejabberd/erl_crash_20140401-161855.dump
Kernel pid terminated (application_controller) ({application_start_failure,kernel,{{shutdown,{failed_to_start_child,net_sup,{shutdown,{failed_to_start_child,net_kernel,{'EXIT',nodistribution}}}}},{k

Аватар пользователя nekit

Уверены, что конфиги без ошибок написаны?

Аватар пользователя kobzar

Во время тестирования, настройки и отладки основная ошибка была в том, что перед запуском, нужно всегда чистить темпы и процессы! Долбался сутки с конфигом - не мог понять что ж ничо не работает!
Начал чистить - моментально нашел ошибки пофиксил и запустил сервер! 
Спасибо автору за помощь 

killall epmd && killall beam.smp && rm /var/run/ejabberd/ejabberd.pid && rm /var/log/ejabberd/* && rm /var/spool/ejabberd/*

Аватар пользователя Гость

windows клиенты не могут отправить друг другу файлы по локалке, только админ ejabberd может, файрволлы отключены, в чем проблема?

Аватар пользователя nekit

В конфиге оно разрешено? Клиенты разные, одинаковые, ошибки какие показывают, настройки клиентов одинаковые? В логах что?

Аватар пользователя Гость

А кто-нибудь пробовал прикрутить к ejabberd kerberos авторизацию ? Есть что-то рабочее?

Аватар пользователя nekit

А кто-нибудь пробовал прикрутить к ejabberd kerberos авторизацию ?

Прикрутить возможно через PAM, например. Кроме того, ejabberd позволяет организовать аутентификацию через внешний скрипт, в котором конечно можно сделать все что угодно.

Добавить комментарий

Filtered text

CAPTCHA
Этот вопрос предназначен для предотвращения автоматической отправки форм спам-ботами.
Fill in the blank.