# План: закрепление версий зависимостей (п. 1.2 рекомендаций) ## Цель Сборка образа и запуск тестов воспроизводимы: завтрашняя сборка использует те же версии библиотек, что и сегодняшняя (риск 2 анализа). Обновление библиотек становится осознанным действием. ## Дизайн - **Версии берутся из образа, на котором сейчас проходят 18 тестов** (`pip freeze` в контейнере, Python 3.11), поэтому поведение не меняется. - `requirements.txt` и `requirements-dev.txt`: только прямые зависимости с точной версией (`==`), файлы остаются читаемыми. - прод: `requests`, `fastapi`, `uvicorn`, `APScheduler`; - разработка: `pytest`, `httpx`. - `constraints.txt` (новый): полный список всех установленных пакетов, включая транзитивные (`starlette`, `pydantic`, `urllib3` и др.). Оба Dockerfile ставят пакеты с `-c constraints.txt`, поэтому закреплены и косвенные зависимости. - Базовый образ `python:3.11-slim` не закрепляется по дайджесту (патчи безопасности Python приходят автоматически); это осознанный компромисс, указан в README. - Порядок обновления (в README): поднять версии в контейнере, прогнать тесты, обновить `constraints.txt` из `pip freeze`, коммит. ## Изменения 1. `requirements.txt`, `requirements-dev.txt`: точные версии. 2. `constraints.txt`: новый файл. 3. `Dockerfile`, `Dockerfile.test`: копирование `constraints.txt`, установка с `-c`. 4. `README.md`: ручная установка с `-c constraints.txt`, порядок обновления версий. 5. Тестов не добавляется (код не меняется). ## Проверка - Сборка обоих образов, 18 тестов проходят. - В прод-образе `pip freeze` совпадает с закреплёнными версиями (нет лишних пакетов вроде `pytest`). - Импорт `api_server` и `collector_daemon` в прод-образе.