Instalace ejabberd s ověřením proti mySQL
Rozhodl jsem se vyzkoušet instalaci vlastního Jabber serveru. Jako démona jsem vybral ejabberd, který je součástí standardních repozitářů stable větve Debianu. Je potřeba ještě pár věcí doladit, ale i tak jsem narazil na pár věcí, které mě při instalaci zdrželi déle než jsem chtěl a proto je poznačím dřív než budou zapomenuty.
Instalaci ejabberd provedeme standardním postupem
apt-get install ejabberd erlang-dev subversion
Balík erlang-dev užijeme později při kompilaci modulu pro mySQL. Subversion potřebujeme pro stažení zdrojových kódů mySQL modulu.
Než začneme s konfigurací serveru, přidáme do DNS tři SRV záznamy.
Screenshot pochází z administrace DNS u Wedosu. Je nutné zadat pro každý záznam údaje ve tvaru Název (_jabber._tcp.domena.cz), Priorita (5), Váha (0), Port (5269) a Hodnota (dobranalada.cz)
Předpokládám, že máte instalováno mySQL. Založte v mySQL nového uživatele ejabber:
mysql -h localhost -p -u root Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 to server version: 4.1.16-max Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> GRANT ALL ON ejabberd.* TO 'ejabberd'@'localhost' IDENTIFIED BY 'password'; Query OK, 0 rows affected (0.00 sec)
Poté vytvořte novou databázi ejabber:
mysql -h localhost -p -u ejabberd Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 4 to server version: 4.1.16-max Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> CREATE DATABASE ejabberd; Query OK, 1 row affected (0.00 sec)
Stáhněte databázové schéma:
wget https://git.process-one.net/ejabberd/mainline/blobs/raw/2.1.x/src/odbc/mysql.sql
A proveďte jeho import:
mysql -D ejabberd -h localhost -p -u ejabberd < mysql.sql
Vytvoření tabulek v databázi můžete zkontrolovat:
echo "show tables;" | mysql -D ejabberd -h localhost -p -u ejabberd Tables_in_ejabberd last privacy_default_list privacy_list privacy_list_data private_storage pubsub_item pubsub_node pubsub_node_option pubsub_node_owner pubsub_state pubsub_subscription_opt rostergroups rosterusers roster_version spool users vcard vcard_search
Teď příjde krok, který zřejmě není nutné provádět na novějších verzích ejabberd. Aby bylo možné ověřovat uživatele proti mySQL databázi, je nutné zkompilovat modul pro mySQL. Nejprve stáhněte zdrojové kódy modulu z SVN. Je nutné mít nainstalovaný subversion z prvního kroku.
svn co https://svn.process-one.net/ejabberd-modules/mysql/trunk/ mysql
Kompilaci spusťte příkazem ./build.sh. V adresáři ebin vzniknou po úspěšné kompilaci soubory
mysql_auth.beam mysql.beam mysql_conn.beam mysql_recv.beam
Tyto soubory překopírujte k ostatním .beam knihovnám ejabberd. V mém případě do adresáře /usr/lib/ejabberd/ebin. Konečně můžeme provést vlastní konfiguraci serveru. Zeditujeme soubor /etc/ejabber/ejabber.cfg a upravíme položky, které definují, který z účtů je administrátorem serveru a také doménu, na které server běží.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Options which are set by Debconf and managed by ucf
%% Admin user
{acl, admin, {user, "uzivatel", "domena.cz"}}.
%% Hostname
{hosts, ["domena.cz"]}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Dále je nutné odkomentovat část, která říká, na kterých portech bude server poslouchat:
%%% ===============
%%% LISTENING PORTS
%%
%% listen: Which ports will ejabberd listen, which service handles it
%% and what options to start it with.
%%
{listen,
[
{5222, ejabberd_c2s, [
{access, c2s},
{shaper, c2s_shaper},
{max_stanza_size, 65536},
starttls, {certfile, "/etc/ejabberd/ejabberd.pem"}
]},
%%
%% To enable the old SSL connection method (deprecated) in port 5223:
%%
%%{5223, ejabberd_c2s, [
%% {access, c2s},
%% {shaper, c2s_shaper},
%% {max_stanza_size, 65536},
%% tls, {certfile, "/etc/ejabberd/ejabberd.pem"}
%% ]},
{5269, ejabberd_s2s_in, [
{shaper, s2s_shaper},
{max_stanza_size, 131072}
]},
%% External MUC jabber-muc (but internal mod_muc is better
)
%%{5554, ejabberd_service, [
%% {ip, {127, 0, 0, 1}},
%% {access, all},
%% {shaper_rule, fast},
%% {host, "muc.localhost", [{password, "secret"}]}
%% ]},
%% Jabber ICQ Transport
%%{5555, ejabberd_service, [
%% {ip, {127, 0, 0, 1}},
%% {access, all},
%% {shaper_rule, fast},
%% {hosts, ["icq.localhost", "sms.localhost"],
%% [{password, "secret"}]}
%% ]},
%% AIM Transport
%%{5556, ejabberd_service, [
%% {ip, {127, 0, 0, 1}},
%% {access, all},
%% {shaper_rule, fast},
%% {host, "aim.localhost", [{password, "secret"}]}
%% ]},
%% MSN Transport
%%{5557, ejabberd_service, [
%% {ip, {127, 0, 0, 1}},
%% {access, all},
%% {shaper_rule, fast},
%% {host, "msn.localhost", [{password, "secret"}]}
%% ]},
%% Yahoo! Transport
%%{5558, ejabberd_service, [
%% {ip, {127, 0, 0, 1}},
%% {access, all},
%% {shaper_rule, fast},
%% {host, "yahoo.localhost", [{password, "secret"}]}
%% ]},
%% External JUD (internal is more powerful,
%% but doesn't allow to register users from other servers)
%%{5559, ejabberd_service, [
%% {ip, {127, 0, 0, 1}},
%% {access, all},
%% {shaper_rule, fast},
%% {host, "jud.localhost", [{password, "secret"}]}
%% ]},
{5280, ejabberd_http, [
http_poll,
web_admin
]}
]}.
Zbývá zakázat defaultní ověřování proti Mnesii a zapnout ověření proti mySQL. Zakomentujte
%% {auth_method, internal}.
A nastavte souřadnice na databázi (server, uživatel, databáze, heslo):
{auth_method, odbc}.
{odbc_server, {mysql, "localhost", "ejabberd", "ejabberd", "password"}}.
Hotovo, uložte konfiguraci a spusťte:
/etc/init.d/ejabberd start
Poté zaregistrujte administrátorský účet, restartujte ejabber a můžete se připojit.
ejabberdctl register uzivatel domena.cz heslo ejabberdctl restart


Chtěl bych se zeptat, jak je použití mysql autentizace nákladné oproti interní mnesii na zdroje (hlavně paměť a CPU). Nerozumím příliš tomu, jak mnesia interně funguje (cache, indexy, …) a tak nemám představu co posun k mysql udělá.
Díky za postřehy
Mám server víceméně pro osobní použití+pár přátel. Kamarád má jabber server s komunitou cca 2500 useru. Zda se, ze stroj s 3GHz, a 2g ram je na pokraji sil.
Většinu výkonu přitom berou transporty v Pythonu. Chystá migraci do mysql. Dám vědět.
Já začal s mysql hned odpočátku, nemůžu srovnat. Jediné v čem jsem přecházel jsou transporty z pythonu na spectrum.