Подготовить skeleton лабораторной 2 по мессенджеру
This commit is contained in:
@@ -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/)
|
||||
|
||||
Reference in New Issue
Block a user