/test_bewise

Test tasks for bewise.

Primary LanguagePythonMIT LicenseMIT

test_bewise workflow

Тестовое задание bewise

Задание доступно по адресу http://хх.хх.хх.хх/api/post/ до 14.07.2022 г. Статус на 15.08.2022 (отключен).

Стек

  • Python 3.10
  • Docker
  • docker-compose
  • Django 3.2.15
  • Django REST framework
  • CI/CD
  • PostgreSQL
  • Yandex.Cloud

Описание задания bewise:

  • В сервисе реализовано REST API, принимающее на вход POST запросы с содержимым вида {"questions_num": integer}.
  • После получения запроса сервис, в свою очередь, запрашивает с публичного API (англоязычные вопросы для викторин) https://jservice.io/api/random?count=1 указанное в полученном запросе количество вопросов.
  • Далее, полученные ответы сохраняются в базе данных из п. 1, причем сохраняется как минимум следующая информация: ID вопроса, Текст вопроса, Текст ответа, Дата создания вопроса.
  • Если в БД имеется такой же вопрос, к публичному API с викторинами выполняются дополнительные запросы до тех пор, пока не будет получен уникальный вопрос для викторины.
  • Ответом на запрос из п.2.a предыдущей сохранённый вопрос для викторины. В случае его отсутствия - пустой объект.

Запуск API в облаке с использованием CI/CD:

Установить docker, docker-compose на сервере виртуальной машины Yandex.Cloud:

ssh username@ip
sudo apt update && sudo apt upgrade -y && sudo apt install curl -y
sudo curl -fsSL https://get.docker.com -o get-docker.sh && sudo sh 
get-docker.sh && sudo rm get-docker.sh
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

Создаем папку infra на виртуальной машине:

mkdir infra
  • Переносим файлы docker-compose.yml, default.conf и .env на сервер в папку infra.
scp .env username@server_ip:/home/username/infra/
scp docker-compose.yml username@server_ip:/home/username/infra/
scp default.conf username@server_ip:/home/username/infra/
  • Так же, можно создать пустой файл .env в директории infra, позже в него будем добавлять данные с git secrets:
touch .env
  • Заполнить в настройках репозитория секреты в .env из Secrets GitHub:
DB_ENGINE='django.db.backends.postgresql'
POSTGRES_DB='bewise'
POSTGRES_USER='bewise_u'
POSTGRES_PASSWORD='put_your_password'
DB_HOST='db'
DB_PORT='5432'
SECRET_KEY='put_your_code'
ALLOWED_HOSTS='127.0.0.1, localhost, backend, ip_server'
DEBUG=False
  • Запускаем контейнеры находясь в папке infra:
sudo docker-compose up -d --build
  • Затем применяем миграции, собираем статику:
sudo docker-compose exec backend python manage.py makemigrations
sudo docker-compose exec backend python manage.py migrate --noinput 
sudo docker-compose exec backend python manage.py createsuperuser
sudo docker-compose exec backend python manage.py collectstatic --no-input

API будет доступно по адресу: http://your_ip/api/post/

  • Остановить:
sudo docker-compose stop/down

Запуск проекта в dev-режиме

  • Клонируем репозиторий:
git clone git@github.com:themasterid/test_bewise.git

Переходим в папку с проектом:

cd test_bewise
  • Установить и активировать виртуальное окружение (git bash):
python3 -m venv venv

Windows:

source venv/Scripts/activate

Linux:

source venv/bin/activated
  • Установить зависимости из файла requirements.txt
cd bewise
python -m pip install --upgrade pip
pip install -r requirements.txt
  • Создайте базу и пользователя в PosgreSQL:

Linux:

sudo -u postgres psql
CREATE DATABASE bewise_test;
CREATE USER tuser_bewise WITH ENCRYPTED PASSWORD '@test#bewise';
GRANT ALL PRIVILEGES ON DATABASE bewise_test TO tuser_bewise;

Windows, запустите SQL Shell (psql):

CREATE DATABASE bewise_test;
CREATE USER tuser_bewise WITH ENCRYPTED PASSWORD '@test#bewise';
GRANT ALL PRIVILEGES ON DATABASE bewise_test TO tuser_bewise;
  • Прописываем данные для работы в dev режиме в .env файл (там где у нас файл settings.py):
DB_ENGINE='django.db.backends.postgresql'
POSTGRES_DB='bewise_test'
POSTGRES_USER='tuser_bewise'
POSTGRES_PASSWORD='@test#bewise'
DB_HOST='127.0.0.1'
DB_PORT='5432'
SECRET_KEY='put_your_code'
ALLOWED_HOSTS='127.0.0.1, localhost, backend, ip_server'
DEBUG=True
  • Выполняем миграции, собираем статику, создаем администратора:
python manage.py makemigrations
python manage.py migrate
python manage.py collectstatic --no-input
python manage.py createsuperuser
  • Запускаем сервер:
python manage.py runserver

Документация к API доступна после запуска

http://127.0.0.1:8000/api/post/

Автор: Клепиков Дмитрий