- С помощью Docker (предпочтительно - docker-compose) развернуть образ с любой опенсорсной СУБД (предпочтительно - PostgreSQL). Предоставить все необходимые скрипты и конфигурационные (docker/compose) файлы для развертывания СУБД, а также инструкции для подключения к ней. Необходимо обеспечить сохранность данных при рестарте контейнера (то есть - использовать volume-ы для хранения файлов СУБД на хост-машине).
- Реализовать на Python3 веб сервис (с помощью FastAPI или Flask, например), выполняющий следующие функции:
- В сервисе должно быть реализован POST REST метод, принимающий на вход запросы с содержимым вида {"questions_num": integer}.
- После получения запроса сервис, в свою очередь, запрашивает с публичного API (англоязычные вопросы для викторин) https://jservice.io/api/random?count=1 указанное в полученном запросе количество вопросов.
- Далее, полученные ответы должны сохраняться в базе данных из п. 1, причем сохранена должна быть как минимум следующая информация (название колонок и типы данный можете выбрать сами, также можете добавлять свои колонки):
- ID вопроса
- Текст вопроса
- Текст ответа
- Дата создания вопроса. В случае, если в БД имеется такой же вопрос, к публичному API с викторинами должны выполняться дополнительные запросы до тех пор, пока не будет получен уникальный вопрос для викторины.
- Ответом на запрос из п.2.a должен быть предыдущей сохранённый вопрос для викторины. В случае его отсутствия - пустой объект.
- В репозитории с заданием должны быть предоставлены инструкции по сборке докер-образа с сервисом из п. 2., его настройке и запуску. А также пример запроса к POST API сервиса.
- Желательно, если при выполнении задания вы будете использовать docker-compose, SQLAalchemy, пользоваться аннотацией типов.
- Язык: Python 3 (CPython)
- БД: PostgreSQL
- Фрейморк: Flask
- ORM: SQLAalchemy
- Среда контейнеров: Docker(docker-compose)
Для удобства работы сервис включен в оркестратор вместе с ДБ и pgAdmin4 (Для просмотра ДБ). На уровне оркестратора они объединены в одну сеть. В качестве веб-сервера используется отладочный сервер Flask, поэтому данную установку не рекомендуется использовать в проде при серьёзных нагрузках и из за проблем с безопасностью. Сервис стартует (по-умолчанию) на порту 8080.
- Старт сервиса (с БД и pgAdmin):
docker-compose --profile apiapp up -d
- Старт только БД:
docker-compose --profile only_db up -d
- Старт БД и pgAdmin:
docker-compose --profile admin_db up -d
В папке запуска при этом будут созданы папки для хранения данных БД, настроек БД и pgAdmin.
- Проверка работы:
docker-compose ps
В контейнер встроена также дополнительная проверка состояния БД.
- Просмотр логов:
docker-compose logs
Для ручной сборки и запуска контейнера только с сервисом можно использовать команды:
sudo docker build -t apiapp_image:latest .
docker run --name apiapp_container --rm -d -p 8080:8080 -e POSTGTRES_SQL_URI=postgresql://quizuser:quiz1234@localhost:5432/quizdb apiapp_image:latest
Параметры для аутентификации БД:
- Имя БД: quizdb
- Имя пользователя: quizuser
- Пароль БД: quiz1234 (мастер пароль от pgAdmin тот же)
- Имя хоста БД для подкючение pgAdmin в контейнере: quizdb_container
- Curl
curl -X POST http://localhost:8080/ -H 'Content-Type: application/json' -d '{"questions_num":10}'
- testAPI (находится в каталоге проекта)
python testAPI.py