По мере использования xmpp сервером ejabberd наблюдаю крайний дефицит документации. Каждый чих чуть отклоняющийся от стандартных потребностей приходится придумывать самому, либо собирать по кусочкам из конференций, списков рассылки, комментариев в svn и непосредственно исходников.
С выходом ejabberd 2.1.11, в котором разработчики добавили поддержку ODBC в новых модулях, я столкнулся с проблемой переноса данных из штатной БД mnesia в более подходящую под мои задачи mysql. Когда-то я ее уже решал для других модулей, но лишь отдаленно помню как. Сейчас попробую вспомнить и задокументировать процесс для будущего себя и всех кому это может быть интересно.
Итак у Вас есть ejabberd 2.1.11, использующий в качестве хранилища свою стандартную БД mnesia, а Вы не хотите ничего решатьхотите mysql.
Сначала создадим базу данных. Структуру для нее берем тут или в файле /src/odbc/mysql.sql в пакете с исходниками.
После этого надо экспортировать данные из mnesia. Нам понадобится модуль mod_admin_extra, входящий в состав ejabberd-modules.
Качаем:
svn co https://svn.process-one.net/ejabberd-modules
Так как mod_admin_extra давно не обновлялся, то про новые модули и следовательно новые таблицы он ничего не знает. Я решил вопрос топорно: открыл исходник ejabberd-modules/mod_admin_extra/trunk/src/mod_admin_extra.erl и кусок
{export_last, last}, {export_offline, offline}, {export_passwd, passwd}, {export_private_storage, private_storage}, {export_roster, roster}, {export_vcard, vcard}, {export_vcard_search, vcard_search}],
заменил на
{export_last, last}, {export_offline, offline}, {export_passwd, passwd}, {export_private_storage, private_storage}, {export_roster, roster}, {export_vcard, vcard}, {export_motd, motd}, {export_motd_users, motd_users}, {export_muc_registered, muc_registered}, {export_muc_room, muc_room}, {export_sr_group, sr_group}, {export_sr_user, sr_user}, {export_vcard_search, vcard_search}],
Примечание: Я не использую irc-транспорт, так как предпочитаю теплые ламповые irc-клиенты, и mod_irc у меня выключен. Если же Вы его используете, вероятно, Вам надо будет добавить в список что-то типа '{export_irc, irc},'. Точно можно узнать, сделав ls /var/spool/jabber/*.DCD
и получив на выходе имена таблиц в mnesia.
Собираем (нужен erlang):
cd ejabberd-modules/mod_admin_extra/trunk
./build.sh
Примечание: более подробную инструкцию по сборке можно посмотреть на домашней странице ejabberd-modules.
Аналогично собираем ejabberd-modules/mysql.
Кидаем получившийся ejabberd-modules/mod_admin_extra/trunk/ebin/mod_admin_extra.beam и ejabberd-modules/mysql/trunk/ebin/*.beam в ebin в установке ejabberd (у меня это /usr/lib/erlang/lib/ejabberd-2.1.11/ebin/).
Отрубаем сервер ejabberd от сети для надежности и перезапускаем (но не останаваливаем!).
Создаем папку доступную на запись пользователю, из-под которого запущен ejabberd (у меня это jabber:jabber, но я просто сделал mkdir /tmp/temp; chmod 777 /tmp/temp).
Экспортируем данные из mnesia (<domain>
— домен Вашего jabber-сервера):
ejabberdctl export2odbc <domain> /tmp/test/
на выходе получаем txt файлы с sql-запросами, готовые для выполнения в mysql. Выполняем их (я использовал попсовый phpMyAdmin). Дампы после этого лучше сразу удалить, так как в них явки-пароли в явном виде.
Почему-то создаются файлы для всех таблиц в mnesia, но не прописанные нами имеют нулевую длину. Прописанные, но пустые у меня — 14 байт.
Повторяем последний абзац для каждого домена, если их несколько.
Итак, база готова!
Сегодня пятница и я позволю себе схалявить и не расписывать непосредственно настройку ejabberd для mysql. Благо это много где описано (да хоть в официальной документации) и легко гуглится.
Если очень вкратце, то в конфиге должны быть
{auth_method, odbc}
{odbc_server, {mysql, «host», «db», «user», «pass»}}.
если не один домен, то
{host_config, «domain2», [{odbc_server, {mysql, «host», «db», «user», «pass»}}]}.
а так же меняем имена модулей тех модулей, которые хотим в мускуль XXX->XXX_odbc, у меня это:
mod_announce_odbc
mod_blocking_odbc
mod_last_odbc
mod_muc_odbc
mod_offline_odbc
mod_privacy_odbc
mod_private_odbc
mod_pubsub_odbc
mod_roster_odbc
mod_shared_roster
mod_vcard_odbc
mod_vcard_xupdate_odbc
Уже дописывая нашел статью про то же самое, но от 2009 года, там некоторые вещи устарели, так что надеюсь кому-то моя статья будет полезной. Всем приятных выходных. Не забывайте, что сообщения об ошибках и неточностях в статье приветствуются, но в личку.
Автор: J_o_k_e_R