-- Prosody configuration for ICQ (nixg.ru) -- Домен: nixg.ru (JID юзеров user@nixg.ru) -- Веб-клиент (Converse.js) остаётся на https://chat.nixg.ru, WS → xmpp.nixg.ru -- Каталог: /opt/icq -- Пути data_path = "/var/lib/prosody" plugin_paths = { "/etc/prosody/modules" } -- Логи (глобальная секция) log = { info = "/var/log/prosody/prosody.log"; error = "/var/log/prosody/prosody.err"; -- info = "console"; -- раскомментируй для вывода в docker logs } -- Администрирование (несколько админов поддерживаются — список) admins = { "admin@nixg.ru", "estorozhenko@nixg.ru" } -- Модули (включая стандартные) modules_enabled = { -- Generally required "roster"; -- Список контактов "saslauth"; -- Аутентификация "tls"; -- TLS "dialback"; -- s2s dialback "disco"; -- Service discovery "carbons"; -- Копии сообщений на все устройства "privilege"; -- XEP-0356 Privileged Entity (roster sync для мостов Slidge) "pep"; -- Personal eventing (OMEMO, avatars) -- "pubsub"; -- 13.0: НЕ модуль хоста! Загружается как Component (см. ниже Component "pubsub.nixg.ru") "private"; -- Приватные хранилища XML "blocklist"; -- Чёрный список "vcard4"; -- vCard 4 "vcard_legacy"; -- vCard 2 (для старых клиентов) "version"; -- Версия сервера "uptime"; -- Время работы "time"; -- Время "ping"; -- XMPP Ping -- "register"; -- In-band registration ОТКЛЮЧЕНА (allow_registration=false; создание только prosodyctl) "adhoc"; -- ad-hoc команды "admin_adhoc"; -- админ-команды "admin_web"; -- XMPP ad-hoc админ-команды (adminsub; НЕ веб-панель — см. разд. 10 WALKTHROUGH) "bosh"; -- BOSH (HTTP long-polling, для mod_admin_web) -- Messaging / Chat "csi"; -- Client State Indication (экономия батареи) -- "smacks"; -- Stream Management (community-модуль, пока нет) "offline"; -- Хранение оффлайн-сообщений "presence"; -- Присутствие -- Message archive "mam"; -- Message Archive Management (XEP-0313) -- HTTP (для веб-клиентов) "websocket"; -- WebSocket для веб-клиентов -- Прочее "server_contact_info"; -- Контактная информация сервера } -- Отключить модули, которые не нужны/мешают modules_disabled = { -- "s2s"; -- (раскомментируй, чтобы отключить федерацию, но она нужна!) } -- Порты и интерфейсы c2s_ports = { 5222 } s2s_ports = { 5269 } -- Слушать на всех интерфейсах (в контейнере) c2s_interface = "0.0.0.0" s2s_interface = "0.0.0.0" -- HTTP (websocket + BOSH + upload) http_ports = { 5280 } http_interfaces = { "0.0.0.0" } -- HTTPS-порт для HTTP Upload (mod_http_upload требует TLS) — с LE-сертификатом https_ports = { 5281 } https_interfaces = { "0.0.0.0" } -- External components (XEP-0114) для мостов (Slidge/Telegram, затем WhatsApp) -- ВНИМАНИЕ 13.0: component_ports УДАЛЁН (слушатель жёстко на 5347). Listener поднимается -- наличием module-less Component-блока ниже. component_interfaces — глобально. component_interfaces = { "0.0.0.0" } component_secrets = { ["telegram.nixg.ru"] = "83276db6e870f540163f271d9bd7d3a390530b9ad7b45f58", } -- Глобальный SSL для HTTPS-порта (LE-серт nixg.ru, SAN: nixg.ru + xmpp.nixg.ru) ssl = { key = "/etc/prosody/certs/nixg.ru.key"; certificate = "/etc/prosody/certs/nixg.ru.crt"; } -- Разрешить WebSocket-подключения с нашего веб-клиента (страница на chat.nixg.ru) cross_domain_websocket = { "https://chat.nixg.ru", "https://xmpp.nixg.ru" } -- WebSocket за TLS-прокси (Caddy → nginx → Prosody): Prosody 13 терминально снижает -- TLS на edge, и WS-сессия приходит "insecure" → SASL-механизмы не предлагаются → -- Converse: "no-auth-mech" + бесконечные переподключения (белый кружок). -- Штатный флаг mod_websocket (Prosody 13+): считать WS endpoint безопасным. -- Использовать вместо trusted_proxies (тот влияет только на логирование IP). consider_websocket_secure = true -- Домен (JID юзеров: user@nixg.ru) VirtualHost "nixg.ru" -- Аутентификация: внутренняя (mod_auth_internal_hashed) authentication = "internal_hashed" -- Хранилище (встроенное, файлы) storage = "internal" -- Регистрация ВЫКЛЮЧЕНА (in-band): создание пользователей только prosodyctl register allow_registration = false -- TLS: сертификаты для домена (для c2s/s2s 5222/5269) ssl = { key = "/etc/prosody/certs/nixg.ru.key"; certificate = "/etc/prosody/certs/nixg.ru.crt"; -- Для федерации нужен полный chain + private key } -- Привилегии для мостов Slidge (XEP-0356): синхронизация ростера + legacy carbons privileged_entities = { ["telegram.nixg.ru"] = { roster = "both"; message = "outgoing"; iq = { ["http://jabber.org/protocol/pubsub"] = "both"; ["http://jabber.org/protocol/pubsub#owner"] = "set"; ["urn:xmpp:http:upload:0"] = "get"; }; }; } -- PubSub (XEP-0060) — в 13.0 ТОЛЬКО как Component (не модуль хоста). -- Основа для bookmarks/лент; PEP (личные узлы) продолжает жить на VirtualHost через mod_pep. Component "pubsub.nixg.ru" "pubsub" -- MUC-компонент (групповые чаты) conference.nixg.ru Component "conference.nixg.ru" "muc" name = "ICQ Family Chat" restrict_room_creation = false -- все могут создавать комнаты max_history_messages = 200 -- Доп. модули MUC: vcard_muc (аватары комнат, XEP-0153 в MUC), muc_moderation (XEP-0425 модерация) modules = { "vcard_muc", "muc_moderation" } -- HTTP Upload (XEP-0363) — mod_http_upload (community-модуль, установлен из apt prosody-modules, -- скопирован в ./modules/mod_http_upload/. Работает как Component (НЕ в modules_enabled). Component "upload.nixg.ru" "http_upload" http_upload_file_size_limit = 10 * 1024 * 1024 -- 10 MB (лимит HTTP-парсера Prosody) http_upload_expire_after = 7 * 24 * 60 * 60 -- хранить 7 дней http_upload_require_authentication = true -- только авторизованные -- 13.0: слот выдаётся ТОЛЬКО origin.type=="c2s" ИЛИ JID из access-списка. -- Slidge просит слот от имени компонента telegram.nixg.ru → добавить в access, -- иначе "No upload slot" (регрессия 13.0, в 0.11 пускало компоненты молча). http_upload_access = { "telegram.nixg.ru" } http_upload_path = "/var/lib/prosody/http_upload" -- Внешний URL (без :5281) — Caddy на vps02 проксирует upload.nixg.ru → 10.8.0.2:5281 http_external_url = "https://upload.nixg.ru" -- Мосты (Slidge) — external component (XEP-0114) для Telegram. -- Slidge подключается к component_ports (5347) с секретом из component_secrets. Component "telegram.nixg.ru" component_secret = "83276db6e870f540163f271d9bd7d3a390530b9ad7b45f58" modules_enabled = { "disco", "privilege" }