Files
icq/STATUS.md
T
estorozhenko 49df2ad681 docs: push-уведомления — отложено, варианты в WALKTHROUGH 10.4
- Попытка включить mod_unified_push (apt prosody-modules) → НЕ грузится: требует util.jwt (API 0.12), контейнер 0.11.9. Откатил, error из логов ушёл.
- Зафиксированы 2 варианта для будущей реализации: (1) XEP-0357 mod_push/mod_push_offline/mod_push_muc из hg (нативный push для Conversations/Monal, под 0.11); (2) UnifiedPush после апгрейда до 0.12.
- Уточнён комментарий mod_admin_web в конфиге (XMPP ad-hoc, НЕ веб-панель).
2026-08-29 08:45:23 +00:00

174 lines
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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}`;
- подключение через обычный `<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. КАК ЭТО БЫЛО ИСПРАВЛЕНО (команды, реально сработавшие)
```bash
# 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:
```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) и войти заново.
- [x] **Резервное копирование проекта на Яндекс.Диск — ВЫПОЛНЕНО ✅ (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 и прописаны в конфиге
- [x] **Проверить рестарт 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 авг ошибок нет.
- [ ] Мосты mautrix (Telegram/WhatsApp) — Этап 4; нужен external component (mod_component).
- [ ] 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. Полезные команды (кратко)
```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',))
```