Популярные ошибки администраторов jabber-серверов

Настройка

Все настройки хранятся в /etc/ejabberd/ejabberd.cfg, откроем его и раскомментируем следующую строку:

override_local.

Ниже укажем логин администратора (у jabber-сервера свой администратор, не путать с системным) и имя сервера:

%% Admin user
{acl, admin, {user, "ADMIN", "SERVER_NAME"}}.
 
%% Hostname
{hosts, "SERVER_NAME".

Где – имя учетной записи администратора, а имя сервера, в нашем случае ubuntu-jabber. После чего опускаемся вниз до секции ACCESS RULES в которой находим и приводим к следующему виду опцию:

{access, register, {allow, all}}.

Данная опция позволяет регистрировать учетные записи пользователям самостоятельно, при помощи клиента. Последняя интересующая нас опция — язык по умолчанию:

{language, "ru"}.

Теперь зарегистрируем учетную запись администратора:

sudo ejabberdctl register ADMIN SERVER_NAME PASSWORD

И перезапустим сервер:

sudo etcinit.dejabberd restart

Теперь можно приступить к настройке клиентских ПК. В первую очередь добавим строку следующего вида:

10.0.0.103 ubuntu-jabber

в файл C:\Windows\System32\drivers\etc\hosts для Windows и в /etc/hosts для Linux. Данная строка позволяет клиентам обращаться к jabber-серверу по имени хоста. Если в вашей организации большое количество ПК и вносить настройки на каждом из них затруднительно, то самое время задуматься о внедрении Службы каталогов, в этом случае было бы достаточно одной записи на DNS сервере.

Установка и регистрация учетной записи просты и не занимают много времени, структура и принципы работы с программой ничем не отличаются от других IM клиентов и не должны вызвать каких-либо затруднений у пользователя. Добавляем контакт собеседника и уже можно общаться.

В общем на этом можно было бы и остановиться, если бы не одно но. По умолчанию список контактов (ростер на терминологии jabber) нового пользователя пуст. Это вполне нормально для личного использования или для работы с публичными серверами — пользователь сам выбирает с кем общаться, но абсолютно неприемлемо для корпоративной среды, где список контактов заранее определен. Было бы неплохо, чтобы новый пользователь автоматически попадал в этот список и автоматически получал его в свой клиент. К счастью сделать это совсем несложно. В /etc/ejabberd/ejabberd.cfg найдем и раскомментируем следующую строку:

{mod_shared_roster, },

Сохраняем файл, перезапускаем сервис. Теперь в веб-админке в разделе Virtual Hosts — Имя вашего сервера появился пункт Группы общих контактов. Создаем такую группу и настраиваем как показано ниже:

Для того, чтобы в группу автоматически попадали все пользователи в поле Члены укажите @all@, а в поле Видимые группы укажите название вашей группы, которое вы ввели при ее создании.

Проверим как это работает. Зарегистрируем нового пользователя, как видим — все хорошо, он автоматически получил все контакты общей группы.

Вот теперь можно и закончить нашу статью. В результате несложных действий мы получили в свое распоряжение мощное корпоративное средство обмена сообщениями, в тоже время простое и понятное пользователю. Однако на этом возможности ejabberd не исчерпываются, он позволяет осуществлять коммуникации с другими сетями обмена сообщениями, для этого нужно настроить соответствующий транспорт, так что если ваши партнеры используют ICQ вы не потеряете контакта с ними, но это тема для отдельной статьи.

1 Key Features

ejabberd is:

  • Cross-platform: ejabberd runs under Microsoft Windows and Unix derived systems such as Linux, FreeBSD and NetBSD.
  • Distributed: You can run ejabberd on a cluster of machines and all of them will serve the same Jabber domain(s). When you need more capacity you can simply add a new cheap node to your cluster. Accordingly, you do not need to buy an expensive high-end machine to support tens of thousands concurrent users.
  • Fault-tolerant: You can deploy an ejabberd cluster so that all the information required for a properly working service will be replicated permanently on all nodes. This means that if one of the nodes crashes, the others will continue working without disruption. In addition, nodes also can be added or replaced ‘on the fly’.
  • Administrator Friendly: ejabberd is built on top of the Open Source Erlang. As a result you do not need to install an external database, an external web server, amongst others because everything is already included, and ready to run out of the box. Other administrator benefits include:
    • Comprehensive documentation.
    • Straightforward installers for Linux, Mac OS X, and Windows.
    • Web Administration.
    • Shared Roster Groups.
    • Command line administration tool.
    • Can integrate with existing authentication mechanisms.
    • Capability to send announce messages.
  • Internationalized: ejabberd leads in internationalization. Hence it is very well suited in a globalized world. Related features are:
    • Translated to 25 languages.
    • Support for IDNA.
  • Open Standards: ejabberd is the first Open Source Jabber server claiming to fully comply to the XMPP standard.
    • Fully XMPP compliant.
    • XML-based protocol.
    • Many protocols supported.

ejabberd и MySQL

Хранить базу можно в MySQL. Кратко, настроить можно так:

1) Скачиваем схему БД

