В этом задании надо будет своими руками заняться запуском нескольких контейнеров с помощью Docker Compose (и не только). В рамках задания содержимое контейнеров не очень важно, но необходимо и играет важную роль.
- Установленные Docker и Docker Compose
- Git и GitHub (даже для ценителей GitLab)
- Базовые знания командной строки
- Программа с простейшим приложением на любом языке программирования
В базовом случае обойдёмся без оригинальностей. Необходимо сделать приложение из двух частей:
- Само приложение:
- Принимает HTTP-запросы на какой-либо порт.
- На запрос
/ping:- Отвечает
pong. - Неявно сохраняет ip, с которого пришёл запрос.
- Например, если приложение слушает 80й порт и запущенно в хостовой ОС, на команду
curl localhost/ping, мы должны увидеть pong в консоли.
- Отвечает
- На запрос
/visits:- Отвечает числом "посещений" запроса
/ping - Например, после двух выполнений
/ping, на командуcurl localhost/visits, мы должны увидеть в консоли 2.
- Отвечает числом "посещений" запроса
- Примеры фреймворков (рекомендуется остановиться на питоне):
- FastAPI (python)
- Flask (python)
- httprouter(golang)
- Gin (golang)
- restbed (C++)
- База данных:
- Требуется просто запустить СУБД в отдельном контейнере.
- Любым способом создать БД и таблицу, в которой можно было бы сохранить информацию о запросах.
- БД должна быть доступна для взаимодействия из приложения.
- По умолчанию, предлагаю использовать PostgreSQL.
На самом деле, задание начинается здесь. Но здесь всё тоже относительно просто, нужно написать:
- Dockerfile, который собирает приложение
- docker-compose.yml, который собирает обе части воедино: собирает приложение, проставляет все переменные и запускает два контейнера.
- Для приложения должен быть проброшен порт на 5000й порт хоста.
- Порт СУБД пробрасывать не нужно.
- СУБД Должна сохранять данные от запуска к запуску, если данные не стёрты явным образом.
Раз уж мы тут занялись автоматизацией, проверка тоже будет автоматической (ну почти). Для выполнения задания требуется:
- Сделать Fork репозитория на GitHub с заданием.
- Залить решение задания в свою копию репозитория.
- Сделать Pull Request в исходном репозитории на добавление изменений, в котором:
- В названии необходимо оставить своё ФИО.
- В описании необходимо перечислить выполненные дополнительные задания (если такие есть).
- После создания Pull Request, запустится автоматическая проверка (через github Actions) - необходимо убедиться, что она успешно отрабатывает.
- Если все проверки пройдены, автоматическая часть проверки закончена: здесь придётся подождать Review. При возникновении вопросов, буду писать их непосредственно в PR (настройте уведомления, чтобы не пропустить).
- Вы великолепны, просто дождитесь обновления таблицы с результатами. PR в этом случае будет закрыт, но не удалён: обсуждение можно будет продолжить.
Специально оставлю достаточно широкие формулировки, чтобы был простор для творчества.
- Скрипт инициализации БД.
- Инициализацию БД (в базовом случае - создание таблицы) необходимо отделить явным образом в отдельный скрипт.
- В docker-compose.yml необходимо добавить сервис для запуска этого скрипта.
- HTTP-приложение должно запускаться только после того, как отработал скрипт инициализации (должно быть достигнуто средствами docker compose, а не ожиданием в приложении)
- Необходимо модифицировать файл
.github/workflows/test.yml, чтобы в нём появилась проверка успешного завершения инициализирующего скрипта.
- Кэширование.
- Помимо "долгоживущих" БД в веб-приложениях частенько используют дополнительные сервисы, для ускорения ответов пользователю - добавьте использование такого сервиса в своё приложение.
- Сохраняйте в кэш актуальное число обработанных запросов.
- Кэш должен быть отдельным сервисом.
- Важно соблюдать консистентность: запрос с кэшом и без него должны выдавать одинаковые результаты.
- Необходимо модифицировать файл
.github/workflows/test.yml, чтобы в нём появилась проверка успешного запуска кеширующего сервиса.
- Тестирование.
- Хоть у нас и простое приложение, всегда есть шансы ошибиться. Необходимо добавить тесты, которые проверяли бы наше приложение.
- У тестов есть важная характеристика: Покрытие (Coverage) - нужно, чтобы разработанные тесты покрывали хотя бы 60% кода (даже если кода совсем мало).
- Необходимо модифицировать файл
.github/workflows/test.yml, чтобы в нём появилась проверка успешного выполнения тестов (В том числе, покрытие). - Здесь всё зависит от выбранного языка программирования: не переусложняйте себе задачу.
- Разные окружения.
- В ходе разработки может возникнуть необходимость отделять окружения: удобное для разработчиков, от окружения, которое не страшно опубликовать или отдать заказчику. Для этого могут можно использовать запуск docker compose с несколькими файлами.
- Сделайте разделите docker-compose на разные файлы, чтобы получить два окружения:
- Dev: запускается только приложение в режиме, при котором на запрос
/visitsвсегда отвечает -1. - Prod: всё работает в полноценном режиме
- Dev: запускается только приложение в режиме, при котором на запрос
- Поправьте
.github/workflows/test.yml, чтобы корректно отрабатывала проверка.
- Импровизация.
- Предложите своё содержимое контейнеров.
- Должно быть минимум 2 взаимодействующих контейнера.
- Ограничений сверху на число контейнеров нет.
- Нужно актуализировать
.github/workflows/test.yml.
- Я лучше знаю.
- Предложите обоснованное улучшение проверяющего скрипта.
- В этом случае сделайте отдельный PR: в случае успеха он будет влит в общий репозиторий.
- В описании PR опишите аргументацию: что добавляет/улучшает проверка.
- Каждый человек может выполнить это задание лишь однажды, даже переписав весь workflow проверки (т.е. улучшения можно предлагать, но дополнительных баллов за это не будет начислено).
- Если будут одинаковые предложения, балл начисляется в порядке первинства.
Основное задание относительно простое, поэтому оно приносит неполный балл. К тому же, у всех разный опыт, поэтому оценки следующие:
- Бакалаврам: 0.8 балла.
- Магистрам: 0.6 балла.
Разобравшись с основным заданием, должно стать проще, поэтому дополнительные задания всем дают по 0.2 балла. Для баланса, максимальный балл у бакалавров и магистров одинаковый = 1.4 (даже если выполните все задания).
В угоду удобства и специфики задания, используется публичный репозиторий. В связи с этим, вы будете иметь возможность видеть решения друг друга. С другой стороны, современные нейронки предлагают решение лучше соседей, а мне важно, чтобы заинтересованные разобрались. Поэтому просто оставлю предупреждение: в случае подозрений на списывание, буду ставить 0.1 балла с блокировкой дальнейшей сдачи. Это, в частности, означает: при использовании публичных источников, потрудитесь добавить оригинальности своему решению.
В этот раз поверю в силу автоматизации и сделаю один дедлайн: последний push в PR должен быть сделан не позднее 17:02 14.11.2025. Если вы ну очень уж хотели что-то доделать и запушили какие-то дополнения после дедлайна, сделайте это отдельным коммитом: тогда будут шансы, что будет засчитана хоть часть задания.