is-coursework/report/srs/main.typ
ulitsaRaskolnikova a95e426133 feat(doc): add srs
2025-10-10 22:49:49 +03:00

663 lines
35 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#set heading(numbering: "1.")
#set align(center)
#set text(size: 18pt)
*Software Requirements Specification\
(Спецификация требований к продукту)*
#set align(left)
#set text(size: 11pt)
= Introduction (Введение)
== Purpose
Документ описывает требования к информационной системе, позволяющей покупать домены третьего уровня и управлять ими.
== Scope (Область применения)
Итоговым продуктом является веб-приложение, которое позволяет приобретать доменные имена третьего уровня и управлять их DNS записями. Продукт предназначен для рынка РФ, для людей, которым требуется дешёвое доменное имя. Ожидаемая целевая аудитория: веб-мастера.
Основная функциональность:
- Покупка свободных доменных имён в предлагаемых зонах третьего уровня;
- Продление приобретённых доменов;
- Редактирование DNS записей для приобретённых доменов;
- Делегирование домена на сервера клиента, по запросу.
Система не предоставляет возможность управлять доменами второго или первого уровней.
== Definitions, Acronyms and Abbreviations (Определения и аббревиатуры)
- *Делегирование домена* -- процесс передачи управления DNS-зоной домена другому набору DNS-серверов.
- *DNS (Domain Name System)* -- система, преобразующая доменные имена в IP-адреса.
- *DNS-запись* - элемент в зоне домена, определяющий соответствие имени к данным, например IP-адресу (A/AAAA), другому имени (CNAME), почтовому серверу (MX) и т. д.
- *DNS-пропагация* -- процесс распространения изменений DNS-записей по сети резолверов по всему миру; занимает время, зависящее от TTL и кэшей.
- *Домен* -- уникальное имя в DNS-иерархии (например, example.com), состоящее из уровней (TLD, 2-й уровень, 3-й уровень и т. д.).
- *Приобретение домена* -- процесс покупки права использовать доменное имя в определённой зоне на фиксированный срок.
- *Зона второго уровня* -- управляемая Сервисом зона (например, example.ru).
- *Домен 3-го уровня / субдомен* -- имя вида `<name>.<zone2>`, где `<zone2>` принадлежит Сервису.
- *NS-делегирование* -- указание NS-серверов пользователя для конкретного домена 3-го уровня.
- *TTL* -- время жизни DNS-записи.
- *Эквайер/Биллинг* -- финансовая инфраструктура и процессы приёма платежей (банки-эквайеры, платёжные API, биллинговые системы), обеспечивающие оплату и продление доменов.
== References (Ссылки)
- RFC 1034/1035 -- базовые спецификации DNS.
== Overview (Обзор документа)
#outline(title: none)
= Overall Description (Общее описание)
== Product functions (Функциональность продукта)
Основная функциональность:
- Проверка доступности имени 3-го уровня, корзина/покупка, продления.
- Управление доменом: либо панель DNS-записей, либо NS-делегирование.
- Биллинг: оплата домена, статусы оплат.
- Уведомления о сроках истечения, статусах платежей.
Функции реализуются для двух ролей: пользователь и администратор.
== User characteristics (Описание пользователей)
Пользователь -- человек, которому нужно приобрести домен. После приобретения у него появляется возможность управлять DNS записями домена.
Администратор -- человек управляющий информационной системой. Имеет инструменты управления пользователями, доменами и зонами. Он нужен для помощи, которая может потребоваться пользователю, например, с настройкой DNS записи.
== Assumptions and dependencies (Влияющие факторы и зависимости)
Законодательство РФ в сфере интернета, в частности законы:
- 152-ФЗ -- О персональных данных;
- 149-ФЗ -- Об информации, информационных технологиях и о защите информации;
- 63-ФЗ -- Об электронной подписи.
- Законодательство РФ в сфере гражданского права, в частности гражданский кодекс.
Иные факторы:
- Доступность API управления DNS серверами.
- Доступность и спецификации API Эквайера.
- Почтовая инфраструктура для уведомлений.
- Корректное кэширование TTL резолверами, распространение изменений по DNS.
- Политики именования: резервирование/запрет определённых подстрок, предотвращение коллизий.
== Constraints (Ограничения)
- DNS-пропагация зависит от TTL и кэширования сторонних резолверов.
- Юридические ограничения (торговые марки, контент, персональные данные).
- Технические лимиты платежного провайдера и SLA внешних сервисов.
- Имя 3-го уровня уникально в пределах выбранной зоны 2-го уровня; возможны правила модерации.
= Specific Requirements (Спецификация требований)
== Functionality (Функциональные требования)
=== Регистрация и аутентификация <registration>
Система должна:
- предоставлять возможность регистрации пользователя по email и паролю;
- обеспечивать подтверждение email-адреса;
- предоставлять возможность восстановления доступа к учётной записи (сброс пароля);
- поддерживать двухфакторную аутентификацию (TOTP и WebAuthn);
- предоставлять управление параметрами 2FA в профиле пользователя;
- блокировать или запрашивать капчу после 10 неуспешных попыток входа.
=== Каталог зон и проверка имени <catalog>
Система должна:
- выполнять проверку доступности имени в формате `<name>.<zone2>.` .
=== Корзина, заказ и покупка <cart>
Система должна:
- позволять добавлять выбранные имена доменов в корзину;
- рассчитывать стоимость домена за месяц или год;
- предоставлять возможность оформления заказа.
=== Интеграция с API эквайринга <billing>
Система должна:
- формировать счёт и платёжную ссылку через API эквайринга;
- получать и обрабатывать статусы платежей;
- учитывать проведённые платежи;
- выполнять возвраты и отмену платежей.
=== Активация домена после оплаты <domain_activation>
Система должна автоматически создавать ресурс домена 3-го уровня после успешной оплаты.
=== Управление DNS через панель <dns_control>
Система должна:
- предоставлять пользователю возможность создавать, редактировать и удалять записи типов A, AAAA, CNAME, TXT, MX, SRV, CAA;
- обеспечивать настройку параметра TTL.
=== NS-делегирование <ns_delegate>
Система должна предоставлять возможность установки собственных NS-серверов для домена 3-го уровня.
=== Продление и напоминание <notification_prolongation>
Система должна:
- обеспечивать ручное продление доменов;
- уведомлять пользователя о скором истечении срока регистрации домена за 30, 14, 7, 3 и 1 день через электронную почту.
=== Личный кабинет пользователя <lk_user>
Система должна:
- предоставлять доступ к списку доменов пользователя;
- обеспечивать просмотр и редактирование профиля;
- предоставлять доступ к истории счетов и платежей.
=== Админ-панель <lk_admin>
Система должна:
- предоставлять администраторам доступ к просмотру пользователей и их доменных зон;
- обеспечивать управление пользователями и их доменами.
=== Политики имён <name_checker>
Система должна:
- хранить список запрещённых и зарезервированных имён;
- проверять доменные имена на соответствие данным политикам при регистрации.
=== Уведомления <notifications>
Система должна отправлять пользователю email-уведомления о:
- создании заказа;
- оплате;
- активации домена;
- истечении регистрации.
=== Аудит и логи <logs>
Система должна:
- фиксировать все значимые действия (кто, что, когда, откуда);
- обеспечивать хранение логов.
=== Экспорт отчёта по использованию сервиса <report_export>
Система должна предоставлять администратору отчёт, содержащий:
- количество зарегистрированных пользователей;
- количество активных пользователей (имеющих более одного домена);
- количество зарегистрированных доменов.
#table(
columns: (1fr, auto, auto, auto, auto),
table.cell(rowspan: 2)[№ Требования],
table.cell(rowspan: 2)[Приоритетность],
table.cell(colspan: 2)[Трудоёмкость в часах],
table.cell(rowspan: 2)[Стабильность],
[Минимум], [Максимум],
[@registration[Аутентификация]], [Высокая], [40], [80], [Высокая],
[@catalog[Каталог]], [Высокая], [16], [32], [Средняя],
[@cart[Корзина]], [Высокая], [32], [64], [Средняя],
[@billing[Биллинг]], [Высокая], [60], [120], [Средняя],
[@domain_activation[Активация домена]], [Высокая], [20], [40], [Высокая],
[@dns_control[Управление DNS]], [Высокая], [80], [160], [Средняя],
[@ns_delegate[Делегирование NS]], [Средняя], [24], [48], [Высокая],
[@notification_prolongation[Уведомления и продление]], [Средняя], [24], [48], [Средняя],
[@lk_user[ЛК Пользователя]], [Высокая], [40], [80], [Средняя],
[@lk_admin[ЛК Администратора]], [Средняя], [40], [80], [Средняя],
[@name_checker[Проверка доступности имён]], [Высокая], [24], [48], [Высокая],
[@notifications[Уведомления]], [Средняя], [16], [32], [Высокая],
[@logs[Аудит и логирование]], [Высокая], [32], [64], [Средняя],
[@report_export[Экспорт отчётов]], [Средняя], [20], [40], [Высокая],
)
#pagebreak()
=== Прецеденты
#image("images/bpe_lw1_use_case.drawio.png")
#pagebreak()
#table(
columns: (1fr),
align: left,
[Прецедент: Регистрация пользователя],
[ID: R1],
[Краткое описание: Пользователь регистрируется в системе, указывая email и пароль],
[Главный актёр: Пользователь],
[Предусловия: Пользователь находится на странице регистрации],
[Основной поток:
+ Пользователь вводит email и пароль
+ Система проверяет корректность данных
+ Система отправляет письмо для подтверждения email
+ Пользователь подтверждает email по ссылке
],
[Постусловия: Учетная запись создана и активирована],
)
#table(
columns: (1fr),
align: left,
[Прецедент: Аутентификация пользователя],
[ID: R2],
[Краткое описание: Пользователь выполняет вход в систему],
[Главный актёр: Пользователь],
[Предусловия: Пользователь имеет учетную запись],
[Основной поток:
+ Пользователь вводит email и пароль
+ Система проверяет учетные данные
+ Если включена 2FA — запрашивает подтверждение (TOTP или WebAuthn)
+ Пользователь вводит код подтверждения или подтверждает через устройство
+ Система авторизует пользователя
],
[Постусловия: Пользователь получает доступ к системе],
)
#table(
columns: (1fr),
align: left,
[Прецедент: Восстановление доступа],
[ID: R3],
[Краткое описание: Пользователь восстанавливает пароль через email],
[Главный актёр: Пользователь],
[Предусловия: Пользователь имеет активную учетную запись],
[Основной поток:
+ Пользователь указывает email на форме восстановления
+ Система отправляет письмо со ссылкой для сброса пароля
+ Пользователь переходит по ссылке и задаёт новый пароль
],
[Постусловия: Пароль обновлён, пользователь может войти],
)
#table(
columns: (1fr),
align: left,
[Прецедент: Проверка имени],
[ID: C1],
[Краткое описание: Пользователь проверяет доступность доменного имени],
[Главный актёр: Пользователь],
[Предусловия: Пользователь находится в каталоге зон],
[Основной поток:
+ Пользователь вводит имя в формате `<name>.<zone2>.`
+ Система проверяет доступность и соответствие политикам],
[Постусловия: Пользователь получает информацию о доступности имени],
)
#table(
columns: (1fr),
align: left,
[Прецедент: Добавление имени в корзину],
[ID: CA1],
[Краткое описание: Пользователь добавляет выбранное доменное имя в корзину],
[Главный актёр: Пользователь],
[Предусловия: Имя доступно для регистрации],
[Основной поток:
+ Пользователь выбирает имя
+ Система добавляет его в корзину
+ Система рассчитывает стоимость за выбранный период (месяц/год)],
[Постусловия: Имя находится в корзине пользователя],
)
#table(
columns: (1fr),
align: left,
[Прецедент: Оформление заказа],
[ID: CA2],
[Краткое описание: Пользователь оформляет заказ на выбранные имена],
[Главный актёр: Пользователь],
[Предусловия: В корзине есть имена],
[Основной поток:
+ Пользователь открывает корзину
+ Система показывает итоговую стоимость
+ Пользователь подтверждает заказ
+ Система формирует заказ],
[Постусловия: Заказ создан и ожидает оплаты],
)
#table(
columns: (1fr),
align: left,
[Прецедент: Оплата заказа],
[ID: B1],
[Краткое описание: Пользователь оплачивает заказ через API эквайринга],
[Главный актёр: Пользователь],
[Предусловия: Создан заказ],
[Основной поток:
+ Система формирует счет и ссылку на оплату
+ Пользователь переходит по ссылке и производит оплату
+ Система получает статус платежа от API
+ В случае успеха платеж учитывается],
[Постусловия: Заказ оплачен],
)
#table(
columns: (1fr),
align: left,
[Прецедент: Активация домена],
[ID: D1],
[Краткое описание: Система автоматически активирует домен после оплаты],
[Главный актёр: Система],
[Предусловия: Оплачен заказ на домен],
[Основной поток:
+ Система получает подтверждение оплаты
+ Создаёт ресурс домена 3-го уровня
+ Домен становится доступным пользователю],
[Постусловия: Домен активирован],
)
#table(
columns: (1fr),
align: left,
[Прецедент: Управление DNS],
[ID: DNS1],
[Краткое описание: Пользователь управляет DNS-записями домена],
[Главный актёр: Пользователь],
[Предусловия: У пользователя есть активный домен],
[Основной поток:
+ Пользователь открывает панель управления DNS
+ Создает/редактирует/удаляет записи (A, AAAA, CNAME, TXT, MX, SRV, CAA)
+ Настраивает TTL для записей],
[Постусловия: Настройки DNS сохранены и применены],
)
#table(
columns: (1fr),
align: left,
[Прецедент: NS-делегирование],
[ID: NS1],
[Краткое описание: Пользователь устанавливает собственные NS-серверы],
[Главный актёр: Пользователь],
[Предусловия: У пользователя есть активный домен],
[Основной поток:
+ Пользователь указывает NS-сервера в панели
+ Система применяет изменения],
[Постусловия: Для домена установлены пользовательские NS-сервера],
)
#table(
columns: (1fr),
align: left,
[Прецедент: Продление домена],
[ID: PR1],
[Краткое описание: Пользователь продлевает регистрацию домена вручную],
[Главный актёр: Пользователь],
[Предусловия: Домен скоро истекает],
[Основной поток:
+ Пользователь выбирает домен для продления
+ Система рассчитывает стоимость
+ Пользователь оплачивает продление],
[Постусловия: Срок действия домена увеличен],
)
#table(
columns: (1fr),
align: left,
[Прецедент: Напоминания о продлении],
[ID: PR2],
[Краткое описание: Система уведомляет пользователя об истечении регистрации],
[Главный актёр: Система],
[Предусловия: Домен зарегистрирован и срок подходит к концу],
[Основной поток:
+ За 30, 14, 7, 3 и 1 день система отправляет уведомления на email],
[Постусловия: Пользователь осведомлён о необходимости продления],
)
#table(
columns: (1fr),
align: left,
[Прецедент: Личный кабинет],
[ID: LK1],
[Краткое описание: Пользователь управляет своим профилем и доменами],
[Главный актёр: Пользователь],
[Предусловия: Пользователь авторизован],
[Основной поток:
+ Пользователь открывает личный кабинет
+ Просматривает список доменов
+ Редактирует профиль
+ Просматривает историю счетов и платежей],
[Постусловия: Пользователь получил доступ к своим данным и управлению ими],
)
#table(
columns: (1fr),
align: left,
[Прецедент: Админ-панель],
[ID: ADM1],
[Краткое описание: Администратор управляет пользователями и их доменами],
[Главный актёр: Администратор],
[Предусловия: Администратор авторизован],
[Основной поток:
+ Администратор открывает панель
+ Просматривает список пользователей и их доменов
+ Управляет пользователями и их зонами],
[Постусловия: Данные пользователей и доменов изменены администратором],
)
#table(
columns: (1fr),
align: left,
[Прецедент: Проверка имени на политику],
[ID: NC1],
[Краткое описание: Система проверяет имя на соответствие политике имен],
[Главный актёр: Система],
[Предусловия: Пользователь запрашивает регистрацию домена],
[Основной поток:
+ Система проверяет имя по списку запрещённых и зарезервированных
+ В случае нарушения отказывает в регистрации],
[Постусловия: Имя либо разрешено, либо отклонено],
)
#table(
columns: (1fr),
align: left,
[Прецедент: Email-уведомления],
[ID: NTF1],
[Краткое описание: Система отправляет пользователю уведомления],
[Главный актёр: Система],
[Предусловия: У пользователя есть действия, требующие уведомлений],
[Основной поток:
+ Система отправляет уведомления о создании заказа, оплате, активации домена и истечении регистрации],
[Постусловия: Пользователь информирован о событиях],
)
#table(
columns: (1fr),
align: left,
[Прецедент: Аудит действий],
[ID: LOG1],
[Краткое описание: Система фиксирует действия пользователей и администраторов],
[Главный актёр: Система],
[Предусловия: В системе происходят значимые события],
[Основной поток:
+ Система записывает, кто, что, когда и откуда сделал
+ Сохраняет данные в журнале],
[Постусловия: Логи доступны для анализа],
)
#table(
columns: (1fr),
align: left,
[Прецедент: Экспорт отчёта],
[ID: REP1],
[Краткое описание: Администратор получает отчёт об использовании сервиса],
[Главный актёр: Администратор],
[Предусловия: Администратор авторизован],
[Основной поток:
+ Администратор запрашивает экспорт отчёта
+ Система формирует файл с количеством зарегистрированных пользователей, активных пользователей и доменов],
[Постусловия: Администратор получил отчёт],
)
== Usability (Требования к удобству использования)
=== Время обучения
Пользователь должен научиться работать с системой не более чем за 10 минут при условии, что у него уже был опыт работы с регистраторами DNS.
Для пользователей должна быть подготовлена документация по использованию Сервиса.
=== Эффективность использования
- Среднее время приобретения домена: < 5 минут.
== Reliability (Требования к надежности)
=== Доступность системы
- Доступность Сервиса: 99.9%.
- Доступность DNS серверов: 99.95%.
- Плановые работы: только в ночное время.
- Максимальное время восстановления: 8 часов 45 минут.
- DNS сервера не должны быть зависимы от доступности Сервиса.
=== Обработка ошибок
- Система должна попытаться автоматически восстановиться после сбоя.
- Журналирование всех ошибок.
- Резервное копирование данных должно происходить минимум раз в неделю.
- Система мониторинга и оповещения.
=== Защита данных
- Шифрование или хеширование чувствительных данных.
- Защита от SQL-инъекций.
- XSS и CSRF защита.
== Performance (Требования к производительности)
=== Время отклика
- Загрузка главной страницы: < 2 секунды.
- Поиск по сайту: < 5 секунда.
- API-запросы: < 400 мс для запросов, не изменяющих состояние системы(не включая поиск).
- API-запросы: < 5 секунд для запросов, изменяющих состояние системы.
=== Масштабируемость
- Поддержка до 1000 одновременных пользователей.
- Автоматическое горизонтальное масштабирование ресурсов.
- Балансировка нагрузки.
== Design Constraints (Ограничения разработки)
=== Технологический стек
- Frontend: HTML, CSS, JavaScript, React.
- Backend: Java, Spring Boot, Docker, Tomcat.
- База данных: PostgreSQL.
- Кэширование: Redis.
- Deployment: Kubernetes.
=== Стандарты разработки
- Код-стайл.
- Код-ревью.
- CI/CD практики.
- Документирование API.
== Interfaces (Интерфейсы)
=== User Interfaces (Пользовательские интерфейсы)
Интерфейс можно разделить на три часть: Лендинг, Кабинет пользователя, Панель администратора.
На лендинге представлена основная информация о Сервисе и предложение зарегистрировать домен.
В кабинете пользователя представлены разделы:
- Мои домены
- DNS
- Корзина
- События
- Профиль/Настройки
В кабинете администратора представлены разделы:
- Главная
- Управление пользователями
- Управление доменами
- Финансы и биллинг
- События в Сервисе
Интерфейс представлен в приложении А.
=== Hardware Interfaces (Аппаратные интерфейсы)
Не требуются специальные аппаратные интерфейсы. Развёртывание сервиса на стандартных серверах/VM x86, поддерживающих ОС Linux 6+ и имеющих доступ в интернет.
=== Software Interfaces (Программные интерфейсы)
- REST API для управления авторитативными DNS-серверами.
- REST API Биллинга.
- SMTP почтового сервера.
=== Communications Interfaces (Сетевые интерфейсы)
- Авторитативные DNS-сервера: UDP/TCP 53
- Кабинет/API -- HTTPS 443 (TLS 1.2+); HSTS, современный набор шифров.
== Licensing Requirements (Требования к лицензированию)
Серверная часть сервиса будет распространяться с закрытым исходным кодом. Пользовательский интерфейс предоставляется в виде веб-приложения, доступного через браузер
#pagebreak()
= Приложение А <UI>
#figure(
image("images/Лендиг.png"),
caption: [Лендинг],
supplement: "Изображение",
)
#figure(
image("images/Логин _ Регистрация.png"),
caption: [Вход и регистрация],
supplement: "Изображение",
)
#figure(
image("images/Личный кабинет пользователя - Главная страница.png"),
caption: [Личный кабинет пользователя - Главная страница],
supplement: "Изображение",
)
#figure(
image("images/Личный кабинет пользователя - Страница _Мои домены_.png"),
caption: [Личный кабинет пользователя - Страница Мои домены],
supplement: "Изображение",
)
#figure(
image("images/Личный кабинет пользователя - Страница _DNS_.png"),
caption: [Личный кабинет пользователя - Страница DNS],
supplement: "Изображение",
)
#figure(
image("images/Личный кабинет пользователя - Страница _Корзина_.png"),
caption: [Личный кабинет пользователя - Страница Корзина],
supplement: "Изображение",
)
#figure(
image("images/Личный кабинет пользователя - Страница _События_.png"),
caption: [Личный кабинет пользователя - Страница События],
supplement: "Изображение",
)
#figure(
image("images/Личный кабинет администратора - Главная страница.png"),
caption: [Личный кабинет администратора - Главная страница],
supplement: "Изображение",
)
#figure(
image("images/Личный кабинет администратора - Страница _Домены_.png"),
caption: [Личный кабинет администратора - Страница Домены],
supplement: "Изображение",
)
#figure(
image("images/Личный кабинет администратора - Страница _Пользователи_.png"),
caption: [Личный кабинет администратора - Страница Пользователи],
supplement: "Изображение",
)
#figure(
image("images/Личный кабинет администратора - Страница _События_.png"),
caption: [Личный кабинет администратора - Страница События],
supplement: "Изображение",
)
#figure(
image("images/Личный кабинет администратора - Страница _Финансы_.png"),
caption: [Личный кабинет администратора - Страница Финансы],
supplement: "Изображение",
)