2) Создаём пользователя ejabberd:

$ mysql -h localhost -p -u root
mysql> GRANT ALL ON ejabberd.* TO 'ejabberd'@'localhost' IDENTIFIED BY 'password';

3) Создаём базу данных ejabberd:

mysql> CREATE DATABASE ejabberd;
mysql> quit

4) Загружаем схему в БД:

$ mysql -D ejabberd -h localhost -p -u ejabberd  < mysql.sql

5) настраиваем ejabberd на MySQL, прописываем в ejabberd.cfg:

%%{auth_method, internal}.

{auth_method, odbc}.
{odbc_server, {mysql, "localhost", "ejabberd", "ejabberd", "password"}}.

Список всех таблиц, данные из которых можно перенести в MySQL можно узнать посмотрев какие модули odbc присутствуют:

ls /usr/lib/ejabberd/ebin | grep mod | grep odbc
dpkg -L ejabberd | grep beam

8) Запускаем ejabberd:

/etc/init.d/ejabberd start

Подробные инструкции:

Небольшое дополнение к инструкции:
Если ставить ejabberd не из пакетов, а инсталятором с оф. сайта, то все компоненты располагаются в /opt/ejabberd-x.x.x/ где x.x.x — версия приложения.
В этом случае откомпеллированный модуль нужно скопировать в /opt/ejabberd-x.x.x/lib/ejabberd-x.x.x/ebin и, возможно, сделать его исполняемым:
# chmod +x mod_ctlextra.beam 

Настройка

В инструкции «x.x.x» означает номер версии ejabberd.

— Настраиваем /opt/ejabberd-x.x.x/conf/ejabberd.cfg, предполагая, что для джабера мы создали в домене DNS узел jabber.domain.local:

          
{hosts, }.
{language, "ru"}.

-Собственно на этом настройка может быть закончена. Запускаем службу:

# /opt/ejabberd-x.x.x/bin/ejabberdctl start

— Остановить службу:

# /opt/ejabberd-x.x.x/bin/ejabberdctl stop

Или можно удалить процесс:

# ps ax | grep jabber
10601 ?        S      0:00 /opt/ejabberd-x.x.x/bin/epmd -daemon

# kill -9 10601

— Можно создать в системе пользователя ejabberd с домашним каталогом установленного ПО и запускать службу от его имени, скопировав стартовый скрипт в надлежащее место:

# useradd --home /opt/ejabberd-x.x.x/ ejabberd
# chown -R ejabberd.root /opt/ejabberd-x.x.x/
# cp /opt/ejabberd-x.x.x/bin/ejabberd.init /etc/init.d/ejabberd
# /etc/init.d/ejabberd start

таким образом ejabberd будет запускаться стандартным для linux способом

— Теперь можно зайти на веб интерфейс http://jabber.domain.local:5280/admin/

— Добавляем пользователей в jabber клиенте (pidgin, qip, miranda, psi и т.д.) или командой ejabberdctl в формате

# ./ejabberdctl register UserName ServerName PassWord

например:

# ./ejabberdctl register pavel jabber.domain.local password

Перечисляем в ejabberd.cfg кто будет администратором:

