docs+fix: no-auth-mech на Prosody 13.0 — consider_websocket_secure=true (WS insecure после миграции); опыт в STATUS/WALKTHROUGH

This commit is contained in:
2026-08-30 15:13:36 +00:00
parent 4655d82f6e
commit 6a4ccd3e6d
3 changed files with 126 additions and 20 deletions
+61
View File
@@ -120,6 +120,27 @@ iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE
- `location / { try_files $uri $uri/ /index.html; }`
- Docker-compose: сервис `webchat` (nginx:alpine), ports `8081:8081`, volume `./webchat:/usr/share/nginx/html:ro`.
**ЗАСАДА: DNS-кэш nginx → Connection refused на /xmpp-websocket (инцидент 2026-08-30)**.
Симптом: chat.nixg.ru открывается, форма логина мелькает, Converse висит на пульсирующем белом
кружке (спиннер connecting). В логах icq-webchat каждую минуту:
`connect() failed (111: Connection refused) ... upstream http://172.27.0.2:5280/xmpp-websocket`.
Причина: nginx резолвит имя `prosody` ОДИН раз при старте и держит IP вечно.
После пересоздания контейнеров (prosody, slidgram) docker присваивает адреса заново —
старый IP (172.27.0.2) переходит к ДРУГОМУ контейнеру (slidgram), prosody уезжает на .4.
nginx же продолжает слать на закешированный .2 → refused → 502 → спиннер.
Лечение: `docker compose restart webchat` (пере-резолв). Профилакт — динамический resolver:
```
nginx
resolver 127.0.11 valid=30s ipv6=off; # docker embedded DNS
location /xmpp-websocket {
set $prosody_upstream http://prosody:5280;
proxy_pass $prosody_upstream/xmpp-websocket;
...
}
```
Без переменной + resolver nginx не пере-резолвит на лету. Патч применён (2026-08-30),
в `webchat/nginx.conf`.
**Критическая засада веб-клиента**: в Converse.js v14 опция WebSocket называется **`websocket_url`**,
НЕ `bosh_service_url`! Если задать `bosh_service_url` с wss:// — Converse пытается подключиться по BOSH
(а у Prosody BOSH нет), падает, UI не рендерится (пустая страница!).
@@ -223,6 +244,13 @@ curl -sS https://xmpp.nixg.ru/.well-known/host-meta # 200 JSON XEP-0156
12. **dpkg прерван / apt exit 127** — сломан `chromium-browser` (snap-transitional); чинить `dpkg --configure -a` + переустановка.
13. **git: .venv попал в историю** — venv НЕ коммитить (в .gitignore), удалять из истории
filter-branch + force-push (репо похудел с 22MB до 216K).
14. **Prosody 13.0: WS-сессия «insecure» → «no-auth-mech» (2026-08-30)** — после миграции
на 13.0 веб-чат сломался: форма мелькает, белый кружок, `No stream features to offer
on insecure session` в логах, бесконечные переподключения. TLS терминируется на edge
(Caddy→nginx→Prosody plain 5280) → 13.0 не предлагает SASL на «insecure» WS.
ФИКС (глобальная секция prosody.cfg.lua): `consider_websocket_secure = true`.
НЕ ставить `c2s_require_encryption=false` (дыра в 5222: plaintext-пароли).
Проверка: `Authenticated as user@nixg.ru [prosody:operator]` в логах после входа по WS.
## 7. HTTP Upload (XEP-0363) — mod_http_upload
@@ -651,6 +679,39 @@ JSON содержит `"always_invite_when_adding_bookmarks": true` — слай
(после апгрейда 0.12). Пока слайдж-стаб не чинит bookmarks, приглашения — единственный
способ «увидеть» каналы, их можно игнорировать в Pidgin.
## 12.8. МИГРАЦИЯ ПРОДА НА PROSODY 13.0 (2026-08-30)
Прод nixg.ru переведён с 0.11.9 на 13.0 (образ `gitea.nixg.ru/hermes/icq-prosody:13.0`).
Стенд подтверждал совместимость заранее (references/prosody-13-parallel-stand.md).
**Шаги и изменения конфига (что отличается от 0.11.9):**
1. Бэкап перед миграцией: `tar czf backups/pre-migration-13-*.tar.gz config data certs modules webchat`.
2. docker-compose: `image: gitea.nixg.ru/hermes/icq-prosody:13.0` (вместо `prosody/prosody:latest`).
3. `component_ports = { 5347 }` — **УДАЛЁН** в 13.0 (listener жёстко на 5347). Убрать.
Listener поднимает module-less `Component "telegram.nixg.ru"`-блок (уже был).
4. `"pubsub"` из `modules_enabled` VirtualHost — **УБРАТЬ**: в 13.0 mod_pubsub только как Component.
Добавлен `Component "pubsub.nixg.ru" "pubsub"` (bookmarks/ленты).
Ошибка до фикса: `Pubsub should be loaded as a component`.
5. **РЕГРЕССИЯ http_upload**: slidge получал `No upload slot in this IQ: <iq ... id="0" />` —
в 13.0-версии mod_http_upload слот выдаётся только `origin.type=="c2s"` ИЛИ JID из
`http_upload_access`. Slidge просит слот от имени компонента → добавить:
`http_upload_access = { "telegram.nixg.ru" }` в блок `Component "upload.nixg.ru"`.
До фикса 180 ошибок/10 мин; после — 0.
6. `cross_domain_websocket` — deprecated (варнинг), но всё ещё читается mod_websocket → работает.
Можно оставить; новый механизм — `http_cors_override`.
7. Лог: один блок `log` в глобальной секции (в 13.0 строго один).
**Проверка после миграции:**
- `prosodyctl check config` → All checks passed.
- `External component successfully authenticated` для telegram.nixg.ru в prosody.log.
- mod_privilege: в логе `nixg.ru:privilege ... Archiving stanza` (slidge-carbon-*) — работает.
- WebSocket: рукопожатие → `101 Switching Protocols` через nginx (Chat работает).
- HTTP Upload: 0 ошибок `No upload slot` после рестарта.
- Авторизация: SASL отвечает на неверный пароль AUTH FAILED (логика работает).
**Тестовый стенд** /opt/icq/test (icq-prosody-test) ОСТАНОВЛЕН: `docker stop` + `docker update --restart=no`.
Поднять при следующем обновлении: `cd /opt/icq/test && docker compose up -d`.
## 13. TODO (следующие шаги)
- [x] ~~OMEMO (XEP-0384)~~ — ВЫПОЛНЕНО: раздел 9; скрипт scripts/omemo_check.py.
- [ ] Бот-книгоискатель (slixmpp + OPDS) — Этап 3 PRD. venv уже создан (/opt/icq/.venv: aiohttp, slixmpp).