Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> программы —> ejabberd+mysql+icq

Установка и настройка ejabberd + mysql и в подарок icq transport

Автор: stopka.


И так всем доброго времени суток!
Задался целью выложить подробнейший ман по настройке стабильного, легкого jabber сервера.

Рекламировать не собираюсь, но скажу следующее. Ejabberd сервер обслуживает пользователей ресурса jabber.ru - Популярного российского центра мгновенных сообщений, а это ОЧЕНЬ серьёзный показатель, правда у них всё стоит на Debian, ну да ладно...

И так для успешной работы ejabberd с поддержкой mysql нужно три вещи:
1) сам ejabberd
2) erlang
3) erlang-mysql

Со вторым пунктом есть куча подводных камней с которыми мы познакомимся позже.
Начнём пожалуй с самого геморного тоесть со второго пункта, а всё "сладкое" на потом.

Ни чего лишнего нам от erlang не надо, так что будем ставить erlang-lite
Но для начала уясним такую весч, что ejabberd (2.0.5 и ниже) работает только с erlang ветки r12 и ниже, а уже выпущена ветка r13, так что многие столкнуться с проблемой: что "не стартует" ejabberd, точнее не слушает указаные порты, то есть не работает и то есть FAIL, по этому идём в порты:
# cd /usr/ports/lang/erlang

Смотрим Makefile, а именно версию порта: PORTVERSION, если она ветки r12 или ниже, то всё замечательно.
Если нет, идём в эту статью и откатываем порт до r12 ветки.

И так будем думать что всё у нас хорошо с версией erlang, то есть поехали дальше:
# cd /usr/ports/lang/erlang-lite

Правим Makefile, меняем: WITHOUT_ODBC=YES, на WITH_ODBC=YES и продолжаем установку:
# make install clean

Для пущей уверенности подтверждаем поддержку ODBC.
Далее ждём пока соберётся эрлэнг.

Эрлэнг собран, идём собирать модуль для mysql, тут проблем не возникнет:
# cd /usr/ports/databases/erlang-mysql
# make install clean

Ну что, самое главное собрали, осталось дело за малым, идём собирать ejabberd c поддержкой ДБ.
А чтобы ejabberd непотащил с интернета всякой лабуды типа явы и заодно подстрахуемся что соберём всё с поддержкой ДБ, идём в make.conf
Добавляем:
PORTSDIR?=      /usr/ports

.if ${.CURDIR} == ${PORTSDIR}/net-im/ejabberd
    WITHOUT_JAVA=yes
    WITH_ODBC=yes
.endif

Далее идём собирать ejabberd.
# cd /usr/ports/net-im/ejabberd
# make install clean

Подтверждаем выбор ODBC и ждём пока соберётся.

И так всё собрали, идем конфигурить.
Начнём с того, что хороший сервер это всегда поддержка ssl. Приступим к сборке ssl сертификата:
# 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.имя_хоста.ru/emailAddress="mail@jabber.имя_хоста.ru

# cat privkey.pem >> server.pem
# rm privkey.pem
# mv server.pem ssl.pem

И так в /usr/local/etc/ejabberd у нас уже есть готовый сертификат(ssl.pem), продолжим конфигурить.
Редактируем inetrc, велосипед придумывать не стал, смотрите:
{lookup,["file","native"]}.
{host,{}, ["jabber.ionitcom.ru","hostalias"]}.
{file, resolv, "/etc/resolv.conf"}.