{acl, admin, {user, "admin", "jabber.domain.local"}}.
{acl, admin, {user, "pavel", "jabber.domain.local"}}.

Также это можно сделать через веб-интрефейс. Прямая ссылка http://jabber.domain.local:5280/admin/acls/

— Проверяем работоспособность сервера: Регистрируемся пользователями, отправляем друг другу сообщения.

— Чтобы дать пользователям возможность искать друг друга в vCard, изменим параметры модуля mod_vcard:

...
  {mod_vcard, },
...

Можно настроить обще доступные ростеры (roster) — группы контактов. Для этого

1) проверим, что включен модуль общих групп контактов, если закомментировано, то убираем символы комментария %%

{mod_shared_roster,[]},

или mod_shared_roster_odbc в случае, если мы храним эту таблицу в MySQL.

2) в веб-интерфесе идём по пути:

Виртуальные хосты — jabber.domain.local — Группы общих контактов

Учетные записи

Каждый пользователь в сети имеет уникальный идентификатор — Jabber ID (сокращенно ). Адрес JID, подобно адресу электронной почты, содержит имя пользователя и доменное имя сервера, на котором зарегистрирован пользователь, разделённые знаком @. Например, пользователь user, зарегистрированный на сервере example.org, будет иметь адрес: user@example.org.

Добавление учетной записи сервиса jabber осуществляется командой .

Для добавления пользователя guest@example.org c nickname Гость выполните:

cl-useradd -p -c «Гость» guest jabber

Новый пароль:
Повторите новый пароль:
* Пользователь добавлен в Jabber сервис

Для добавления пользователя guest@example.org с nickname Гость и установкой для него фотографии выполните:

cl-useradd -p -c «Гость» -i pic/guest.png guest jabber

Заметка

Поддерживаемые форматы изображений определяются возможностями ImageMagick. Если в системе его нет, доступен только формат jpeg.

Смена пароля учетной записи сервиса jabber осуществляется командой . Для смены пароля пользователя guest выполните:

cl-passwd guest jabber

Новый пароль:
Повторите новый пароль:
* Пароль пользователя Jabber сервиса изменен

Блокировка учетной записи производится командой . Для блокировки учетной записи guest выполните:

cl-usermod -L guest jabber

* Пользователь guest Jabber сервиса заблокирован

Разблокировать учетную запись можно командой . Для разблокирования учетной записи guest выполните:

cl-usermod -L guest jabber

* Пользователь guest Jabber сервиса разблокирован

Удаление учетной записи из сервиса jabber осуществляется командой . Для удаления учетной записи guest выполните:

cl-userdel guest jabber

* Пользователь guest Jabber сервиса удален

6 Module xml

El = XMLElement

Returns string representation of XML stanza El.

S = string()

Returns string which correspond to S with encoded XML special
characters.

ECList = 
EList = 

EList is a list of all non-CDATA elements of ECList.

El = XMLElement
Path = 
PathItem = PathElem | PathAttr | PathCDATA
PathElem = {elem, Name}
PathAttr = {attr, Name}
PathCDATA = cdata
Name = string()
Res = string() | XMLElement

If Path is empty, then returns El. Else sequentially
consider elements of Path. Each element is one of:

Name is name of subelement of
El, if such element exists, then this element considered in
following steps, else returns empty string.
If El have attribute Name, then
returns value of this attribute, else returns empty string.
Returns CDATA of El.
TODO:

         get_cdata/1, get_tag_cdata/1
         get_attr/2, get_attr_s/2
         get_tag_attr/2, get_tag_attr_s/2
         get_subtag/2

1 Introduction

ejabberdejabberd

  • Works on most of popular platforms: *nix (tested on Linux, FreeBSD and
    NetBSD) and Win32
  • Distributed: You can run ejabberd on a cluster of machines to let all of
    them serve one Jabber domain.
  • Fault-tolerance: You can setup an ejabberd cluster so that all the
    information required for a properly working service will be stored
    permanently on more than one node. This means that if one of the nodes
    crashes, then the others will continue working without disruption.
    You can also add or replace nodes «on the fly».
  • Built-in Multi-User Chat service
  • Built-in IRC transport
  • Built-in Publish-Subscribe service
  • Built-in Jabber Users Directory service based on users vCards
  • Built-in web-based administration interface
  • Built-in HTTP Polling service
  • SSL support
  • Support for LDAP authentication
  • Ability to interface with external components (JIT, MSN-t, Yahoo-t, etc.)
  • Migration from jabberd14 is possible
  • Mostly XMPP-compliant
  • Support for JEP-0030 (Service Discovery).
  • Support for JEP-0039 (Statistics Gathering).
  • Support for xml:lang

