Files
icq/STATUS.md
T
estorozhenko 3c4190402b Telegram bridge: slidgram + SOCKS5 proxy, mod_privilege (XEP-0356), XEP audit
- docker-compose: сервис slidgram (Slidge->Telegram, внешний компонент XEP-0114)
- кастомный образ slidgram-proxy: SOCKS5-патч (SLIDGRAM_PROXY -> Pyrogram) для маршрутизации через VPS01
- prosody: component telegram.nixg.ru (5347), component_secret в секции Component (0.11!),
  mod_privilege + privileged_entities (roster sync мостов), mod_pubsub включён
- modules/mod_privilege.lua (community, hg.prosody.im)
- docs/slidgram/: офлайн-копия документации slidgram (slidge.im)
- README: секции 'Функциональность (XEP)' и 'Мост Telegram'; XEP-AUDIT.md (полный аудит XEP)
- STATUS.md: мост ПОДКЛЮЧЁН, privilege, аудит
2026-08-29 14:38:25 +00:00

19 KiB
Raw Blame History

ICQ XMPP — ТЕКУЩИЙ СТАТУС И ПЛАН (точка входа для новой сессии)

Обновлено: 2026-08-29 · Сессия: bigbox (/opt/icq) ⚠️ МИГРАЦИЯ НА nixg.ru (2026-08-28): JID юзеров теперь user@nixg.ru, веб-клиент остаётся на chat.nixg.ru, WS → wss://xmpp.nixg.ru. См. MIGRATION.md. ✅ Документация полная и актуальная: WALKTHROUGH.md (все этапы, команды, засады, TLS, HTTP Upload) · PRD.md (требования/архитектура) · MIGRATION.md (переезд).


1. КРИТИЧНЫЕ ДАННЫЕ (для продолжения работы)

