eRIZ's weblog

PHP, webdesign, Linux, Windows i inne, bo nie samym chlebem człowiek żyje

Jabber we własnej domenie – uruchamiamy serwer

Jakoś uczepiłem się ostatnio Jabbera i JID stał się chyba dla mnie najważniejszym identyfikatorem. Z tego powodu, iż bardzo chciałem go mieć we własnej domenie, spróbowałem wcześniej z Google Apps, ale do pełnej funkcjonalności mu czegoś brakuje. Nie pamiętam, co konkretnie było, ale chyba coś z autoryzacją.

Więc, zabieramy się do roboty.

Wybór serwera

Do wyboru mamy kilka demonów, m. in: Jabberd1.4, Jabber2 (to nie są po prostu różne wersje; to dwa osobne projekty), OpenFire, Ejabberd. Skupię się na Ejabberd ze względu na prostotę instalacji. Nie wiem, jak to jest w przypadku OpenFire (oparty na Javie), ale ze względu na ograniczone zasoby sprzętowe komputera, na którym zainstalowałem demona, potrzebowałem czegoś lżejszego. Poszperałem nieco w necie i okazało się, że wszystkie moje wymagania doskonale spełnia Ejabberd. Ponoć jest jednym z bardziej rozbudowanych serwerów Jabbera dostępnych w wersji darmowej.

Przygotowania

Musimy teraz wybrać pewną drogę: jeśli chcemy korzystać z wewnętrznej bazy danych użytkowników, to pomijamy ten krok. W przeciwnym razie, instalujemy jakąś bazę danych, np. MySQL czy PostgreSQL. Wybór należy do nas. Każdą z baz instaluje się wręcz łopatologicznie (za pomocą menedżera pakietów), a konfiguracja/utworzenie bazy nie jest chyba zadaniem aż tak trudnym, że trzeba by było dodatkowo się rozpisywać. Poza tym, po co powielać coś, o czym już napisano pewnie tysiące razy…

Jakie są zalety trzymania danych w SQL? Jest to pewna skalowalność, ponieważ zarządzanie kontami użytkowników możemy zintegrować z własnym front-endem czy systemem kont na naszej stronie. Bardzo przydatne rozwiązanie jeśli chodzi też o przenośność czy rozpraszanie usług.

A jakie wady? Cóż, będzie to wydajność. Jeśli wszystko stoi na jednej maszynie i mamy wielu użytkowników, to na pewno będzie to wolniejsze rozwiązanie od korzystania z wewnętrznej bazy demona.

Instalacja Ejabberd

Zainstalować możemy na trzy sposoby: kompilując, instalując z repozytoriów oraz… przy pomocy instalatora. Rzadko (IMHO) spotykany sposób, ale według mnie – stanowiący konsensus pomiędzy oboma wcześniejszymi. Dlaczego? Łatwość instalacji+porządek. Pod Ubuntu, instalując z repozytoriów, wszystko mamy porozrzucane po całym systemie i nie możemy określić prefiksu. Instalując za pomocą binarki mamy możliwośc wyboru katalogu i wstępnej konfiguracji serwera. Dodatkową przewagą nad wersją kompilowaną jest fakt, iż paczka zawiera wszystkie niezbędne do działania biblioteki.

Ściągamy instalatora (Linux x86 Installer) i nadajemy mu prawa do wykonania (chmod ago+x ejabberd…), po czym uruchamiamy. Instalacja jest dosyć banalna; sprowadza się do wybrania języka, katalogu przeznaczonego na instalację, wcześniej – do zaakceptowania umowy licencyjnej. Również podczas instalacji podajemy domenę, w której będą działały nasze JID-y oraz login administratora, ale można to również zrobić później. Niemniej jednak, lepiej jest zrobić to teraz i uniknąć niepotrzebnego grzebania. ;]

Właściwie, to można już uruchomić serwer.

Konfiguracja

…ale lepiej poświęcić parę minut na skonfigurowanie demona. Zaczniemy od włączenia obsługi połączeń szyfrowanych. Ponieważ SSL wychodzi już z użycia, skupimy się na TLS-ie. Jeżeli jednak komuś naprawdę zależy na obsłudze SSL, to też się nie zawiedzie.

Otwórz sobie w ulubionym edytorze (za dużo czytania manuali :D)(vi, emacs, pico, czy czymś innym; osobiście, preferuję ostatni ;]) plik konfiguracyjny Ejabberd. Znajduje się on w <katalog ejabberd>/conf/ejabberd.cfg. Struktura może wydawać się troszkę dziwna, ale po krótkim rozczytaniu wątpliwości znikają.

Szyfrowanie połączeń

Szczerze mówiąc, to siedziałem nad tym prawie trzy dni i na Polskim Forum Jabbera wreszcie ktoś pomógł przy uruchomieniu TLS-a. Początkowo popełniałem błąd, który skutkował próbą dwukrotnego nasłuchiwania na tym samym porcie… Ale wszystko już wiemy, dzięki Kolargolowi. ;]

