Pull to refresh

Установка легковесного Jabber сервера Prosody (v0.9 и v0.10beta)

Reading time 6 min
Views 35K
Это статья о том как настроить jabber сервер Prosody для домашнего, возможно корпоративного, использования. У меня встала задача поднять личный jabber сервер на своем домене, с сохранением истории (возможно синхронизации с клиентом XEP-0136), с поддержкой общения с другими серверами jabber, конференций. В общем всё стандартно и ничего особенного, но при поднятии сервера я столкнулся с двумя проблемами о которых я и планирую сегодня рассказать.

Prosody это легковесный jabber сервер, написаный на языке lua, поддерживающий множество ХЕР(XMPP Extension Protocol) стандартов, все поддерживаемы стандарты вы можете посмотреть на этой странице. На вопрос «почему lua» создатель prosody Matthew Wild говорит что это очень простой язык который имеет быстрый интерпретатор, что и является причиной такого необычного выбора.

В этой статье я буду устанавливать prosody на Debian 7.

Сначала нам нужно добавить в source.list нужный репозиторий:
$ echo deb http://packages.prosody.im/debian $(lsb_release -sc) main | sudo tee -a /etc/apt/sources.list

После нужно ключ применить:
$ wget https://prosody.im/files/prosody-debian-packages.key -O- | sudo apt-key add -

Нужно обновить репозиторий:
$ sudo apt-get update

Дальше будет 2 версии, по установке Prosody v0.9 и v0.10

Установка Prosody 0.9


Установка версии 0.9, на текущий момент стабильной:
$ sudo apt-get install prosody

Настриваем prosody на файлах, для этого нужно подправить настройки которые находятся в файле "/etc/prosody/prosody.cfg.lua", я сразу приведу весь конфиг, с комментариями:
admins = { "user@example.com" } -- Администраторы сервера

modules_enabled = {

        -- Generally required
                "roster"; -- Allow users to have a roster. Recommended ;)
                "saslauth"; -- Authentication for clients and servers. Recommended if you want to log in.
                "tls"; -- Add support for secure TLS on c2s/s2s connections
                "dialback"; -- s2s dialback support
                "disco"; -- Service discovery
                "posix"; -- POSIX functionality, sends server to background, enables syslog, etc.

        -- Not essential, but recommended
                "private"; -- Private XML storage (for room bookmarks, etc.)
                "vcard"; -- Allow users to set vCards

        -- These are commented by default as they have a performance impact
                --"privacy"; -- Support privacy lists
                --"compression"; -- Stream compression (requires the lua-zlib package installed)

        -- Nice to have
                "version"; -- Replies to server version requests
                "uptime"; -- Report how long server has been running
                "time"; -- Let others know the time here on this server
                "ping"; -- Replies to XMPP pings with pongs
                "pep"; -- Enables users to publish their mood, activity, playing music and more
                "register"; -- Allow users to register on this server using a client and change passwords

        -- Admin interfaces
                "admin_adhoc"; -- Allows administration via an XMPP client that supports ad-hoc commands
                "admin_telnet"; -- Opens telnet console interface on localhost port 5582
}

modules_disabled = {
}

allow_registration = false -- Запретить регистрацию на сервере из клиента

ssl = {
	-- Стандартные ssl сертификаты, доступны при установке
        key = "/etc/prosody/certs/localhost.key";
        certificate = "/etc/prosody/certs/localhost.crt";
}

c2s_require_encryption = true -- Включить клиент-сервер шифрование

s2s_secure_auth = false

pidfile = "/var/run/prosody/prosody.pid"

authentication = "internal_hashed" -- Шифрование паролей (не хранить в открытом виде)

storage = "internal" -- Зранение данных в файлах
log = {
        info = "/var/log/prosody/prosody.log";
        error = "/var/log/prosody/prosody.err";
        "*syslog";
}

VirtualHost "example.com" -- Домен для которого настроен jabber сервер
        ssl = {
		-- Сертификаты для авторизации на этот домен
                key = "/etc/prosody/certs/example.com.key";
                certificate = "/etc/prosody/certs/example.com.crt";
        }

example.com нужно заменить на свой домен везде, после чего нужно сгенерировать ключи:
$ sudo prosodyctl cert generate example.com
$ sudo cp /usr/lib/prosody/example.com* /etc/prosody/certs/

Регистрируем нового пользователя и перезапускаем prosody:
$ sudo prosodyctl register user example.com password
$ sudo prosodyctl restart

Теперь вы можете авторизироваться на сервере, но общаться вы сможете исключительно внутри своего prosody сервера, если вы хотите настроить s2s (сервер-сервер связь) вам нужно прописать в srv dns пару записей:
_xmpp-client._tcp.example.com. 18000 IN SRV 0 5 5222 xmpp.example.com.
_xmpp-server._tcp.example.com. 18000 IN SRV 0 5 5269 xmpp.example.com.
jabber._tcp.example.com. 18000 IN SRV 0 5 5269 xmpp.example.com.