Учётные данные

  • admin@nixg.ru / пароль: <СМОТРИ В ЗАЩИЩЁННОМ ХРАНИЛИЩЕ / .env> ← перенесён 2026-08-28 с admin@chat.nixg.ru, ВХОД ПОДТВЕРЖДЁН (проверено через WebSocket: slixmpp + wss://xmpp.nixg.ru/xmpp-websocket → AUTH OK).
  • Если пароль снова понадобится сбросить: docker exec icq-prosody prosodyctl register admin nixg.ru 'НОВЫЙПАРОЛЬ'
  • Старый аккаунт admin@chat.nixg.ru: домен chat.nixg.ru убран из Prosody (VirtualHost теперь nixg.ru).

Инфраструктура (после миграции)

  • bigbox (машина агента), каталог: /opt/icq
  • Контейнеры: icq-prosody (Prosody 0.11.9: 5222/5269/5280/5281), icq-webchat (nginx:8081)
  • vps02 (87.242.100.206, Debian 12, enp3s0): Caddy (443, host-network), iptables DNAT 5222/5269 → 10.8.0.2
  • WireGuard: bigbox 10.8.0.2 ↔ vps02 10.8.0.4; Caddy → 10.8.0.2:8081
  • DNS (Jino):
    • A chat.nixg.ru → 87.242.100.206 (веб-клиент, остаётся)
    • A xmpp.nixg.ru → 87.242.100.206 (XMPP WS, добавлен)
    • A nixg.ru → 81.177.135.175 (визитка, НЕ трогаем)
    • SRV _xmpp-client._tcp.nixg.ru → 0 5 5222 xmpp.nixg.ru. (было chat.nixg.ru)
    • SRV _xmpp-server._tcp.nixg.ru → 0 5 5269 xmpp.nixg.ru. (было chat.nixg.ru)
    • SRV _xmpp-client-websocket._tcp.nixg.ru → 0 5 443 xmpp.nixg.ru. (было chat.nixg.ru)
    • MX mail.nixg.ru — НЕ трогаем (почта)
  • Prosody: VirtualHost nixg.ru, cross_domain_websocket = { "https://chat.nixg.ru", "https://xmpp.nixg.ru" }
  • WebSocket: wss://xmpp.nixg.ru/xmpp-websocket — РАБОТАЕТ (101, авторизация OK, LE-сертификат)

Что уже РАБОТАЕТ (подтверждено)

  • ✅ XMPP-сервер на nixg.ru, федерация (SRV), порты 5222/5269 открыты извне
  • ✅ TLS на 443 (Caddy/Let's Encrypt): xmpp.nixg.ru (LE, получен 2026-08-28) и chat.nixg.ru (страница)
  • ✅ WebSocket-путь целиком: Caddy (xmpp.nixg.ru:443 LE) → nginx:8081 → Prosody:5280 → 101 Switching Protocols
  • ✅ Аутентификация по WebSocket: admin@nixg.ru входит через wss://xmpp.nixg.ru (проверено slixmpp, 2026-08-28)
  • ✅ ВЕБ-ЧАТ https://chat.nixg.ru/ РАБОТАЕТ (v14.0.0, full dist, ru; Converse подключается к wss://xmpp.nixg.ru, вход admin@nixg.ru подтверждён headless-браузером)

2. ТЕКУЩАЯ ПРОБЛЕМА (блокер)

ПУСТАЯ СТРАНИЦА — РЕШЕНО ✅ (2026-08-28 ≈ 18:30 UTC)

КОРЕНЬ ПРИЧИНЫ (диагностировано headless-браузером)

Converse v14 собирается как ES-модуль (ESM), а НЕ как классический UMD-бандл:

  • бандл использует import.meta.url (webpack auto-publicPath) и export{c as default};
  • подключение через обычный <script src="converse.min.js"> даёт в Chrome/Firefox: Uncaught SyntaxError: Cannot use 'import.meta' outside a module → скрипт не выполняется → пустая страница.
  • Ранее лежавший в корне /converse.min.js (1.3MB, скачан с CDN) — это и был ESM-бандл, но без type="module" он молча падал; также отсутствовал /dist/ с чанками.

РЕШЕНИЕ (Шаги 2+3 плана, выполнено)

  1. Скачан официальный релиз converse.js-14.0.0.tgz (GitHub) и full dist разложен в /opt/icq/webchat/dist/: converse.min.js, converse.min.css, chunkjs/locales/... (русская локаль), libomemo.esm.min.js, curve25519_compiled.wasm, sounds, webfonts, images.
  2. /opt/icq/webchat/index.html переписан: <script type="module" src="/dist/converse.min.js">
    • import converse from '/dist/converse.min.js' + converse.initialize({...}). nginx: контейнер монтирует ./webchat:/usr/share/nginx/html — подхватилось без рестарта.
  3. Проверено headless-браузером (chromium --headless + Camofox): UI рендерится (лог-ин форма, русская локаль), вход admin@chat.nixg.ru проходит, XMPP-сессия идёт через wss://chat.nixg.ru/xmpp-websocket.

Остаточные мелочи (не блокеры)

  • ✅ host-meta (XEP-0156) ИСПРАВЛЕН (2026-08-28): nginx webchat отдаёт JSON на /.well-known/host-meta и /.well-known/host-meta.json → wss://xmpp.nixg.ru/xmpp-websocket. Ошибка «XML Parsing Error» в консоли Converse ушла.
  • Ошибка MAM <iq ... max_items: not a number> — запрос архива с нечисловым max_items; появляется при логине, не мешает чату. Проверить настройку MAM (mod_mam) в Prosody 0.11.9.
  • ⚠️ ЗАЛИПШИЙ localStorage браузера: мог остаться старый JID admin@chat.nixg.ru → Converse шлёт host-unknown (Prosody не знает chat.nixg.ru). Лечится: localStorage.removeItem("conversejs-session-jid") или вход в инкогнито. На новом JID admin@nixg.ru работает.
  • SRV _xmpp-client-websocket._tcp.nixg.ru всё ещё → chat.nixg.ru (надо → xmpp.nixg.ru.) — TODO у пользователя.

История гипотез (для справки — была неверна)

  • H1 (assets_path=/dist), H2 (опции initialize), H3 (способ подключения) — НЕ были причиной; реальная причина — ESM-природа v14 + отсутствие type="module" и полного dist.

3. КАК ЭТО БЫЛО ИСПРАВЛЕНО (команды, реально сработавшие)

# 1. Скачать официальный релиз v14 (в нём ПОЛНАЯ dist-структура с чанками)
cd /tmp && curl -sL -o converse-14.0.0.tgz \
  https://github.com/conversejs/converse/releases/download/v14.0.0/converse.js-14.0.0.tgz
mkdir -p converse-extract && tar xzf converse-14.0.0.tgz -C converse-extract
mkdir -p /opt/icq/webchat/dist && cp -r converse-extract/package/dist/* /opt/icq/webchat/dist/

# 2. index.html: подключить КАК ES-МОДУЛЬ (ключ!):
#    <script type="module" src="/dist/converse.min.js"></script>
#    <script type="module">
#      import converse from '/dist/converse.min.js';
#      converse.initialize({ websocket_url: 'wss://chat.nixg.ru/xmpp-websocket', view_mode: 'fullscreen', auto_login: false, theme: 'concord', i18n: 'ru', show_controlbox_by_default: true });
#    </script>

# 3. Проверка headless (без установки новых пакетов — chromium уже в snap):
chromium --headless --no-sandbox --disable-gpu --virtual-time-budget=15000 --dump-dom https://chat.nixg.ru/ | grep converse-login-form
# → если есть converse-login-form — UI отрендерен
# Реальный вход: camofox-browser open https://chat.nixg.ru/ + eval (см. ниже)

Диагностика console-ошибок headless:

# до фикса давало: Uncaught SyntaxError: Cannot use 'import.meta' outside a module
chromium --headless --no-sandbox --disable-gpu --enable-logging=stderr --virtual-time-budget=20000 --dump-dom https://chat.nixg.ru/ 2>&1 | grep -iE 'CONSOLE|Uncaught'
# удобнее: camofox-browser (npm -g) → open/eval/console — см. /tmp/icu-* в WALKTHROUGH

4. ДАЛЬНЕЙШИЕ ЗАДАЧИ (после фикса страницы)

  • Обновить SRV в панели Jino: _xmpp-client/_xmpp-server/_xmpp-client-websocket._tcp.nixg.ru → xmpp.nixg.ru. ✅ (2026-08-28, подтверждено dig @1.1.1.1)
  • Заменить самоподписанный cert Prosody (c2s/s2s 5222/5269) для nixg.ru на настоящий LE — ВЫПОЛНЕНО ✅ (2026-08-28) - certbot 2.9.0 (apt) на bigbox; выпуск: sudo certbot certonly --manual --preferred-challenges dns -d nixg.ru -d xmpp.nixg.ru --manual-auth-hook /bin/true --manual-cleanup-hook /bin/true - TXT-записи _acme-challenge.nixg.ru и _acme-challenge.xmpp.nixg.ru в панели Jino (вручную) - Сертификат: /etc/letsencrypt/live/nixg.ru/ → скопирован в /opt/icq/certs/nixg.ru.{crt,key} - Проверено снаружи: c2s 5222 и s2s 5269 отдают LE (issuer=Let's Encrypt, SAN nixg.ru+xmpp.nixg.ru), TLS 1.3 - Истекает 2026-11-26; certbot настроил автопродление — НО при dns-01 вручную автопродление НЕ сработает без повторного добавления TXT! Продление: sudo certbot renew --manual-auth-hook /bin/true --manual-cleanup-hook /bin/true (после добавления TXT). - ✅ Напоминание НАСТРОЕНО как ТИХИЙ watchdog (2026-08-29): Hermes cron-джоба ca2a23a34905, ежедневно 10:00 UTC, no_agent, доставка в Telegram (DM). Скрипт /opt/hermes/.hermes/scripts/check_icq_cert.sh (THRESHOLD=45 дн.): пока до истечения > 45 дней — молчит (пустой stdout, ничего не шлётся); при <= 45 дней шлёт в TG инструкцию продления (TXT в Jino → certbot renew ×2 → копия в certs/ → restart prosody). Первое ожидаемое срабатывание ≈ 12.10.2026 (истечение 26.11).
  • HTTP Upload (XEP-0363) — ВЫПОЛНЕНО ✅ (2026-08-28) - Модуль: mod_http_upload из Ubuntu-пакета prosody-modules (apt) → скопирован в ./modules/ - Prosody: Component "upload.nixg.ru" "http_upload", лимит 10MB, хранение 7 дней, require_authentication, http_external_url=https://upload.nixg.ru, https-порт 5281 (глобальный ssl с LE-сертом nixg.ru) - Caddy (vps02, /opt/caddy/Caddyfile): upload.nixg.ru { reverse_proxy 10.8.0.2:5281 { transport http { tls_insecure_skip_verify } } } — skip verify нужен т.к. backend-серт для nixg.ru (не upload.nixg.ru) - DNS: A upload.nixg.ru → 87.242.100.206 (Jino, добавлено пользователем 2026-08-28) - Проверено slixmpp: disco фичи urn:xmpp:http:upload:0, слот, PUT, GET→200 с содержимым (цикл через .venv: aiohttp+slixmpp 1.17; upload_file(filename,size,content_type,input_file=)) - НЕБОЛЬШАЯ ЗАСАДА: на bigbox старый DNS-кэш показывал 81.177.135.175 — лечится sudo systemctl restart systemd-resolved (flush-caches недостаточно) - Локальный кэш 1.1.1.1 ещё может держать старый IP до TTL — не ошибка
  • OMEMO (сквозное шифрование) — ВЫПОЛНЕНО ✅ (2026-08-28) - Подробности и путь достижения: WALKTHROUGH.md раздел 9; скрипт проверки: scripts/omemo_check.py (PASSWORD=... запуск). - Серверный модуль НЕ нужен: XEP-0384 работает на клиентах; Prosody хранит ключи через PEP (уже был включён). - Converse v14 имеет встроенный OMEMO (libomemo.esm.min.js в dist). Проверено реальной сессией: веб-чат сгенерировал device id=14035, опубликовал в PEP devicelist + bundles:14035 (identityKey, 100 preKeys, signedPreKey, signature — подтверждено на диске data/nixg%2eru/pep_*). - В index.html включено omemo_default: true — шифровать по умолчанию, когда контакт поддерживает. - Другие клиенты (Gajim/Conversations/Dino) подключатся: сервер хранит их OMEMO-бандлы так же. - Тест slixmpp: publish/retract в PEP-узел devicelist работает (проверено, тестовый device убран). - ⚠️ Если OMEMO не активируется в UI: очистить localStorage (старый JID admin@chat.nixg.ru) и войти заново.
  • Резервное копирование проекта на Яндекс.Диск — ВЫПОЛНЕНО ✅ (2026-08-29) - Скрипт: /opt/icq/backup.sh (по образцу /opt/netbox/backup.sh), права 755, в git. - Что бэкапит (tar czf): data/ (аккаунты, PEP/OMEMO, MUC, http_upload) + config/ + certs/ + modules/ + webchat/ + docker-compose.yml + все *.md. Проверено: архив 5.5MB, критданные внутри. - Куда: /opt/icq/backups/ (локально, 7 дней) → /mnt/yandex-disk/backup/icq-backups/ (30 дней), проверка mountpoint. - Cron (root): 45 2 * * * /opt/icq/backup.sh >> /var/log/icq-backup.log 2>&1 — после NetBox (2:00) и Gitea (2:30).
  • Бот-книгоискатель (slixmpp + OPDS) — Этап 3 PRD.
  • Проверить рестарт Prosody с новыми модулями (2026-08-29): скопированы в ./modules и прописаны в конфиге
  • Проверить рестарт Prosody с новыми модулями — ВЫПОЛНЕНО ✅ (2026-08-29) - docker compose restart prosody — старт без ошибок, все модули загрузились. - Активны: c2s 5222, s2s 5269, http 5280, https 5281; LE-серты nixg.ru/conference/upload загружены. - Подтверждено: mod_bosh (http-bind → 200), mod_http_upload (URL+storage в логе, https 5281 отвечает), mod_vcard_muc + mod_muc_moderation загрузились без error; admin@nixg.ru входит, s2s-федерация работает. - ⚠️ УТОЧНЕНИЕ: mod_admin_web.lua — НЕ веб-панель с HTTP-страницей (HTTP /admin → 404), а XMPP-модуль ad-hoc админ-команд (adminsub). Описание «панель /admin на :5280» в ранней заметке было неточным. Веб-админки в Prosody 0.11 нет в коробке — при желании ставить отдельный UI. Функционально не блокер. - Ошибки «http_upload MUST happen with TLS» в prosody.err — ИСТОРИЧЕСКИЕ (28 авг 20:01, до настройки LE-серта); за рестарт 29 авг ошибок нет.
  • Мост XMPP↔Telegram (Slidge/slidgram) — ПОДКЛЮЧЁН (2026-08-29) - Prosody: component_ports 5347 + Component "telegram.nixg.ru" с component_secret (ВНИМАНИЕ: в 0.11 секрет задаётся в секции Component через component_secret=, глобальная таблица component_secrets НЕ читается — была засада not-authorized, решено). - Образ: кастомный slidgram-proxy:latest = codeberg.org/slidge/slidgram:latest + патчи telegram.py/gateway.py (прокидывают SOCKS5 из env SLIDGRAM_PROXY в Pyrogram) + pysocks (уже есть в образе, модуль socks). - docker-compose: сервис slidgram (icq-slidgram), env SLIDGE_JID/SECRET/SERVER/PORT + SLIDGRAM_PROXY=socks5://172.27.0.1:1080 - Трафик Telegram → SOCKS5 172.27.0.1:1080 (SSH-туннель VPS01, TELEGRAM_PROXY) — проверено: SOCKS5→MTProto DC1 OK. - Статус: компонент аутентифицирован в Prosody, Slidge started, upload discovery OK. - ✅ mod_privilege (XEP-0356) добавлен (2026-08-29): community-модуль из hg.prosody.im → ./modules/mod_privilege.lua, включён в modules_enabled + privileged_entities в VirtualHost для telegram.nixg.ru (roster sync, legacy carbons). - ✅ Аудит XEP-функций (2026-08-29) → XEP-AUDIT.md: MUC/PubSub/HTTP Upload/MAM/Carbons/PEP ✅; OMEMO/WebRTC — клиент-сайд (норма для 0.11); Bookmarks — через PEP; mod_pubsub включён в modules_enabled. - ОЖИДАЕТ: регистрацию TG-аккаунта (admin@nixg.ru → команда register на telegram.nixg.ru) + api_id/api_hash.
  • Мосты mautrix (WhatsApp) — Этап 4; нужен external component (mod_component). [Telegram-мост уже на Slidge]
  • Push-уведомления (APNs/FCM) — ОТЛОЖЕН (нет особой потребности; см. WALKTHROUGH раздел 10.4 «Варианты»). Пробовал (2026-08-29): mod_unified_push из apt-prosody-modules НЕ подходит — требует util.jwt (API 0.12), а контейнер на 0.11.9. Для реализации нужно (любое из): (1) XEP-0357: mod_push + mod_push_offline (+ mod_push_muc) из официального hg prosody-modules (в Debian-пакете их НЕТ) — даёт нативный push для Conversations/Monal через публичные шлюзы; под 0.11. (2) Апгрейд Prosody до 0.12 → тогда заработает mod_unified_push (UnifiedPush, уже есть в apt). Сделать, когда появится реальная потребность или закончится список задач.

5. Полезные команды (кратко)

cd /opt/icq && docker compose ps
docker logs icq-prosody --tail 50
docker logs icq-webchat --since 5m
docker exec icq-prosody prosodyctl check config
docker exec icq-prosody prosodyctl register admin nixg.ru 'ПАРОЛЬ'
# проверка WS рукоятки (python, см. прошлые сессии /tmp/wstest)

Проверка входа по WebSocket (slixmpp, ssl не проверяется):

bot = slixmpp.ClientXMPP('admin@nixg.ru','ПАРОЛЬ')
import ssl; ctx = ssl.create_default_context(); ctx.check_hostname=False; ctx.verify_mode=ssl.CERT_NONE
bot.ssl_context = ctx
bot.connect(('wss://xmpp.nixg.ru/xmpp-websocket',))