Przechodzimy teraz do interesującej nas sekcji:

  1. % Listened ports:
  2. {listen, [
  3.       {5222, ejabberd_c2s, [{access, c2s}, {max_stanza_size, 65536}, {shaper, c2s_shaper}]},
  4.           %% Use this line to enable SSL:
  5.           %%{5223, ejabberd_c2s,     [{access, c2s}, {max_stanza_size, 65536}, tls, {certfile, "/usr/local/ejabberd/conf/server.pem"}]},
  6.           %%
  7.           %% Use those lines instead for TLS support:
  8.           %% {5222, ejabberd_c2s,     [{access, c2s}, {shaper, c2s_shaper}, starttls, {certfile, "/usr/local/ejabberd/conf/server.pem"}]},
  9.           %%{5223, ejabberd_c2s,     [{access, c2s}, tls, {certfile, "/usr/local/ejabberd/conf/server.pem"}]},
  10.  
  11.           %% Remove this line if you want to prevent s2s connections:
  12.       {5269, ejabberd_s2s_in,  [{shaper, s2s_shaper}, {max_stanza_size, 131072}]},
  13.           
  14.           %% remove http_poll to remove support for http polling
  15.           %% remove web_admin to disable admin interface:
  16.           {5280, ejabberd_http,    [http_poll]}
  17.           %% This is an example on how to define an external service/transport:
  18.           %%{8888, ejabberd_service, [{access, all},
  19.           %%        {hosts, ["icq.domena.pl", "sms.domena.pl"],
  20.           %%        [{password, "secret"}]}]}
  21.          ]}.

Aby włączyć obsługę TLS, wystarczy skomentować 3. linijkę (za pomocą znaku %) i odkomentować 8. Pamiętaj, aby nie powtórzyć mojego błędu jakim było nie skomentowanie 3. wiersza. ;]

W ten oto sposób włączyliśmy TLS w Ejabberd. Można również wymusić logowanie z użyciem szyfrowania. Wówczas, musimy zamienić starttls na starttls_required w 8. linijce.

Można również zabezpieczyć połączenia s2s (server-to-server). Zamiast 8. linijki wpisujemy:

  1. 5222, ejabberd_c2s, [{access, c2s}, {shaper, c2s_shaper}, starttls_required, {certfile, "/usr/local/ejabberd/conf/server.pem"}]},
  2. {s2s_use_starttls, true}.

Jeśli ktoś się jednak upiera, aby włączyć obsługę SSL, to również nie ma problemu. Wystarczy odkomentować 9. linijkę. Aby pozostawić wyłącznie możliwość łączenia poprzez SSL musimy skomentować wszystkie pozostałe wiersze.

Zmiana bazy danych

Wspomniałem o przeniesieniu danych użytkowników do bazy. No problem, omówię MySQL. Wspomnę tylko, że potrzebujemy wersji co najmniej 4.1, ponieważ wymagana jest obsługa silnika InnoDB. Tworzymy pustą bazę danych i za pomocą np. phpMyAdmina, importujemy strukturę bazy dla Ejabberd.

Teraz, powracamy do edycji konfiguracji. Szukamy:

  1. {auth_method, internal}.

i „traktujemy” komentarzem.

Wypadałoby „powiedzieć” demonowi, że ma używać SQL jako miejsca przechowywania danych. W tym celu, dopisujemy:

  1. {odbc_server, {mysql, "host", "baza", "user", "haslo"}}.
  2. {host_config, "domena.pl", [{auth_method, [odbc]}]}.

