mirror of
https://gitverse.ru/kpa39l/icq.git
synced 2026-09-29 18:05:10 +00:00
first_commit
This commit is contained in:
@@ -0,0 +1,133 @@
|
||||
# ICQ XMPP — ТЕКУЩИЙ СТАТУС И ПЛАН (точка входа для новой сессии)
|
||||
|
||||
> Обновлено: 2026-08-28 ≈ 19:00 UTC · Сессия: bigbox (/opt/icq)
|
||||
> ⚠️ МИГРАЦИЯ НА nixg.ru (2026-08-28): JID юзеров теперь `user@nixg.ru`, веб-клиент остаётся на chat.nixg.ru, WS → wss://xmpp.nixg.ru. См. MIGRATION.md.
|
||||
> Читать вместе с: [PRD.md](PRD.md) (требования/архитектура), [WALKTHROUGH.md](WALKTHROUGH.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: настроить напоминание/скрипт.
|
||||
- [ ] HTTP Upload (XEP-0363): установить mod_http_upload из prosody-modules
|
||||
(в docker Prosody 0.11.9 модуля НЕТ). Путь модулей: ./modules в compose.
|
||||
Подробности в WALKTHROUGH.md раздел 7.
|
||||
- [ ] OMEMO (сквозное шифрование) — Проверить включение модуля, клиенты.
|
||||
- [ ] Бот-книгоискатель (slixmpp + OPDS) — Этап 3 PRD.
|
||||
- [ ] Мосты 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',))
|
||||
```
|
||||
Reference in New Issue
Block a user