# Spec Delta — icq-services ## ADDED Requirements ### Requirement: Жизненный цикл сервисов — только docker compose Все сервисы проекта /opt/icq (prosody, webchat, slidgram) управляются исключительно через `docker compose up -d --force-recreate `, а не ручными `docker start` или `docker create`. Каждый сервис подключён к сети `icq_default` и резолвится по имени сервиса (DNS-алиас из compose) внутри этой сети. #### Scenario: prosody запущен штатно через compose - **GIVEN** сервис prosody пересоздан командой `docker compose up -d --force-recreate prosody` - **WHEN** выполняется `docker ps --format '{{.Names}} {{.Networks}}'` - **THEN** у `icq-prosody` непустая колонка Networks, содержащая `icq_default` #### Scenario: prosody подключён к сети icq_default - **GIVEN** контейнер prosody в сети icq_default - **WHEN** выполняется `docker network inspect icq_default` - **THEN** в списке контейнеров есть `icq-prosody` с IPv4-адресом из 172.27.0.0/16 #### Scenario: резолвинг имени из веб-чата - **GIVEN** контейнер веб-чата в той же сети - **WHEN** выполняется `docker exec icq-webchat getent hosts icq-prosody` - **THEN** возвращается IP 172.27.0.x (просоди виден из веб-чата) ## MODIFIED Requirements ### Requirement: Доступность веб-чата chat.nixg.ru Контейнер `icq-prosody` имеет IP-адрес в сети `icq_default` и доступен из `icq-webchat` по имени `icq-prosody`; веб-клиент Converse.js подключается к wss://xmpp.nixg.ru без бесконечной загрузки. #### Scenario: веб-клиент открывается - **GIVEN** prosody в сети icq_default и доступен из webchat - **WHEN** браузер открывает https://chat.nixg.ru - **THEN** страница Converse.js загружается и показывает форму входа (не бесконечная загрузка) #### Scenario: WebSocket-сессия устанавливается - **GIVEN** веб-клиент открыт - **WHEN** Converse.js соединяется с wss://xmpp.nixg.ru - **THEN** handshake завершается HTTP 101 и появляется форма входа ### Requirement: Мост Telegram (Slidge) Компонент `telegram.nixg.ru` продолжает аутентифицироваться с prosody (external component XEP-0114, порт 5347) после пересоздания prosody; данные моста (./slidgram/data) не затрагиваются. #### Scenario: компонент аутентифицирован после пересоздания - **GIVEN** prosody пересоздан через compose - **WHEN** выполняется `docker logs icq-prosody --tail 100` - **THEN** в логах нет ошибок аутентификации, компонент telegram.nixg.ru в списке активных (или нет критических ошибок) #### Scenario: мост жив после пересоздания - **GIVEN** prosody пересоздан через compose - **WHEN** выполняется `docker logs icq-slidgram --tail 50` - **THEN** нет ошибок подключения/аутентификации; мост в статусе Up