Как только данные применяться должна заработать связь s2s и вы сможете подеключиться к конференциям на jabber.ru или добавить в контактлист и общаться с людьми которые пользуются любыми jabber серверами поддерживающие s2s.

Всё работает хорошо, но вот осталось настроить историю сообщений, его по умолчанию не поддерживает prosody, для этого нужно поставить модуль из prosody-modules под названием «mod_message_logging».
Есть два варианта как можно устанавливать модули в prosody:
1) Нужно скопировать lua файл с содержимым кода модуля в директорию /usr/lib/modules и добавить в конфиг в разделе modules_enabled:
modules_enabled = {
    ...
    "message_logging";
    ...
}

2) Склонировать prosody-modules в любую директорию, дать ей права на чтению для пользователя prosody и добавить в конфиг такое:
plugin_paths = { "/usr/lib/prosody/modules", "/path/to/prosody-modules" }
...
modules_enabled = {
    ...
    "message_logging";
    ...
}

Перезапускаем сервер:
$ prosodyctl restart

И любуемся историей сообщений в /var/lib/prosody/message_logging/. Как вы можете заметить вся история сообщений за 1 день пишется в один файл на сервере для каждого авторизированого пользователся, то есть /var/lib/prosody/message_logs/example.com/2013-12-20/user.msglog содержит логи для этого пользователя за весь день со всеми его контактами.
Мне показалась эта реализация очень не удобной, в конференции prosody сказали что нету нормальной реализации истории сообщений и я немного изменить mod_message_logging и получился mod_message_loggind_diff_files также немного пофиксил проблемы прошлого модуля и получилась такая структура директорий/файлов — по пути /var/lib/prosody/message_logs/example.com/2013-12-20/user директориями со всеми файлами с историей сообщений, все названия файлов это jid контакта или конференции, например «prosody%40conference.prosody.im.msglog».

Подключить можно также как и стандартный mod_message_logging.

На этом можно закончить настройку prosody сервера, но некоторые захотят подключить модуль с поддеркой ХЕР-0136(синхрониация логов на клиент), модуль этот называется mod_mam, но разработчики говорят что с файлами этот модуль работает очень медленно, да и кому-то захочется просто переключиться на БД, но у prosody 0.9 с этим есть проблема.
Текущая реализация модуля для хранения данных в sql при запуске prosody при отсутствии конекта к БД вываливается критической ошибкой и prosody не запускается. Эта проблема остро строит в debian и centos, так как их системы загрузки не разрешают дождаться полной инициализации базы данных для запуска нужного приложения, но в sql2 модуле, который доступен в 0.10, пофиксили эту проблему, по этому мы можем установить prosody 0.10 + mod_mam.

Установка Prosody 0.10


Установка версии 0.10, на текущий момент beta:
$ sudo apt-get install prosody-0.10

Далее повторяем всё как и с версией 0.9 с небольшими изменениями.
1) Меняем место хранения данных из internal на sql2
storage = "sql2"

2) Добавляем настройку для связи к базой. Перед нужной строчкой удаляем "--" и меняем данные на свои для доступа к нужной БД
--sql = { driver = "SQLite3", database = "prosody.sqlite" } -- Default. 'database' is the filename.
--sql = { driver = "MySQL", database = "prosody", username = "prosody", password = "secret", host = "localhost" }
--sql = { driver = "PostgreSQL", database = "prosody", username = "prosody", password = "", host = "localhost" }

3) Устанавливаем lua драйвер для связи с нужной БД, например для sqlite
$ sudo apt-get install lua-dbi-sqlite3

Модуль для логирования в БД находится в prosody-modules под названием «mod_mam», правда в отличии от модуля который пишет историю сообщений в файл, этот модуль сохраняет только личные сообщения. Если вам нужна история ообщений из конференций, вам нужно будет установить mod_message_logging или mod_message_loggind_diff_files. Есть также модуль сохраняющий сообщения конференций mod_mam_muc, но он сохраняет только сообщения из ваших локальных конференций поднятых на вашем сервере (если такие будут модуль может быть полезным).
Есть два варианта как можно устанавливать модули в prosody:
1) Нужно скопировать lua файл с содержимым кода модуля в директорию /usr/lib/modules и добавить в конфиг в разделе modules_enabled:
modules_enabled = {
    ...
    "mam";
    ...
}

2) Склонировать prosody-modules в любую директорию, дать ей права на чтению для пользователя prosody и добавить в конфиг такое:
plugin_paths = { "/usr/lib/prosody/modules", "/path/to/prosody-modules" }
...
modules_enabled = {
    ...
    "mam";
    ...
}

Перезапускаем сервер:
$ prosodyctl restart

После перезагрузки prosody у вас будет настроены истории сообщений и конференций в файлах и история личных сообщений в БД с синхронизацией на клиент.

Надеюсь я кому-то помог, если будет возможность я отвечу на ваши вопросы в комментариях или в ЛС.
Tags:
Hubs:
+6
Comments 15
Comments Comments 15

Articles