Подготовить skeleton лабораторной 2 по мессенджеру

This commit is contained in:
Mikhail Verkovykh
2026-09-10 18:01:35 +03:00
parent 4c14ccbadd
commit 65003b6119
30 changed files with 3247 additions and 98 deletions
+86 -98
View File
@@ -1,117 +1,105 @@
# mtusi2026lab2
# Лабораторная 2. PostgreSQL, сессии и Redis/Valkey
***
## С чего начать?
Для того, чтобы облегчить знакомство с сервисом GitFlic и первые шаги в нём, мы подготовили несколько рекомендаций.
Уже опытный пользователь? Отредактируйте данный **README** файл по своему усмотрению.
Не знаете что добавить в него? Перейдите в раздел `"Что должен содержать README файл"`, в котором описаны ключевые компоненты хорошего README файла.
Перенести состояние в постоянное хранилище и связать запросы с аутентифицированным пользователем. Подтверждённые сообщения и действующие сессии переживают перезапуск.
## Добавьте свои файлы
Если вы решили начать разработку проекта с создания репозитория в нашем сервисе, тогда клонируйте себе данный репозиторий следующим образом:
Это **skeleton**, а не готовый сервер. Здесь есть задание, контракт и публичные проверки. Реализацию приложения, Dockerfile и требуемую инфраструктуру пишет студент. Язык и framework свободные; UI не обязателен.
[Карта курса](COURSE.md) · [Процесс fork/PR](CONTRIBUTING.md) · [OpenAPI](contracts/openapi.json) · [Семантика API](contracts/README.md) · [Проверки](tests/README.md) · [Отчёт](REPORT.md) · [Примеры JSON](contracts/examples.json) · [Памятка преподавателю](MAINTAINERS.md)
```
git clone https://gitflic.ru/project/vmd/mtusi2026lab2.git
cd mtusi2026lab2
**добавьте первые файлы вашего проекта**
git add .
git commit -m "Первый коммит"
git push -u origin master
## Откуда начинаем
Перенесите собственный минимум lab1. Изменения API: password при регистрации, Basic для создания сессии, Bearer вместо X-User-Id для бизнес-запросов.
**Архитектура:** Клиент → API → PostgreSQL; на 4 появляется Redis ИЛИ Valkey для сессий/кэша.
## Что сделать
1. Опишите таблицы, ограничения, индексы и транзакционные границы до написания запросов. Добавьте версионируемые миграции.
2. Перенесите пользователей, чаты, членство и сообщения в PostgreSQL. Не используйте SQLite как замену PostgreSQL в принимаемом стенде.
3. Реализуйте регистрацию с password KDF, вход через Basic, opaque Bearer-сессию, expiry и logout. Действующие сессии тоже должны сохраняться.
4. Подготовьте единый локальный запуск API и БД (Compose рекомендуется уже здесь), подключите именованные volumes.
5. Пройдите smoke и тест полного перезапуска. На 4 добавьте Redis/Valkey с конкретной ролью и повторите эксперимент отказа.
## Оценка «3»: работающий минимум
- Минимум lab1 сохранён с объявленным переходом на новую аутентификацию. Все обязательные данные и ещё действующие сессии переживают рестарт API и хранилищ без удаления volumes.
- PostgreSQL содержит пользователей, чаты, участников и сообщения. Есть первичные/внешние ключи, уникальность username и миграции с нуля. Составная операция создания чата выполняется атомарно.
- Basic применяется только на POST /auth/sessions, остальные endpoint требуют Bearer. Есть срок жизни сессии и отзыв; X-User-Id не даёт доступ. Пароли уже хешируются password KDF.
- make test и make test-persistence ACTION_SCRIPT=scripts/restart.sh проходят. Миграции повторно запускаются без дублирования данных. Secrets/volumes не попадают в Git.
## Оценка «4»: уровень стажёра/джуна
Весь уровень 3 **и все** пункты ниже:
- Redis ИЛИ Valkey реально используется для сессий с TTL либо осмысленного кэша. Опишите источник истины, политику expiry и инвалидации. Если это единственное хранилище сессий, включите persistence, выдерживающее проверяемый рестарт; один TTL не сохраняет данные.
- Используются параметризованные запросы/безопасный ORM, ограниченный connection pool и таймауты. Проверены гонка регистрации одинакового username и rollback составной операции.
- Индекс истории обоснован запросом и EXPLAIN (ANALYZE, BUFFERS) на ≥10 000 сообщениях; пагинация не использует полный scan всей истории на каждую страницу.
- Есть автоматическая проверка expiry при коротком SESSION_TTL_SECONDS, logout, неверного пароля и недоступности Redis/БД. При потере сервиса приложение возвращает ограниченную ошибку/корректно обходит кэш, не принимает запрос от анонимного пользователя как доверенный.
## Оценка «5»: исследование и доказанный результат
Весь уровень 4 **и один законченный трек на выбор**. Приведите гипотезу, повторяемую методику, результаты и ограничения.
**Трек 1. Согласованность кэша.** Покажите на конкурентном сценарии stale read или cache stampede, реализуйте защиту и измерьте число SQL-запросов/latency до и после. Докажите read-after-write из контракта и восстановление после рестарта кэша; одной установки Redis недостаточно.
**Трек 2. План запроса и восстановление.** Исследуйте ≥100 000 сообщений с неравномерными размерами чатов, сравните ≥2 индекса/запроса и стоимость записи. Сделайте backup → восстановление в новое хранилище → сверку количества и выбранных сообщений. Обсудите время восстановления и границы потери данных.
## Как начать и проверить
```sh
# Работает прямо в skeleton, Python 3.9+; приложение не запускается:
make check
# После реализации запустите свой сервер/стенд по REPORT.md.
# По умолчанию тест использует http://localhost:8080.
make test
```
Уже что-то делали в проекте? В таком случае инициализируйте гит-репозиторий в корне проекта и добавьте текущий репозиторий как удалённый репозиторий:
`.env.example`, `compose.example.yaml` и `contracts/infrastructure.json` описывают настройки и роли компонентов. **compose.example.yaml — список ролей с пустым services, не запускаемый стенд.** Реализуйте свой `compose.yaml`/`stack.yaml`, закрепите версии образов, заполните локальный `.env` и опишите bootstrap/миграции. Все зависимости поднимаются из этого репозитория; ссылка «у меня БД уже установлена» не заменяет воспроизводимость.
```sh
# Compose-вариант после реализации:
docker compose --env-file .env config --quiet
docker compose --env-file .env up -d --build
# Дождитесь /health/ready; затем make test.
# Для Swarm укажите эквивалентные build/push/deploy-команды в REPORT.md.
```
cd existing_folder
git init
git remote add origin https://gitflic.ru/project/vmd/mtusi2026lab2.git
git clone
**добавьте новые файлы**
git add .
git commit -m "Новый коммит"
git push -u origin master
Примеры запросов доступны в `examples/requests.http`, примеры JSON — в `contracts/examples.json`. Для полной проверки схемы (по желанию локально; CI делает её автоматически):
```sh
python3 -m venv .venv
.venv/bin/python -m pip install -r requirements-dev.txt
make validate PYTHON=.venv/bin/python
```
***
Smoke не выставляет оценку автоматически. Проверку сохранности/отказов запускайте явно по [tests/README.md](tests/README.md), остальные доказательства приведите в отчёте.
# Что должен содержать README файл
## Сценарий защиты
1. Применить миграции к пустому volume, создать пользователей, войти, отправить сообщение.
2. Запустить persistence-сценарий: он держит токен только в памяти тестового процесса; action script перезапускает API и все используемые хранилища, сохраняя volumes.
3. После готовности тот же токен читает те же данные; после logout — 401. Повторить с отдельным коротким TTL для проверки expiry.
4. Для 4: показать роль Redis/Valkey, план SQL и ошибку зависимости. Для 5: выполнить выбранный эксперимент.
Прежде всего, стоит понимать, что `README.md` — это краткая документация. Это первое, что видит человек, который открывает репозиторий. Поэтому здесь важно дать достаточно информации о проекте и рассказать, что он из себя представляет.
Ключевая информация, которую должен содержать README файл:
## Что должно быть в PR
## Название и описание
Название проекта должно быть простым и понятным (чаще всего это одно слово).
Описание должно описывать основные функции проекта, включая его особенности и назначение.
Если у вашего проекта есть альтернативные проекты, то в описании можно перечислить ключевые отличия, которые выделяют ваш проект на фоне всех остальных.
Исходники, Dockerfile, миграции, compose.yaml либо эквивалентный воспроизводимый запуск, scripts/restart.sh, собственные тесты и отчёт.
## Установка и настройка
Также в `README` файле рекомендуется перечислить необходимые инструкции для установки,
будь то использование пакетных менеджеров (например, `Homebrew` на MacOS или `apt` на Linux),
зависимости, которые могут понадобиться в ходе использования, а также шаги по их настройке.
Заполните `REPORT.md` и [шаблон PR](.github/pull_request_template.md), укажите целевую оценку/трек. Не меняйте обязательный контракт и публичные tests ради зелёного результата. Сохраняйте возможности предыдущих лабораторных в пределах [объявленных переходов](COURSE.md).
## Совместная разработка
Можно добавить информацию о том, как принять участие в разработке вашего проекта, как стать непосредственным участником, правила оформления pull-requests и т.д.
## Вопросы на защите
## Контакты
Ссылки на внешние ресурсы, такие как документация, блог, страница проекта в социальных сетях, сообщество проекта и т.д.
- Что подтверждает COMMIT и какие гарантии зависят от настройки durability?
- Где хранятся сессии и что будет после flush/restart Redis?
- Чем аутентификация отличается от доступа к конкретному чату?
- Почему hash пароля и быстрый checksum имеют разные задачи?
## Статус проекта
В данном разделе рекомендуется указывать, на какой стадии находится проект, активно разрабатывается или находится в стадии застоя.
Если же проект готов и во всю используется, можно указывать актуальную версию, а также последние изменения, которые были сделаны с момента предыдущего релиза.
## Первичные материалы
***
# Полезные ссылки
***
## Работа с проектом
- [ ] [Как создать проект](https://docs.gitflic.ru/project/project_create)
- [ ] [Как импортировать проект](https://docs.gitflic.ru/project/import_base)
- [ ] [Запросы на слияние](https://docs.gitflic.ru/project/merge_request)
- [ ] [Зеркалирование проекта](https://docs.gitflic.ru/project/mirror)
- [ ] [Импортировать проект с GitLab](https://docs.gitflic.ru/project/import)
## Команды
- [ ] [Создание команды](https://docs.gitflic.ru/team/create)
- [ ] [Обзор команды](https://docs.gitflic.ru/team/view)
- [ ] [Настройка команды](https://docs.gitflic.ru/team/settings)
## Реестр пакетов
- [ ] [Реестр пакетов](https://docs.gitflic.ru/registry/package)
- [ ] [PyPi](https://docs.gitflic.ru/registry/pypi_registry)
- [ ] [Generic](https://docs.gitflic.ru/registry/generic_registry)
- [ ] [Maven](https://docs.gitflic.ru/registry/maven_registry)
- [ ] [Docker](https://docs.gitflic.ru/registry/docker)
## Компании
- [ ] [Создание компании](https://docs.gitflic.ru/company/create)
- [ ] [Обзор компании](https://docs.gitflic.ru/company/view)
- [ ] [Тарифы и оплата](https://docs.gitflic.ru/company/price)
- [ ] [Запуск агента компании](https://docs.gitflic.ru/company/saas_runner_setup)
## CI/CD
- [ ] [Что такое GitFlic CI/CD](https://docs.gitflic.ru/cicd/introduction)
- [ ] [Задача (Job)](https://docs.gitflic.ru/cicd/job)
- [ ] [Конвейер (pipeline)](https://docs.gitflic.ru/cicd/pipeline)
- [ ] [Агенты](https://docs.gitflic.ru/cicd/agent)
- [ ] [Справочник для .yaml файла](https://docs.gitflic.ru/cicd/gitflic-ci-yaml)
## API
- [ ] [Введение в GitFlic API](https://docs.gitflic.ru/api/intro)
- [ ] [Методы для администратора](https://docs.gitflic.ru/api/admin)
- [ ] [Получение access токена](https://docs.gitflic.ru/api/access-token)
## Панель администратора
- [ ] [Панель администратора](https://docs.gitflic.ru/admin_panel/intro)
- [ ] [Панель управления](https://docs.gitflic.ru/admin_panel/dashboard)
- [ ] [Настройка LDAP](https://docs.gitflic.ru/admin_panel/ldap)
- [ ] [Ключевые настройки](https://docs.gitflic.ru/admin_panel/settings)
## Общая информация
- [ ] [Глоссарий](https://docs.gitflic.ru/common/gloss)
- [ ] [Права доступа ролей](https://docs.gitflic.ru/common/manage_roles)
- [ ] [Вебхуки](https://docs.gitflic.ru/common/webhook)
- [PostgreSQL transactions](https://www.postgresql.org/docs/current/tutorial-transactions.html)
- [PostgreSQL EXPLAIN](https://www.postgresql.org/docs/current/using-explain.html)
- [Valkey persistence](https://valkey.io/topics/persistence/)
- [Redis persistence](https://redis.io/docs/latest/operate/oss_and_stack/management/persistence/)
- [Basic authentication](https://www.rfc-editor.org/info/rfc7617/)