Кто чего умнее скажет, с удовольствием поправлю в статье и скажу спасибо.
Далее самое интересное, ejabberd.cfg:
{acl, admin, {user, "stopka"}}.
{acl, local, {user_regexp, ""}}.
{access, pubsub_createnode, [{allow, all}]}.
{access, register, [{allow, all}]}.
{welcome_message, {"Welcome!", "Welcome to Jabber Service. " "For information about Jabber visit http://jabber.ionitcom.ru"}}.
{access, c2s, [{deny, blocked}, {allow, all}]}.
{shaper, normal, {maxrate, 128000}}.
{shaper, fast, {maxrate, 256000}}.
{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}]}.
{auth_method, odbc}.
{odbc_server, {mysql, "mysql_сервер", "имя_бд", "учётка_бд", "пароль_учётки"}}.
{odbc_pool_size, 3}.
{hosts, ["jabber.имя_хоста.ru"]}.
{max_user_sessions, 10000}.
{language, "en"}.
{listen,
[{5222, ejabberd_c2s, [{access, c2s}, {shaper, c2s_shaper}, {max_stanza_size, 65536}, starttls,
{certfile, "/usr/local/etc/ejabberd/ssl.pem"}]},
{5223, ejabberd_c2s, [{access, c2s}, {max_stanza_size, 65536}, tls, {certfile, "/usr/local/etc/ejabberd/ssl.pem"}]},
{5269, ejabberd_s2s_in, [{shaper, s2s_shaper}, {max_stanza_size, 131072} ]},
{5247, ejabberd_service, [{access, all}, {hosts, ["icq.jabber.ionitcom.ru"], [{password, "пароль_для_icq_транспорта"}]}]}
]}.
{s2s_use_starttls, true}.
{s2s_certfile, "/usr/local/etc/ejabberd/ssl.pem"}.
{outgoing_s2s_port, 5269}.
{modules,
[
{mod_register, [{welcome_message, {"Welcome!","Welcome to this Jabber server."}},{registration_watchers,
["stopka@jabber.ionitcom.ru"]},{access, register}]},
{mod_roster_odbc,[]},
{mod_privacy, []},
{mod_adhoc, []},
{mod_announce, [{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, []},
{mod_pubsub, [{access_createnode, pubsub_createnode},{plugins, ["default", "pep"]}]},
{mod_muc, [{access, muc},{access_create, muc},{access_admin, muc_admin}]},
{mod_time, []},
{mod_last_odbc, []},
{mod_version, []}
]}.

Кто более менее с Английским дружит - всё поймет, кому надо подробнее описание - говорите.

Далее, ejabberdctl.cfg я не трогал вообще, всё оставил по умолчанке.

Далее, идём думать на счет БД, создаем бд, даём на неё права, в общем всё по старинке, тут останавливаться не буду. Манов по работе с mysql есть в интернете до хохоту.
И берём закидываем начальный дамп базы для ejabberd, берём его из сорцев ежабера, в /usr/ports/distfiles/ejabberd

И так, имеем настроенный ejabberd и готовую mysql базу для него.
Пойдем стартовать его:
# echo 'ejabberd_enable="YES"' >> /etc/rc.conf
# /usr/local/etc/rc.d/ejabberd start

И смотрим на успехи:
# /usr/local/etc/rc.d/ejabberd status
ejabberd is running

Значит всё отлично, ejabberd встал и уже готов к работе. Можно посмотреть для уверенности sockstat и убедиться что нужный софт слушает нужные порты.

Если мы видим другой результат, то топаем в логи: /var/log/ejabberd
Устранили проблему и пробуем снова, если в /var/log/ejabberd видим файлы вида: *.dump тоесть дампы на сколько я понимаю ejabberd`a
То убиваем эрленговый демон:
# killall epmd

И заного пробуем стартовать ejabberd.

Далее поговорим об установке icq-транспорта.

С транспортом проблем ни каких не будет, поехали:
# cd /usr/ports/net-in/jabber-pyicq
# make install clean

Там мы выбираем, что мы будем работать в паре с ejabberd, НО без поддержки ДБ, почему "без" сейчас объясню пока собирается транспорт.
Времени не хватило разобраться кто виноват, но суть беды в том, когда я прикручивал транспорт к mysql, после старта транспорт работал нормально, юзверы добавлялись и слизывали в базу свои контакт листы и т.д. Но стоит лишь потушить демон транспорта или ребутнуть его, вся база уходит в ноль и всем приходиться заного добавлять свои данные в ростер, кароче ерунда какая то. По этому остался на локальной базе, она не слетает с ней всё в порядке.

И так идём конфигурить jabber-pyicq.xml
Конфиг очень простой, не забудьте вписать пароль для слинковки транспорта с ejabberd и выкину кусок конфга в конце, чтобы вы не мучались дня два, за это уже отмучался я :)
Вот важный вам кусок:
<adhocDefaults>
<user>
<xstatus_receiving_mode>3</xstatus_receiving_mode>
<xstatus_sending_mode>3</xstatus_sending_mode>
<xstatus_saving_enabled>0</xstatus_saving_enabled>
<xstatus_option_smooth>1</xstatus_option_smooth>
<xstatus_display_icon_as_PEP>1</xstatus_display_icon_as_PEP>
<xstatus_display_text_as_PEP>0</xstatus_display_text_as_PEP>
<xstatus_icon_for_transport>1</xstatus_icon_for_transport>
<away_messages_receiving>0</away_messages_receiving>
<away_messages_sending>0</away_messages_sending>
<clist_show_phantombuddies>0</clist_show_phantombuddies>
<clist_deny_all_auth_requests>0</clist_deny_all_auth_requests>
<utf8_messages_sendmode>2</utf8_messages_sendmode>
<offline_messages_sendenc>2</offline_messages_sendenc>
<msgconfirm_sendmode>2</msgconfirm_sendmode>
<msgconfirm_recvmode>1</msgconfirm_recvmode>
<user_mood_receiving>1</user_mood_receiving>
<user_activity_receiving>1</user_activity_receiving>
<user_mood_receiving>1</user_mood_receiving>
</user>
</adhocDefaults>

И так идём стартовать:
# echo 'jabber_pyicq_enable="YES"' >> /etc/rc.conf
# /usr/local/etc/rc.d/jabber-pyicq-transport start

При первом старте может заругаться что нету прав на /var/spool/jabber
На самом деле это директории нету, так что тупо создаем и даём права от ejabberd и снова стартуем.

И далее заходим в клиент, регистрируемся и видим всю прелесть в сервисах сервера.
Веб админку описывать не хочу, больно она убогая, да и малофункциональная, всё как админ всё сможете сделать через управление в сервисах.

Так что на этом всё, эта статья написана по реальным событиям поднятия сервера: jabber.ionitcom.ru
Так же создан мною ресурс(jabber.ionitcom.ru) для школьников в jabber среде, чтобы понятно было что за чем и как переходить плавно с Аськи...
Касаемо настроек ejabberd и транспорта - спрашивайте, информации очень много не хочу всё описывать в этой статье, а то получиться полный хлам.

Вот и всё, жалуйте, хвалите, вы можете связаться со мной через жабу: stopka@jabber.ionitcom.ru или в аську 490977 я через транспорт сижу или написать в личку на форуме Лиссяры, я там тоже как "stopka".



размещено: 2009-07-01,
последнее обновление: 2009-07-04,
автор: stopka


Cancer, 2009-07-04 в 22:26:27

Не плохо было бы добавить линк на форум для обсуждения...
И еще конфиг не поддерживает переносов "\" ?
Для того что бы статья вмещалась в поля...

100pka, 2009-07-04 в 22:59:30

Пофиксим, спасибо.

Cancer, 2009-07-25 в 12:49:31

stopka

Да и еще стоило бы что нить на счет веб интерфейса рассказать показать...

m4rkell, 2009-08-13 в 9:16:07

Админка это лишнее, убогая она реально. Вот прикручивание фишек всяких это да...на форуме есть уже про транспорты, можно было бы добавить откорректировав в статью...что бы не лазить по всему форуму. А так статья отл. все встало на ура у меня. Автору спасиба!

playnet, 2010-01-16 в 22:39:28

Бага: если перенести пид в /var/run, где ему место, оно не будет создаваться, потому что пытается создать файл от ejabberd, а туда может писать только рут. Просто созданный файл его не устраивает.

И в этой доке не описано, что надо создать /var/spool/jabber и права выставить

galex, 2010-02-06 в 12:57:23

Баг №1 в ejabberd-2.0.5:
- пока ручками не внёс в мускул ./ejabberd/work/ejabberd-2.0.5/src/odbc/mysql.sql *уй оно само что-либо в БД создало...

Баг №2 в jabber-pyicq:
- пока в файле /usr/local/etc/rc.d/jabber-pyicq-transport
не укажешь нормальный путь к пид файлу оно не запустится.
Указал ему просто в тмп - ${jabber_pyicq_piddir="/tmp"}

Теперь ломаю мосК в попытке понять реализацию icq-транспорта >.<

playnet, 2010-02-07 в 3:39:30

на r13 уже давно не надо откатывать, отметтье плиз
у меня на 13 все пашет

Klop, 2010-06-20 в 7:53:59

[/b]stopka[b], поправить бы: даунгрейд erlang не ребуется уже. По крайней мере на 8 Release, со свежими портами:
erlang-lite-r13b04_2,1
erlang-mysql-1.0_5
ejabberd-2.1.3

P.S. Аськотранспорт не завёлся. Курю пока.

staskur, 2010-11-12 в 13:45:19

с таким конфигом inetrc как в статье вылетает ошибка синтаксическая

/usr/local/etc/ejabberd/>ejabberdctl register user domen.ru pass
{error_logger,{{2010,11,12},{13,30,47}},"inet_config: syntax error in ~s~n",["/usr/local/etc/ejabberd/inetrc"]}

=ERROR REPORT==== 12-Nov-2010::13:30:47 ===
inet_config: syntax error in /usr/local/etc/ejabberd/inetrc
User user@domen.ru successfully registered
/usr/local/etc/ejabberd/>

а с таким конфигом  inetrc

/usr/local/etc/ejabberd/>cat inetrc
{file, resolv, "/etc/resolv.conf"}.
{lookup,["file", "dns"]}.
/usr/local/etc/ejabberd/>

не вылетает ошибка

/usr/local/etc/ejabberd/>ejabberdctl register user2 domen.ru pass2
User user2@domen.ru successfully registered
/usr/local/etc/ejabberd/>

--------------

ejabberd-2.1.5  
erlang-lite-r14b,1  
erlang-mysql-1.0_6

Vetal, 2010-12-02 в 14:59:56

у меня долго не подымался mod_pubsub (доп статусы разные всякие) нагуглил как-то (сам удивляюсь до сих пор "КАК?) решение все просто:
в конфиге ejabberd.cfg правим
{mod_pubsub,     [{access_createnode, pubsub_createnode},{plugins, ["default", "pep"]}]}
на
{mod_pubsub,     [{access_createnode, pubsub_createnode},{plugins, ["hometree", "pep"]}]}

фсе теперь публикует песни, показивает доп статусы...



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.2384 секунд
Из них PHP: 27%; SQL: 73%; Число SQL-запросов: 77 шт.
Исходный размер: 37224; Сжатая: 10273