refactor: сегментировать STATUS.md (4.4k токенов -> 0.7k) — детали в INFRA.md/BRIDGE-TELEGRAM.md/CHEATSHEET.md, backup.sh + новые .md

This commit is contained in:
2026-08-29 14:57:01 +00:00
parent 2763ffb012
commit 19589c853d
5 changed files with 157 additions and 197 deletions
+46
View File
@@ -0,0 +1,46 @@
# Мост XMPP↔Telegram (Slidge/slidgram) — детали и задачи
> Вспомогательный файл для STATUS.md; обновлено: 2026-08-29
> Офлайн-доки: docs/slidgram/ (копия slidge.im)
## Статус: ПОДКЛЮЧЁН (2026-08-29)
- Prosody: `component_ports 5347` + `Component "telegram.nixg.ru"` с `component_secret`
(⚠️ В Prosody 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.
- docker-compose: сервис `slidgram` (icq-slidgram), env `SLIDGE_JID/SECRET/SERVER/PORT`,
`SLIDGRAM_PROXY=socks5://172.27.0.1:1080`, том ./slidgram/data (uid 10000, иначе SQLite
«unable to open database file»).
- Трафик Telegram → SOCKS5 172.27.0.1:1080 (SSH-туннель VPS01) — проверено: SOCKS5→MTProto DC1 OK.
- ✅ **mod_privilege (XEP-0356)**: community-модуль → ./modules/mod_privilege.lua, включён в
modules_enabled + privileged_entities в VirtualHost для telegram.nixg.ru (roster sync, legacy carbons).
## Регистрация TG-аккаунта (ОЖИДАЕТ действий)
Осталось: admin@nixg.ru → команда `register` на telegram.nixg.ru + api_id/api_hash.
**Пошаговая инструкция: WALKTHROUGH.md → раздел 12** (оба способа: ad-hoc Register / сообщение
«register»; api_id/api_hash с https://my.telegram.org/apps — HTTP открывается из РФ напрямую;
код/2FA — через MTProto по SOCKS5-туннелю, работает из РФ).
## ЗАДАЧА: аватары telegram-пользователей — загрузка таймаутит
- **Симптом**: аватары контактов/компонента не подтягиваются («загрузка аватаров/логотипа с
web.telegram.org таймаутит»).
- **Корень** (по коду в контейнере icq-slidgram): HTTP-часть slidge НЕ ходит через SOCKS5 —
`slidge/core/gateway.py:399` создаёт `aiohttp.ClientSession()` без `proxy=`, и
`slidge/db/avatar.py` (`self.http.get(url)`) качает URL-аватары напрямую; из РФ прямой доступ
к web.telegram.org/photo-URL'ам заблокирован → таймаут. MTProto-часть (`slidgram/telegram.py` →
`Client(proxy=_proxy)`) уже ходит через прокси и работает.
- **Варианты решения** (выбрать при реализации):
1. Прокси в aiohttp-сессию: в `gateway.py:399` `aiohttp.ClientSession(proxy=...)`
(aiohttp — один прокси на сессию), либо `ClientSession(trust_env=True)` + env
`HTTP_PROXY/HTTPS_PROXY/ALL_PROXY`. Для SOCKS5 в docker-сети — `ALL_PROXY=socks5://172.27.0.1:1080`
+ `trust_env=True`, но aiohttp SOCKS5 работает только через aiohttp-socks (доп. зависимость).
2. Прогонять URL-аватары через nginx-прокси на bigbox (rewrite → туннель) — без правок кода.
3. Аватары личных фото уже качаются через Pyrogram `download_media()` (MTProto, через SOCKS5) —
убедиться, что эта ветка используется; прямая HTTP-загрузка нужна для URL-аватаров
(web.telegram.org и т.п.).
- ⚠️ Обмен сообщениями, файлы и стикеры НЕ затрагиваются — это косметика (аватарки в ростере).
## Известные мелочи
- Залипший localStorage браузера со старым JID admin@chat.nixg.ru → Converse шлёт host-unknown.
Лечится: localStorage.removeItem("conversejs-session-jid") или инкогнито.
+24
View File
@@ -0,0 +1,24 @@
# ICQ XMPP — Полезные команды (шпаргалка)
```bash
cd /opt/icq && docker compose ps
docker logs icq-prosody --tail 50
docker logs icq-slidgram --since 10m | grep -iE 'register|login|session|avatar|error'
docker exec icq-prosody prosodyctl check config
docker exec icq-prosody prosodyctl register admin nixg.ru 'ПАРОЛЬ'
# внешняя проверка
curl -sS https://upload.nixg.ru/upload
```
Проверка входа по 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',))
```
Проверка веб-чата headless (UI отрендерен):
```bash
chromium --headless --no-sandbox --disable-gpu --virtual-time-budget=15000 --dump-dom https://chat.nixg.ru/ | grep converse-login-form
```
+58
View File
@@ -0,0 +1,58 @@
# ICQ XMPP — Инфраструктура, учётные данные, бэкапы (детали)
> Вспомогательный файл для STATUS.md; обновлено: 2026-08-29
## Учётные данные
- **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), **icq-slidgram** (мост Telegram)
- 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 (визитка, НЕ трогаем)
- A `upload.nixg.ru` → 87.242.100.206 (HTTP Upload)
- SRV `_xmpp-client._tcp.nixg.ru` → 0 5 5222 **xmpp.nixg.ru.**
- SRV `_xmpp-server._tcp.nixg.ru` → 0 5 5269 **xmpp.nixg.ru.**
- SRV `_xmpp-client-websocket._tcp.nixg.ru` → 0 5 443 **xmpp.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-сертификат)
- Компоненты: `conference.nixg.ru` (MUC), `upload.nixg.ru` (HTTP Upload), `telegram.nixg.ru` (Slidge, component_ports 5347)
## TLS / Let's Encrypt (детали)
- Выпуск: `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 в Jino вручную)
- Сертификат: /etc/letsencrypt/live/nixg.ru/ → копия в /opt/icq/certs/nixg.ru.{crt,key} (cp -L!)
- Истекает **2026-11-26**; продление вручную: TXT в Jino → `sudo certbot renew --manual-auth-hook /bin/true --manual-cleanup-hook /bin/true` → копия в certs/ → restart prosody
- **Watchdog-напоминание**: Hermes cron ca2a23a34905, ежедневно 10:00 UTC, no_agent, доставка в Telegram DM.
Скрипт /opt/hermes/.hermes/scripts/check_icq_cert.sh (THRESHOLD=45 дн.): молчит, пока до истечения >45 дней;
при <=45 дней шлёт в TG инструкцию продления. Первое срабатывание ≈ 12.10.2026.
## Резервное копирование
- Скрипт: **/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 (включая новые INFRA/BRIDGE/CHEATSHEET).
- Куда: /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).
## Проверено (подтверждено)
- ✅ XMPP-сервер на nixg.ru, федерация (SRV), порты 5222/5269 открыты извне
- ✅ TLS на 443 (Caddy/Let's Encrypt): xmpp.nixg.ru (LE, 2026-08-28) и chat.nixg.ru (страница)
- ✅ WebSocket-путь целиком: Caddy → nginx:8081 → Prosody:5280 → 101 Switching Protocols
- ✅ Аутентификация по WebSocket: admin@nixg.ru (slixmpp, 2026-08-28)
- ✅ Веб-чат https://chat.nixg.ru/ (Converse v14.0.0, вход подтверждён headless-браузером)
- ✅ Рестарт Prosody с модулями (2026-08-29): c2s/s2s/http/https, LE-серты, mod_bosh, mod_http_upload,
mod_vcard_muc, mod_muc_moderation — без ошибок (исторические ошибки «http_upload MUST happen with TLS» — от 28 авг, до настройки LE)
- ✅ HTTP Upload: disco urn:xmpp:http:upload:0, слот, PUT, GET→200 (slixmpp)
- ✅ OMEMO: устройство Converse 14035 опубликовало devicelist + bundles в PEP (подробности: WALKTHROUGH §9)
- ✅ Мост Telegram: компонент telegram.nixg.ru аутентифицирован, Slidge started, upload discovery OK
+28 -196
View File
@@ -1,209 +1,41 @@
# 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. КРИТИЧНЫЕ ДАННЫЕ (для продолжения работы)
## Проект
Self-hosted XMPP-мессенджер на **nixg.ru** (Prosody 0.11.9 + веб-клиент Converse v14 + мост Telegram).
Миграция на nixg.ru (2026-08-28): JID юзеров `user@nixg.ru`, веб-клиент chat.nixg.ru, WS wss://xmpp.nixg.ru.
### Учётные данные
- **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).
**Документация:**
- [INFRA.md](INFRA.md) — инфраструктура, DNS, учётные данные, TLS/LE, бэкапы
- [BRIDGE-TELEGRAM.md](BRIDGE-TELEGRAM.md) — мост Telegram (Slidge): статус, регистрация, задача по аватарам
- [WALKTHROUGH.md](WALKTHROUGH.md) — полный разбор всех этапов, команд, засад (ESM-фикс, TLS, HTTP Upload, OMEMO, регистрация slidgram §12, push §10.4)
- [CHEATSHEET.md](CHEATSHEET.md) — полезные команды
- [PRD.md](PRD.md) · [MIGRATION.md](MIGRATION.md) · [XEP-AUDIT.md](XEP-AUDIT.md)
### Инфраструктура (после миграции)
- 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: c2s 5222 / s2s 5269 / http 5280 / https 5281, федерация через SRV
- ✅ TLS: LE-серты (Caddy 443 для WS/веб; Prosody c2s/s2s — dns-01, истекает 2026-11-26, продление вручную)
- ✅ Веб-чат https://chat.nixg.ru/ (Converse v14, вход admin@nixg.ru, wss://xmpp.nixg.ru)
- ✅ HTTP Upload (upload.nixg.ru, XEP-0363), OMEMO (XEP-0384, через PEP), MAM, Carbons, MUC, PubSub, Bookmarks
- ✅ Бэкапы → Яндекс.Диск (cron 2:45), watchdog продления LE-серта (тихий, cron ca2a23a34905)
- ✅ Мост Telegram (Slidge/slidgram): telegram.nixg.ru аутентифицирован, MTProto через SOCKS5-туннель VPS01
### Что уже РАБОТАЕТ (подтверждено)
- ✅ 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-браузером)
## Задачи (будущее)
- [ ] **Регистрация TG-аккаунта в мосте** — admin@nixg.ru → команда `register` на telegram.nixg.ru
+ api_id/api_hash (my.telegram.org/apps). Инструкция: WALKTHROUGH.md §12. Детали: BRIDGE-TELEGRAM.md.
- [ ] **Аватары TG в мосте таймаутят** — HTTP-часть slidge не ходит через SOCKS5 (URL web.telegram.org
недоступны из РФ). Косметика, на переписку не влияет. Разбор и варианты: BRIDGE-TELEGRAM.md.
- [ ] Бот-книгоискатель (slixmpp + OPDS) — Этап 3 PRD. (venv готов: /opt/icq/.venv)
- [ ] Мост mautrix (WhatsApp) — Этап 4; нужен external component. [Telegram уже на Slidge]
- [ ] Push-уведомления — ОТЛОЖЕН: Prosody 0.11 не тянет mod_unified_push (нужен util.jwt из 0.12);
варианты (XEP-0357 mod_push / апгрейд до 0.12) — WALKTHROUGH §10.4
- [ ] MAM: ошибка при логине «max_items: not a number» — проверить настройку mod_mam (не мешает чату)
## 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).
- ✅ Напоминание НАСТРОЕНО как ТИХИЙ 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).
- [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 авг ошибок нет.
- [x] **Мост 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.
- 📖 **Регистрация в slidgram — ПОШАГОВАЯ ИНСТРУКЦИЯ:** см. **WALKTHROUGH.md → раздел «Slidgram: регистрация telegram-аккаунта»** (нужен api_id/api_hash с my.telegram.org/apps; команда `register` с telegram.nixg.ru; код → на ваш TG; 2FA → пароль). Процесс общается с Telegram ТОЛЬКО через MTProto (SOCKS5-туннель) — HTTP my.telegram.org для получения api_id/hash придётся открыть в обычном браузере на вашей машине.
- [ ] **Аватары telegram-пользователей в мосте: загрузка таймаутит (2026-08-29)** — слабое место, требует починки после регистрации:
- Симптом: аватары контактов/компонента не подтягиваются; в прошлой сессии зафиксировано
«загрузка аватаров/логотипа с web.telegram.org таймаутит».
- Корень (найдено по коду в контейнере icq-slidgram): HTTP-часть slidge НЕ ходит через SOCKS5:
`slidge/core/gateway.py:399` создаёт `aiohttp.ClientSession()` без `proxy=`, и
`slidge/db/avatar.py:112` (`self.http.get(url)`) качает аватары напрямую — из РФ прямой
доступ к web.telegram.org/photo-URL'ам заблокирован → таймаут. MTProto-часть
(`slidgram/telegram.py` → `Client(proxy=_proxy)`) уже ходит через прокси и работает.
- Варианты решения (выбрать при реализации):
(1) Задать прокси в aiohttp-сессию: в `gateway.py:399` `aiohttp.ClientSession(proxy=...)` — но aiohttp умеет
только один прокси на сессию; либо патчить `ClientSession(trust_env=True)` + env
`HTTP_PROXY/HTTPS_PROXY/ALL_PROXY` (aiohttp читает их при trust_env). Если в docker-сети
нужен хостовый SOCKS5 — задать `ALL_PROXY=socks5://172.27.0.1:1080` и `trust_env=True`;
но aiohttp SOCKS5 поддерживается только через aiohttp-socks (доп. зависимость).
(2) Пройти все URL-аватары через nginx-прокси на bigbox (rewrite → туннель) — без правок кода;
(3) в slidgram/telegram.py аватары уже качаются через Pyrogram `download_media()` (MTProto,
через наш SOCKS5). Убедиться, что часть аватаров (личные фото юзеров этой веткой) идёт
именно так; прямая HTTP-загрузка нужна для URL-аватаров (web.telegram.org и т.п.).
- ⚠️ Обмен сообщениями, файлы и стикеры НЕ затрагиваются — это косметика (аватарки в ростере).
- [ ] Мосты 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. Полезные команды (кратко)
## Быстрые команды
```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',))
# полный список: CHEATSHEET.md
```
+1 -1
View File
@@ -9,7 +9,7 @@ YADISK_TARGET="${YADISK_MOUNT}/backup/icq-backups"
DATE=$(date +%Y%m%d_%H%M%S)
# Папки/файлы проекта, которые бэкапим (из /opt/icq)
INCLUDE="data config certs modules webchat docker-compose.yml .env README.md STATUS.md PRD.md MIGRATION.md WALKTHROUGH.md"
INCLUDE="data config certs modules webchat docker-compose.yml .env README.md STATUS.md PRD.md MIGRATION.md WALKTHROUGH.md INFRA.md BRIDGE-TELEGRAM.md CHEATSHEET.md XEP-AUDIT.md"
mkdir -p ${BACKUP_DIR}