change email-storage-analysis: ФС vs Maildir анализ (задача 4)

- STORAGE_ANALYSIS.md: сравнение email.md/Maildir/MBOX/notmuch, рекомендация
  остаться на email.md + tags в frontmatter + опц. экспорт Maildir
- 3 REQUIREMENTS в spec email-storage-format, change архивирован
- Задача 4 из портфеля веб-UI закрыта
This commit is contained in:
estorozhenko
2026-09-11 13:14:56 +00:00
parent bc206a1159
commit b047e3a21d
11 changed files with 492 additions and 0 deletions
@@ -0,0 +1,68 @@
# Spec Delta — icq-services
## ADDED Requirements
### Requirement: Жизненный цикл сервисов — только docker compose
Все сервисы проекта /opt/icq (prosody, webchat, slidgram) управляются исключительно
через `docker compose up -d --force-recreate <service>`, а не ручными `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