6381
правка
Rain (обсуждение | вклад) м (Рестарт Coturn) |
Rain (обсуждение | вклад) |
||
(не показано 18 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
В этой статье приводится пример настройки [[Prosody]] - одного из самых популярных и легковесных jabber-серверов. Для сервера написано просто-таки огромное число модулей на все случаи жизни, поэтому в руководстве, основанном на версии 0.12.4, будет показано подключение актуальных и популярных функций. В качестве сертификатов будем использовать Let's Encrypt - и все это на Debian GNU/Linux. | В этой статье приводится пример настройки [[Prosody]] - одного из самых популярных и легковесных jabber-серверов. Для сервера написано просто-таки [https://modules.prosody.im/all.html огромное число модулей] на все случаи жизни, поэтому в руководстве, основанном на версии 0.12.4, будет показано подключение актуальных и популярных функций. В качестве сертификатов будем использовать Let's Encrypt, а в качестве хранилища данных, в том числе архива сообщений - MySQL<ref name="mysql"></ref> - и все это на Debian GNU/Linux. | ||
Рассмотрим особенности данной конфигурации. | Рассмотрим особенности данной конфигурации. | ||
Строка 90: | Строка 90: | ||
}} | }} | ||
В каталогах сервера не обязательно должен быть какой-то контент, хотя, например, на основном домене можно разместить какую-то страничку, посвященную jabber-серверу, а на поддомене '''conference''' разместить чат-логи [[Конференции|конференций]]. Субдомен '''upload''' можно приспособить под загружаемые через HTTP Upload файлы, чтобы в дальнейшем их раздавал веб-сервер<ref name="http_upload">В таком случае ему нужно обеспечить доступ к каталогу '''/var/lib/prosody/ | В каталогах сервера не обязательно должен быть какой-то контент, хотя, например, на основном домене можно разместить какую-то страничку, посвященную jabber-серверу, а на поддомене '''conference''' разместить чат-логи [[Конференции|конференций]]. Субдомен '''upload''' можно приспособить под загружаемые через HTTP Upload файлы, чтобы в дальнейшем их раздавал веб-сервер<ref name="http_upload">В таком случае ему нужно обеспечить доступ к каталогу '''/var/lib/prosody/upload*''', плюс обеспечить нужные права веб-серверу, чтобы он мог читать файлы, загруженные через jabber-сервер. Альтернативный вариант - использовать веб-сервер, обслуживающий домен '''upload.EXAMPLE.COM''' в качестве прокси и заворачивающий все запросы на https://upload.EXAMPLE.COM:5281/file_share/. Такое решение имеет еще одно преимущество: разнообразные клиенты (не только Jabber) будут гораздо охотнее показывать превью для обычных HTTP/HTTPS-ссылок (т.е., на 80 или 443-м порту), а не тех, где контент отдается на "необычном" порту - вроде 5281 в данном примере.</ref>. | ||
После всех приготовлений<ref>Более подробно можно почитать тут: [[Свой сервер: подготовка веб-сервера и сертификатов]]</ref> создайте все необходимые сертификаты. Для этого воспользуйтесь следующими командами (выполнять надо от пользователя '''root'''): | После всех приготовлений<ref>Более подробно можно почитать тут: [[Свой сервер: подготовка веб-сервера и сертификатов]]</ref> создайте все необходимые сертификаты. Для этого воспользуйтесь следующими командами (выполнять надо от пользователя '''root'''): | ||
Строка 104: | Строка 104: | ||
После успешного выполнения команд будет выдана информация о созданном сертификате, в том числе 2 файла - цепочка ключей и приватный ключ - сохраните эти пути для дальнейшего использования, они нам еще пригодятся. Всего получится 10 файлов. certbot обновляет сертификаты автоматически, если срок их истечения составляет менее 30 дней - т.е., обновление происходит раз в 2 месяца. | После успешного выполнения команд будет выдана информация о созданном сертификате, в том числе 2 файла - цепочка ключей и приватный ключ - сохраните эти пути для дальнейшего использования, они нам еще пригодятся. Всего получится 10 файлов. certbot обновляет сертификаты автоматически, если срок их истечения составляет менее 30 дней - т.е., обновление происходит раз в 2 месяца. | ||
Так как Prosody работает от своего пользователя и не имеет доступа к сертификатам, созданным certbot от рута, то надо каким-то образом предоставить доступ | Так как Prosody работает от своего пользователя и не имеет доступа к сертификатам, созданным certbot от рута, то надо каким-то образом предоставить серверу доступ к сертификатам. Самым простым и корректным вариантом на сейчас является выполнение следующей команды от рута<ref>https://prosody.im/doc/letsencrypt</ref>: | ||
prosodyctl --root cert import /etc/letsencrypt/live | prosodyctl --root cert import /etc/letsencrypt/live | ||
Строка 112: | Строка 112: | ||
== Установка и настройка Prosody == | == Установка и настройка Prosody == | ||
Все подготовительные процедуры завершены, теперь можно приступать непосредственно к установке и настройке своего jabber-сервера. Для поддержки звонков потребуется еще STUN/TURN-сервер - в качестве него будем использовать Coturn. В Debian установить Prosody с поддержкой MySQL и Coturn можно командой | Все подготовительные процедуры завершены, теперь можно приступать непосредственно к установке и настройке своего jabber-сервера. Для поддержки звонков потребуется еще STUN/TURN-сервер - в качестве него будем использовать Coturn. В Debian установить Prosody с поддержкой MySQL<ref name="mysql">На самом деле выбор MySQL обусловлен с одной стороны ее популярностью на веб-хостингах, с другой - возможностью хранить большие объемы данных, которые могут потребоваться, если вы хотите хранить, например, архив сообщений за длительное время. Однако если таких планов нет и это будет сервер для одного или нескольких человек со скромными запросами - то вполне можно обойтись Sqlite.</ref> и Coturn можно командой | ||
apt-get install prosody coturn lua-dbi-mysql | apt-get install prosody coturn lua-dbi-mysql | ||
Строка 167: | Строка 167: | ||
prosodyctl install --server=https://modules.prosody.im/rocks/ mod_cloud_notify # Поддержка PUSH-уведомлений | prosodyctl install --server=https://modules.prosody.im/rocks/ mod_cloud_notify # Поддержка PUSH-уведомлений | ||
prosodyctl install --server=https://modules.prosody.im/rocks/ mod_cloud_notify_extensions # Дополнительные модули для PUSH | prosodyctl install --server=https://modules.prosody.im/rocks/ mod_cloud_notify_extensions # Дополнительные модули для PUSH | ||
prosodyctl install --server=https://modules.prosody.im/rocks/ mod_register_web # Поддержка регистрации через веб-страницу | prosodyctl install --server=https://modules.prosody.im/rocks/ mod_register_web # Поддержка регистрации через веб-страницу | ||
prosodyctl install --server=https://modules.prosody.im/rocks/ mod_mam_adhoc # Возможность управлять настройками MAM-архива из jabber-клиента | prosodyctl install --server=https://modules.prosody.im/rocks/ mod_mam_adhoc # Возможность управлять настройками MAM-архива из jabber-клиента | ||
prosodyctl install --server=https://modules.prosody.im/rocks/ mod_throttle_presence # Ограничиваем трафик статусов | |||
prosodyctl install --server=https://modules.prosody.im/rocks/ mod_reload_modules # Ставим для возможности обновлять сертификаты без перезагрузки | |||
Конфигурационный файл у Prosody состоит из нескольких секций: | Конфигурационный файл у Prosody состоит из нескольких секций: | ||
Строка 244: | Строка 243: | ||
-- Nice to have | -- Nice to have | ||
"csi_simple"; -- Simple but effective traffic optimizations for mobile devices | "csi_simple"; -- Simple but effective traffic optimizations for mobile devices | ||
"ping"; -- Replies to XMPP pings with pongs | "ping"; -- Replies to XMPP pings with pongs | ||
"register"; -- Allow users to register on this server using a client and change passwords | "register"; -- Allow users to register on this server using a client and change passwords | ||
Строка 284: | Строка 280: | ||
"external_services"; -- calls | "external_services"; -- calls | ||
"admin_adhoc"; -- ad-hoc administration of server | "admin_adhoc"; -- ad-hoc administration of server | ||
"reload_modules"; | |||
} | } | ||
reload_modules = { "tls" } | |||
-- These modules are auto-loaded, but should you want | -- These modules are auto-loaded, but should you want | ||
Строка 542: | Строка 541: | ||
modules_enabled = { | modules_enabled = { | ||
"admin_web" | "admin_web" | ||
--"invites"; -- Create and manage invites | |||
--"invites_adhoc"; -- Allow admins/users to create invitations via their client | |||
--"invites_register"; -- Allows invited users to create accounts | |||
} | } | ||
allow_registration = false -- Allow users to register new accounts via in-band | allow_registration = false -- Allow users to register new accounts via in-band | ||
Строка 558: | Строка 560: | ||
options = { "no_sslv2", "no_sslv3" } | options = { "no_sslv2", "no_sslv3" } | ||
} | } | ||
proxy65_address = "proxy.EXAMPLE.COM" | -- proxy65_address = "proxy.EXAMPLE.COM" | ||
proxy65_acl = { "EXAMPLE.COM" } | proxy65_acl = { "EXAMPLE.COM" } | ||
Строка 566: | Строка 568: | ||
"muc_mam", | "muc_mam", | ||
"vcard_muc", | "vcard_muc", | ||
"muc_moderation | "muc_moderation" | ||
} | } | ||
ssl = { | ssl = { | ||
Строка 581: | Строка 582: | ||
restrict_room_creation = "local" | restrict_room_creation = "local" | ||
Component "upload.EXAMPLE.COM" " | Component "upload.EXAMPLE.COM" "http_file_share" | ||
ssl = { | ssl = { | ||
key = "/etc/prosody/certs/upload.EXAMPLE.COM.key"; | key = "/etc/prosody/certs/upload.EXAMPLE.COM.key"; | ||
Строка 588: | Строка 589: | ||
} | } | ||
http_file_share_size_limit = 100*1024*1024 -- 100 MB per file | |||
-- | http_file_share_expires_after = 7*86400 -- file expiration - 1 week | ||
http_file_share_global_quota = 1024*1024*1024*10 -- 10 GiB total | |||
Component "pubsub.EXAMPLE.COM" "pubsub" | Component "pubsub.EXAMPLE.COM" "pubsub" | ||
Строка 602: | Строка 602: | ||
}} | }} | ||
Файл конфигурации Prosody очень хорошо комментирован, поэтому рассмотрим ключевые моменты, а также опции, добавленные для дополнительно установленных модулей. | |||
* Первым в конфиг-файле идет [[Jabber ID]] будущего администратора - ему будут доступны команды управления сервером, а также будут присылаться различные уведомления. | |||
* В '''plugin_paths''' добавляется путь к каталогу с устанавливаемыми плагинами. | |||
* Далее идет обширный список модулей. Рассмотрим некоторые: | |||
** '''turn_external''' позволит нам подключить настроенный ранее Coturn к Prosody для работы звонков. | |||
** '''cloud_notify''' включит поддержку PUSH-уведомлений. | |||
** '''register_web''' включает регистрацию через веб-страницу. Она доступна по адресу https://EXAMPLE.COM:5281/register_web. Штатно тут включена простенькая CAPTCHA, но можно использовать reCaptcha, для этого дополнительно необходимо будет указать ключи для этого сервиса. | |||
** '''admin_adhoc''' позволит выполнять ряд команд на сервере с JID'а администратора из тех клиентов, которые умеют [[Ad-Hoc]]. | |||
* Далее следуют настройки, в которых можно усилить или ослабить проверки сертификатов для других серверов. | |||
* Следующей ключевой настройкой будет указание сервера баз данных. Как мы уже условились выше, для хранения данных сервера [[Свой сервер: подготовка базы данных|будем использовать MySQL или MariaDB]]. Prosody имеет весьма простую структуру базы и встроенную схему, поэтому дополнительных действий не требуется. | |||
* В '''archive_expires_after''' можем указать, как скоро нужно чистить архив сообщений для MAM. Для конференций есть отдельная настройка, она будет описана ниже. | |||
* В '''turn_external_host''' и '''turn_external_secret''' указывается адрес Coturn и тот самый ключ, который прописывали в '''/etc/turnserver.conf'''. | |||
* Далее - несколько опций касательно безопасности: | |||
** '''c2s_direct_tls_ports''' и '''s2s_direct_tls_ports''' включает работу с TLS-портами - они должны быть те же, что указывались в SRV-записях в DNS. | |||
** '''c2s_require_encryption''' и '''s2s_require_encryption''' означает использование исключительно шифрованных соединений между серверами, а также между сервером и клиентом. | |||
** '''tls_profile''' настраивает перечень шифров и протоколов, которые может использовать Prosody. | |||
* В '''contact_info''' можно перечислить контакты администратора и, например, адрес конференции поддержки сервера. | |||
* '''external_services''' описывает сервисы, которые предоставляет Coturn. | |||
На этом настройка основной части завершена и далее идет настройка виртуальных хостов и их сервисов: | |||
* В секции VirtualHost идет указание SSL-сертификатов для домена, а также разрешение регистрации через jabber-клиент и включение веб-интерфейса для управления сервером, который доступен по адресу https://example.com:5281/admin. | |||
* '''invites''' и сопутствующие ему модули позволяют сделать регистрацию по приглашениям. Однако есть одно но (на сейчас): это отключит обычную регистрацию. Поэтому какой вариант оставить - решайте сами. | |||
Далее перечисляется несколько компонентов - сервисов для данного сервера. В показанном примере это [[конференции]], [[Передача файлов|proxy]], [[Передача файлов|HTTP Upload]] и [[PEP|pubsub]]. Для каждого из них указывается своя пара сертификатов и ключей. | |||
* Для '''proxy''' можно указать субдомен, на котором он будет доступен, а опция '''proxy65_acl''' перечисляет домены, которые смогут передавать файлы через этот прокси. | |||
* Для конференций включается поддержка MAM и модерирования. В опциях задается включение MAM по-умолчанию, время устаревания MAM-архива, а также правила доступа на создание новых конференций. | |||
* Для модуля '''http_file_share''' перечисляются лимиты на размеры одиночных файлов, а также общий размер хранилища и время устаревания загруженных файлов. Для Prosody сделано несколько реализаций HTTP Upload - например, можно переключиться на '''mod_http_upload''', если mod_http_file_share чем-то не устроит или вообще использовать [https://github.com/horazont/xmpp-http-upload внешний сервис] через '''http_upload_external'''. | |||
Закончив правку файлов конфигурации - перезапустите Prosody: | |||
systemctl restart prosody | |||
Теперь можете создать пользователя-администратора: | |||
prosodyctl adduser admin@EXAMPLE.COM | |||
А также проверить корректность конфигурации следующими командами: | |||
prosodyctl check config | |||
prosodyctl check certs | |||
prosodyctl check turn | |||
Во всех случаях в конце команда должна возвращать "'''All checks passed, congratulations!'''". Сервер готов к использованию! | |||
==Сноски== | ==Сноски== | ||
Строка 614: | Строка 658: | ||
* [https://open-networks.ru/d/67-prosody-im-v012x-ustanovka-i-nastroyka-xmpp-servera-coturn-fail2ban Очень подробное пользовательское руководство по настройке Prosody] | * [https://open-networks.ru/d/67-prosody-im-v012x-ustanovka-i-nastroyka-xmpp-servera-coturn-fail2ban Очень подробное пользовательское руководство по настройке Prosody] | ||
* [https://www.8host.com/blog/ustanovka-prosody-v-ubuntu-18-04/ Еще одно руководство по установке и настройке] | * [https://www.8host.com/blog/ustanovka-prosody-v-ubuntu-18-04/ Еще одно руководство по установке и настройке] | ||
* [https://pingvinus.ru/note/xmmp-prosody ...и еще одно] | |||
[[Category:Свой сервер]] | [[Category:Свой сервер]] |