Настройка mam в Prosody

mam - менеджер архивных сообщений (Message Archive Manager), позволяет хранить историю переписки на сервере. Если клиент поддерживает XEP-0313, то он сможет подгрузить с сервера переписку из архива, даже если эта переписка происходила через другой клиент.

Для настройки этой функции понадобится пакет - prosody-modules, т.к. нужный нам модуль находится в этом пакете. Модуль mam использует для хранения сообщений модуль storage, который, в свою очередь, может хранить информацию разных видов в разных хранилищах. Модуль storage позволяет хранить архив сообщений только в реляционной базе данных. Хранение архива сообщений возможно только в одной из баз данных SQL: SQLite3, MySQL, PostgreSQL. Однако, хранение архива сообщений в реляционной базе данных поддерживается только в Prosody версий 0.10 и выше. В дистрибутиве Debian Stretch имеется только Prosody версии 0.9. К счастью, в репозитории stretch-backports имеется готовый пакет с Prosody версии 0.11. К несчастью, когда я проделал все описанные ниже действия по установке Prosody версии 0.11.2, сломалась поддержка протокола BOSH. Что касается поддержки архива сообщений, то и она не заработала. Во всяком случае, в базе данных нет никаких намёков на это.

Подключим репозиторий, добавив в файл /etc/apt/sources.list одну строчку:

deb http://mirror.yandex.ru/debian stretch-backports main contrib non-free

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

# apt-get update

Теперь можно посмотреть варианты пакета prosody, доступные в репозиториях. Для этого можно воспользоваться следующей командой:

# apt-cache policy prosody

В моём случае эта команда вывела следующую информацию:

prosody:
  Установлен: 0.9.12-2+deb9u2
  Кандидат:   0.9.12-2+deb9u2
  Таблица версий:
     0.11.2-1~bpo9+1 100
        100 http://mirror.yandex.ru/debian stretch-backports/main amd64 Packages
 *** 0.9.12-2+deb9u2 500
        500 http://mirror.yandex.ru/debian stretch/main amd64 Packages
        500 http://mirror.yandex.ru/debian-security stretch/updates/main amd64 Packages
        100 /var/lib/dpkg/status</pre>

Установим пакет из репозитория stretch-backports:

# apt-get install -t stretch-backports prosody

Вместе с новым пакетом prosody также будут обновлены пакеты с языком Lua с версии 5.1 до версии 5.2, т.к. Prosody версии 0.11 использует особенности Lua версии 5.2 (предыдущая версия 0.10 использует Lua 5.1).

При обновлении пакета мне было предложено обновить и файл конфигурации. Я запустил сравнение версий файлов конфигурации, скопировал внесённые мной изменения в отдельный файл, согласился на замену файла конфигурации, а затем снова внёс в него собственные правки. После этого я проверил правильность файла конфигурации при помощи следующей команды:

# prosodyctl check config

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

Теперь можно установить пакет prosody-modules:

# apt-get install prosody-modules

Модулю требуется база данных для сохранения архивных сообщений. В качестве примера приведу настройку базы данных под управлением MariaDB. Для начала, если сервер MariaDB ещё не установлен, его необходимо установить:

# apt-get install mariadb-server

Подключимся к MariaDB:

$ mysql -uroot -p mysql

И после ввода пароля, который был указан при инсталляции СУБД, выполним запрос на создание базы данных с именем prosody:

MariaDB [mysql]>CREATE DATABASE prosody CHARSET 'UTF8';
Query OK, 1 row affected (0.00 sec)

Теперь нужно создать пользователя, от имени которого Prosody будет подключаться к базе данных. Я назвал этого пользователя prosody, а пароль сгенерировал при помощи программы pwgen. Поскольку СУБД установлена на том же компьютере, что и сам сервер Prosody, то при создании пользователя укажем, что этот пароль действует только для локального сетевого узла localhost. Создадим пользователя:

MariaDB [mysql]> INSERT INTO user(user, password, host) VALUES('prosody', PASSWORD('prosody_password'), 'localhost');
Query OK, 1 row affected, 3 warnings (0.12 sec)
MariaDB [mysql]>FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.07 sec)

Почти всё готово, осталось только выдать права доступа к базе данных созданному пользователю:

MariaDB [mysql]>GRANT ALL ON prosody.* TO prosody@localhost;
Query OK, 0 rows affected (0.04 sec)
MariaDB [mysql]>FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

Выйдем из консольного SQL-клиента, нажав Ctrl-D.

Теперь приступим к настройке самого Prosody. Откроем файл /etc/prosody/prosody.cfg.lua и впишем в секцию modules_enabled модуль:

"mam";

Ниже настроим сам модуль:

max_archive_query_results = 50;
default_archive_policy = true;
archive_expires_after = "never";
archive_cleanup_interval = 24 * 60 * 60;

Опции имеют следующий смысл:

  • max_archive_query_results - задаёт количество сообщений, которое клиент может запросить у сервера за один раз. При необходимости получить больше сообщений клиент должен делать дополнительные запросы.
  • default_archive_policy - позволяет выбрать, переписку с какими клиентами нужно хранить. Значение false означает, что хранить переписку не нужно. Значение true включает хранение всей переписки. Значение "roster" включает хранение переписки только с теми собеседниками, которые есть в списке собеседников.
  • archive_expires_after - указывает, как долго нужно хранить сообщения на сервере. Можно указать числовое значение с одним из суффиксов: d - сутки, w - недели, m - месяцы, y - года. Если нужно указать более короткий интервал времени, то его можно указать числом без суффикса, в секундах. Если же сообщения из архива удалять не нужно, то можно указать значение "never". По умолчанию сообщения будут храниться одну неделю.
  • archive_cleanup_interval - задаёт интервал в секундах, с которым сервер Prosody будет очищать базу данных от устаревших сообщений.

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

storage = {
  archive = "sql"
}
sql = {
  driver = "MySQL";
  database = "prosody";
  host = "localhost";
  port = 3306;
  username = "prosody";
  password = "prosody_password";
}
sql_manage_tables = true

Модулю mam для работы с MariaDB понадобится модуль для работы с базой данных MySQL. Перед перезапуском демона установим необходимые пакеты из репозитория stretch-backports:

# apt-get install -t stretch-backports lua-dbi-common lua-dbi-mysql

Перезапустим Jabber-сервер Prosody, чтобы новые настройки вступили в силу:

# systemctl restart prosody.service