To spowoduje przechowywanie danych o kontach użytkowników (JID i hasło) w bazie. Ale przydałoby się, aby i inne dane, np. rostery czy wiadomości offline tam wędrowały. Szukamy sekcji

  1. % Used modules:
  2. {modules,

I s nazwach modułów:

  • mod_roster
  • mod_vcard
  • mod_last
  • mod_offline

na końcu dopisujemy _odbc.

Korzystając ze SQL, możemy dodatkowo zablokować rejestrację poprzez klienty Jabbera. Przydatne, jeśli chcemy udostępnić konta wybranej grupie użytkowników, np. po uprzedniej rejestracji w naszym serwisie. Blokadę nakładamy zamieniając {access, register, [{allow, all}]}. na {access, register, [{deny, all}]}..

Tuning

Do zarządzania serwerem, otrzymujemy w miarę wygodny panel administracyjny, do którego dostęp mamy pod adresem http://domena:5280/admin. W większości przypadków, okaże się wystarczający, choć nie wszystko da się w nim zmieniać.

Możemy również przeglądać stan serwera za pomocą Przeglądarki Usług klienta Jabberowego. Warunek jest jeden: nasz JID musi posiadać uprawnienia administracyjne, które nadajemy za pomocą dyrektywy {acl, admin, {user, „użyszkodnik”}}. .

Aby Ejabberd startował przy bootowaniu OS-u, wystarczy dodać do wpisów rc.d Twojego Pingwina skrypt ejabberd.init, który znajduje się w podfolderze bin katalogu demona. W Ubuntu wystarczy skopiować plik do /etc/init.d i skorzystać z polecenia update-rc.d.

Zapomniałem wspomnieć właściwie o najważniejszej rzeczy – jak startować i zatrzymywać demona (:D). Możemy to zrobić poprzez skrypt w init.d, o którym wspomniałem wyżej oraz przy pomocy dwóch poleceń: start i stop w tym samym katalogu, co ejabberd.init.

To by było na tyle, jeśli chodzi o konfigurację pozwalającą na pogaduszki poprzez Żarówkę.

A własna domena?

Kolejny etap. Trzeba uwzględnić dwie różne sytuacje:

  1. na jednym serwerze mamy uruchomione inne usługi i wszystkie dostępne są pod jedną domeną
  2. Jabber stoi na innym serwerze, na który nie wskazuje domena

All-in-one

No, tu nie ma praktycznie nic do roboty – jeśli reszta usług działa, to do klienta możemy wpisać [email protected] jako JID i zacząć rozmawiać.

Jabber osobno – rekordy SRV

Do niedawna, trzeba było korzystać z subdomen typu jabber.domena.pl, aby móc się porozumiewać w sytuacjach, gdy serwer Żarówki był na innej maszynie niż serwis dostępny pod główną domeną. Obecnie, wiele serwisów wciąż wykorzystuje subdomene jako wskazanie na serwer Jabbera. Możemy jednak korzystać z głównej domeny w JID-zie, a demona uruchamiać na innym serwerze. W tym celu, tworzymy sobie nową subdomenę, np. jabber.domena.pl, która będzie wskazywała na maszynę z usługą. Ale przecież wspomniałem, że skorzystamy z innej metody. Tak, ale będziemy musieli się jakoś połączyć…

Już wyjaśniam. Musimy dodać do swojej głównej domeny rekordy SRV:

  1. _jabber._tcp.domena.pl. 86400 IN SRV 5 0 5269 jabber.domena.pl.
  2. _xmpp-server._tcp.domena.pl. 86400 IN SRV 5 0 5269 jabber.domena.pl.
  3. _xmpp-client._tcp.domena.pl. 86400 IN SRV 5 0 5222 jabber.domena.pl.

Niestety, nie spotkałem się jeszcze z żadnym panelem administracyjnym, który umożliwiłby samodzielne zarządzanie rekordami SRV (nie dotyczy osobnych serwerów DNS). Pozostaje nam tylko prośba do administratora serwera, który najczęściej dodaje odpowiednie wpisy. Zdarza się jednak, że admin jest dosyć oporny i nie chce dodać rekordów. Wówczas, polecam przeprowadzkę na jakiś darmowy DNS lub zmianę hostingu/registrara.

Po odczekaniu pewnego czasu (max 24h; w praktyce jest to zazwyczaj kilka godzin), serwery przeprowadzą synchronizację i usługa będzie już dostępna dla Świata.

Teraz wrócę do dodanej wcześniej subdomeny. Skorzystamy z niej, aby się połączyć z naszym serwerem. W tym celu, aktywujemy opcję podobną do podaj hosta ręcznie i wpisujemy utworzoną wcześniej subdomenę.

Uwaga, jeśli z jakichś powodów nie możemy/nie chcemy tworzyć nowej subdomeny, to można zamiast niej podać adres IP serwera z zainstalowanym serwerem Jabbera. Jednak polecam stworzenie subdomeny z powodów czysto praktycznych (zmiana IP serwera, itp.).

I tak mamy działający serwer Jabbera. ;]

Na podstawie Dokumentacji Ejabberd, rad Kolargola i doświadczeń.

3 komentarze

dopisz swój :: trackback :: RSS z komentarzami

RSS z komentarzami :: trackback

Skomentuj

Możesz używać znaczników XHTML. Dozwolone są następujące tagi: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Wszystkie komentarze przechodzą przez moderację oraz filtry antyspamowe. Nie zostanie opublikowany komentarz, jeśli:

  • Jego treść obraża kogokolwiek.
  • W treści znajdują się wulgaryzmy i słownictwo ogólnie uznane za nieprzyzwoite.
  • Mam wątpliwości co do autora wpisu (Wszelkie anonimy są kasowane - niezależnie od zawartości - wpisz prawdziwy e-mail. Jeśli usunąłem, Twoim zdaniem, komentarz niesłusznie - daj znać). Zdarza się, iż sprawdzam kim jest komentujący.
  • Zawiera jakąkolwiek formę reklamy.

Szufladka