# 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](WALKTHROUGH.md) (все этапы, команды, засады, TLS, HTTP Upload) · [PRD.md](PRD.md) (требования/архитектура) · [MIGRATION.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}`; - подключение через обычный ` # # 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: ```bash # до фикса давало: 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. ДАЛЬНЕЙШИЕ ЗАДАЧИ (после фикса страницы) - [x] Обновить SRV в панели Jino: _xmpp-client/_xmpp-server/_xmpp-client-websocket._tcp.nixg.ru → xmpp.nixg.ru. ✅ (2026-08-28, подтверждено dig @1.1.1.1) - [x] **Заменить самоподписанный 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). TODO: настроить напоминание/скрипт. - [x] **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 — не ошибка - [x] **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) и войти заново. - [ ] **Резервное копирование проекта на Яндекс.Диск** — по образцу /opt/netbox/backup.sh (готовый шаблон: локальный BACKUP_DIR + копия на /mnt/yandex-disk + ротация 7/30 дней + проверка mountpoint). - Что бэкапить (tar czf): `data/` (Prosody: аккаунты, PEP/OMEMO-бандлы, MUC, MAM-архив) — самое ценное; плюс конфиги (prosody.cfg.lua, docker-compose.yml, .env, webchat/), certs/, все *.md-документы. - Куда: /opt/icq/backups/ (локально, 7 дней) → /mnt/yandex-disk/backup/icq-backups/ (30 дней). - Бэкап живого `data/` через tar безопасен (данные Prosody — файлы, остановка контейнера не нужна). - Cron: ежедневно ~03:00 (рядом с бэкапом NetBox), скрипт /opt/icq/backup.sh по образцу /opt/netbox/backup.sh. - [ ] Бот-книгоискатель (slixmpp + OPDS) — Этап 3 PRD. - [ ] **Проверить рестарт Prosody с новыми модулями** (2026-08-29): скопированы в ./modules и прописаны в конфиге mod_vcard_muc + mod_muc_moderation (в MUC conference.nixg.ru), mod_admin_web (global, требует bosh — тоже включён), mod_http_upload_external (НЕ включён — альтернатива работающему http_upload). После `docker compose restart prosody` проверить logs: mod_admin_web 2010 года под 0.11 может не загрузиться → тогда закомментировать в конфиге. Панель /admin раздаётся на :5280 (внутри Docker; наружу не проброшен — при желании добавить admin.nixg.ru в Caddy). Подробности: WALKTHROUGH.md раздел 10. - [ ] Мосты mautrix (Telegram/WhatsApp) — Этап 4; нужен external component (mod_component). - [ ] Push-уведомления (APNs/FCM). ## 5. Полезные команды (кратко) ```bash 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 не проверяется): ```python 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',)) ```