ejabberd

  • No support for virtual domains
  • No support for authentication and STARTTLS in S2S connections

4 Authentication

4.0.1  External

The external authentication script follows
the erlang port driver API.

That script is supposed to do theses actions, in an infinite loop:

  • read from stdin: AABBBBBBBBB…..

    • A: 2 bytes of length data (a short in network byte order)
    • B: a string of length found in A that contains operation in plain text
      operation are as follows:

      • auth:User:Server:Password (check if a username/password pair is correct)
      • isuser:User:Server (check if it’s a valid user)
      • setpass:User:Server:Password (set user’s password)
      • tryregister:User:Server:Password (try to register an account)
      • removeuser:User:Server (remove this account)
      • removeuser3:User:Server:Password (remove this account if the password is correct)
  • write to stdout: AABB
    • A: the number 2 (coded as a short, which is bytes length of following result)
    • B: the result code (coded as a short), should be 1 for success/valid, or 0 for failure/invalid

Example python script

#!/usr/bin/python

import sys
from struct import *

def from_ejabberd():
    input_length = sys.stdin.read(2)
    (size,) = unpack('>h', input_length)
    return sys.stdin.read(size).split(':')

def to_ejabberd(bool):
    answer = 0
    if bool:
        answer = 1
    token = pack('>hh', 2, answer)
    sys.stdout.write(token)
    sys.stdout.flush()

def auth(username, server, password):
    return True

def isuser(username, server):
    return True

def setpass(username, server, password):
    return True

while True:
    data = from_ejabberd()
    success = False
    if data == "auth":
        success = auth(data, data, data)
    elif data == "isuser":
        success = isuser(data, data)
    elif data == "setpass":
        success = setpass(data, data, data)
    to_ejabberd(success)

PHP и fcgid

Для загрузки больших файлов и снятия ограничения надо отредактировать файлы конфигов отвечающих за выполнение скриптов

Добавить:

Я  не стал париться и сделал ограничение в 2гб на сервере, вы можете  сделать меньше, этот объем для сервера prosody будет регулироваться еще  и в конфиге.

Так же на всякий случай я сделал следующие изменения в файлах:

Установил следующие параметры для загрузки файлов и выполнение скриптов

В файле /etc/nginx/nginx.confПараметр изменить надо тоже, вы можете ставить везде не 2гб как я а скажем 500m как хотите:

Это сняло ограничение на mod_http_upload_external ну вернее на nginx, который файлы эти закачивал.

8 Modules

8.1  Module gen_iq_handler

The module allows to easily write handlers for IQ packets
of particular XML namespaces that addressed to server or to users bare JIDs.

In this module the following functions are defined:

Component = Module = Function = atom()
Host = NS = string()
Type = no_queue | one_queue | parallel

Registers function as handler for IQ packets on
virtual host that contain child of namespace in
. Queueing discipline is . There are at least
two components defined:

Handles packets that addressed to server JID;
Handles packets that addressed to users bare JIDs.
Component = atom()
Host = NS = string()

Removes IQ handler on virtual host for namespace from
.

Handler function must have the following type:

From = To = jid()
-module(mod_cputime).

-behaviour(gen_mod).

-export([start/2,
         stop/1,
         process_local_iq/3]).

-include("ejabberd.hrl").
-include("jlib.hrl").

-define(NS_CPUTIME, "ejabberd:cputime").

start(Host, Opts) ->
    IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),
    gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_CPUTIME,
                                  ?MODULE, process_local_iq, IQDisc).

stop(Host) ->
    gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_CPUTIME).

process_local_iq(From, To, {iq, ID, Type, XMLNS, SubEl}) ->
    case Type of
        set ->
            {iq, ID, error, XMLNS,
             };
        get ->
            CPUTime = element(1, erlang:statistics(runtime))/1000,
            SCPUTime = lists:flatten(io_lib:format("~.3f", CPUTime)),
            {iq, ID, result, XMLNS,
             ,
               , }]}]}
    end.

8.2  Services

-module(mod_echo).

-behaviour(gen_mod).

-export([start/2, init/1, stop/1]).

-include("ejabberd.hrl").
-include("jlib.hrl").

start(Host, Opts) ->
    MyHost = gen_mod:get_opt(host, Opts, "echo." ++ Host),
    register(gen_mod:get_module_proc(Host, ?PROCNAME),
             spawn(?MODULE, init, )).

init(Host) ->
    ejabberd_router:register_local_route(Host),
    loop(Host).

loop(Host) ->
    receive
        {route, From, To, Packet} ->
            ejabberd_router:route(To, From, Packet),
            loop(Host);
        stop ->
            ejabberd_router:unregister_route(Host),
            ok;
        _ ->
            loop(Host)
    end.

stop(Host) ->
    Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
    Proc ! stop,
    {wait, Proc}.

Как запустить свой Jabber-сервер

Зачем тебе нужен свой Jabber-сервер придумай сам, мы философствовать на эту тему не будем, а я просто покажу как запустить свой сервер, как для доступа из локальной сети так и из глобальной.

Запускать и настраивать мы будем Openfire, это, как по мне, оптимальное решение. Установка и запуск достаточно простые, а ещё он имеет приятный и интуитивно понятный графический интерфейс, что само по себе прекрасно.

Что касается операционной системы, то самым логичным вариантом будет какое-нибудь серверное решение, например Ubuntu Server.

Для начала нам понадобится установить зависимости, такая одна – это Java:

Теперь ставим серверные приколюхи, а именно Apache, PHP, MySQL:

По поводу MySQL нужно отметить, что в Openfire есть встроенная база данных и можно, в принципе, использовать и её, но внешняя база данных гораздо производительнее. Поэтому мы будем использовать MySQL и следующим шагом настраиваем её, а именно создаём базу, назначаем права и так далее:

Следующий подготовительный этап, это решение проблемы динамического IP, но заниматься этим нужно, если хочется чтоб сервер был доступен из Интернета, если планируется использовать сервер только в локальной сети, этот пункт смело пропускай.

Оптимальным вариантом решения этого вопроса будет использование утилиты ddclient, которая будет, с заданным интервалом проверять наш внешний IP и если он изменится, автоматически будет обновлять IP у нашего хоста (мы его сейчас создадим).

Для начала регистрируемся на любом сервисе предоставляющем услуги динамического DNS. Я буду использовать https://dyn.com/. Для его использования нужно создать новый хост и указать текущий внешний IP.

Устанавливаем ddclient и зависимости:

Он в процессе установки будет задавать вопросы, как ты на них ответишь особо не важно, потому что все настройки мы после отредактируем вручную. Для этого открываем файл /etc/ddclient.conf и в нём вписываем такие строки:. Сохраняем изменения, перезапускаем демона и можем проверить что бы он работал:

Сохраняем изменения, перезапускаем демона и можем проверить что бы он работал:

Что бы убедится что IP обновляется можно заглянуть в логи:

Подготовительные этапы окончены, можем скачивать и устанавливать Openfire. Сам сервер можно скачать здесь: или командой:

Не забудь чекнуть последнюю версию. Устанавливаем и проверяем чтобы работало:

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

Всё готово, открываем браузер и переходим по адресу http://localhost:9090 и попадаем в консоль администратора Openfire, которая предложит нам сделать первичную настройку.

Выводы

В целом, установка Jabber-сервера не должна вызвать особых затруднений. Есть решения для разных задач. Тот же eJabberd максимально универсален и не требует ничего лишнего, однако это наиболее объёмный и монструозный инструмент. Prosody попроще и полегче, однако базу к нему придётся ставить отдельно. Наконец, Openfire хотя и крутится на Java, но при этом в настроенном виде весьма неплох, а также не пугает собственно процессом конфигурации. Всё делается в браузере.

Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *