Skip to content

Prosept-4/backend_Django

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

PROSEPT MATCHING - это веб-приложение, которое поможет специалистам быстро и эффективно сопоставлять товары производителя с товарами дилеров в БД и вести удобную статистику


Backend часть командного проекта в рамках Хакатона Яндекс Практикум Х Просепт "12.2023"


Ссылка на проект: prediction-service.ddns.net


Технологии:

Python Django DRF Celery Redis Swagger Docker DockerCompose GitHub Actions Gunicorn Nginx Certbot


Функционал:

В процессе разработки проекта были реализованы:

  • интуитивно понятный интерфейс;
  • предварительный анализ данных и машинное обучение;
  • удобное хранение и работа с записями в БД.
  • задачи анализа выполняются асинхронно в Celery.
  • собирается статистика соответствий товаров за выбранный временной промежуток.
  • по окончании анализа оператору приходит уведомление в Телеграм или письмо на почту.

Технические особенности:

Репозиторий включает в себя два файла docker-compose.yml и docker-compose.prod.yml, что позволяет развернуть проект на локальном или удалённом серверах.

Данная инструкция подразумевает, что на вашем локальном/удалённом сервере уже установлен Git, Python 3.10, пакетный менеджер pip, Docker, Docker Compose, утилита виртуального окружения python3-venv.

В проекте предусмотрена возможность запуска БД SQLite3 и PostgreSQL. Выбор БД осуществляется сменой значения DB_ENGINE на sqlite3 или postgresql. sqlite3 = SQLite3, postgresql = PostgreSQL.

В проекте настроена автодокументация с помощью Swagger. Для ознакомления перейдите по ссылке

С подробными инструкциями запуска вы можете ознакомиться ниже.


Запуск проекта локально в Docker-контейнерах с помощью Docker Compose

Склонируйте проект из репозитория:

git clone https://github.com/Prosept-4/backend_Django

Перейдите в директорию проекта:

cd backend_Django/

Перейдите в директорию docker и создайте файл .env:

cd docker/
nano .env

Добавьте строки, содержащиеся в файле .env.example и подставьте свои значения.

Пример из .env файла:

SECRET_KEY=DJANGO_SECRET_KEY        # Ваш секретный ключ Django
DEBUG=False                         # True - включить Дебаг. Или оставьте пустым для False
IS_LOGGING=False                    # True - включить Логирование. Или оставьте пустым для False
ALLOWED_HOSTS=127.0.0.1 backend     # Список адресов, разделенных пробелами

# Помните, если вы выставляете DEBUG=False, то необходимо будет настроить список ALLOWED_HOSTS.
# 127.0.0.1 и backend является стандартным значением. Через пробел.

# Присутствие backend в ALLOWED_HOSTS обязательно. Через название сервиса :
# docker-compose осуществляется отправка почтовых писем.

# БД выбирается автоматически на основе константы DB_ENGINE.
# Если DB_ENGINE = sqlite - используется SQLite3.
# Если DB_ENGINE = postgresql - используется PostgreSQL.

DB_ENGINE=postgresql

POSTGRES_USER=django_user                  # Ваше имя пользователя для бд
POSTGRES_PASSWORD=django                   # Ваш пароль для бд
POSTGRES_DB=django                         # Название вашей бд
DB_HOST=db                                 # Стандартное значение - db
DB_PORT=5432                               # Стандартное значение - 5432

EMAIL_HOST=smtp.yandex.ru                  # Адрес хоста эл. почты
EMAIL_PORT=465                             # Порт эл. почты
EMAIL_USE_TLS=True/False                   # Использование TLS
EMAIL_USE_SSL=True/False                   # Использование SSL
EMAIL_HOST_USER=[email protected]            # Адрес почты, с которой будут отправляться письма
EMAIL_HOST_PASSWORD=SecretPassword         # Пароль почты, с которой будут отправляться письма
DEFAULT_FROM_EMAIL=[email protected]         # Адрес почты, с которой будут отправляться письма

TELEGRAM_BOT_TOKEN=your_tg_bot_token       # Токен вашего Telegram бота.

# При помощи Telegram будут отправляться сообщения о готовности анализа товаров.

В директории docker проекта находится файл docker-compose.yml, с помощью которого вы можете запустить проект локально в Docker контейнерах.

Находясь в директории docker выполните следующую команду:

Примечание. Если нужно - добавьте в конец команды флаг -d для запуска в фоновом режиме.

sudo docker compose -f docker-compose.yml up

Она сбилдит Docker образы и запустит backend, frontend, СУБД, Celery, Redis и Nginx в отдельных Docker контейнерах.

По завершении всех операции проект будет запущен и доступен по адресу http://127.0.0.1/

Для остановки Docker контейнеров, находясь в директории docker выполните следующую команду:

sudo docker compose -f docker-compose.yml down

Либо просто завершите работу Docker Compose в терминале, в котором вы его запускали, сочетанием клавиш CTRL+C.


CI/CD - Развёртка проекта на удаленном сервере

В проекте уже настроен Workflow для GitHub Actions.

Ваш GitHub Actions самостоятельно запустит:

  • 🧪 Тесты: Запускаются тесты для проекта.
  • 🏗️ Сборку образов: Git Action создает Docker-образы приложения.
  • 🚀 Деплой: Образы отправляются на ваш репозиторий DockerHub, проект деплоится на сервер.
  • ✉️ Уведомление: В случае успеха вы получите уведомление в Telegram.

Форкните репозиторий, перейдите в GitHub в настройки репозитория — Settings, найдите на панели слева пункт Secrets and Variables, перейдите в Actions, нажмите New repository secret.

Создайте следующие ключи:

Примечание. При подключении к вашему удалённому серверу воркер GitHub Actions создаст .env файл, создаст БД и запустит контейнер с backend'ом, используя эти константы.

# Общие секреты
DOCKER_USERNAME (Ваш логин в DockerHub)
DOCKER_PASSWORD (Ваш пароль в DockerHub)
HOST (IP адрес вашего удалённого сервера)
USER (Логин вашего удалённого сервера)
SSH_KEY (SSH ключ вашего удалённого сервера)
SSH_PASSPHRASE (Пароль вашего удалённого сервера)
TELEGRAM_TO (Ваш ID пользователя в Telegram)
TELEGRAM_BOT_TOKEN (Ваш ID пользователя в Telegram)
TELEGRAM_TOKEN (Токен вашего бота в Telegram)

# PostgreSQL
POSTGRES_USER(Ваше имя пользователя для бд)
POSTGRES_PASSWORD(Ваш пароль для бд)
POSTGRES_DB(Название вашей бд)
DB_HOST(Адрес бд. Стандартное значение - db)
DB_PORT(Порт бд. Стандартное значение - 5432)

# Django
SECRET_KEY(Ваш секретный ключ Django)
DEBUG(Вкл/выкл DEBUG)
IS_LOGGING(Вкл/выкл Логирование)
ALLOWED_HOSTS(Список адресов, разделенных пробелами)
DB_ENGINE(sqlite или postgresql)
EMAIL_HOST=(Адрес хоста эл. почты)
EMAIL_PORT=(Порт эл. почты)
EMAIL_USE_TLS=(Использование TLS)
EMAIL_USE_SSL=(Использование SSL)
EMAIL_HOST_USER=(Адрес почты, с которой будут отправляться письма)
EMAIL_HOST_PASSWORD=(Пароль почты, с которой будут отправляться письма)
DEFAULT_FROM_EMAIL=(Адрес почты, с которой будут отправляться письма)

Внимание! Для корректного отображения изображений не забудьте помимо localhost, 127.0.0.1 и backend добавить в ALLOWED_HOSTS доменное имя вашего сайта.

Теперь можно приступать к деплою

Внимание! Дальнейшие действия подразумевают что на вашем удалённом сервере Nginx установлен и настроен как прокси-сервер. Изначально Nginx в Docker-контейнере слушает порт 8500.

В локальном проекте замените в файле docker-compose.prod.yml названия образов в соответствии с вашим логином на DockerHub в нижнем регистре (Например your_username/matching_backend)

Аналогично измените названия образов и в файле main.yml, который находится в директории /.github/workflows/.

Подключитесь к вашему удалённому серверу любым удобным способом. Создайте в домашней директории директорию с названием prosept_matching и перейдите в неё.

mkdir prosept_matching

Готово.

Весь процесс автоматизирован! Как только вы инициируете коммит на локальной машине и отправите изменения на GitHub, GitHub Actions возьмёт дело в свои руки:

git add .
git commit -m "Ваше сообщение для коммита."
git push

После успешной отправки изменений перейдите в своём репозитории на GitHub во вкладку Actions. Вы увидите процесс работы Actions. После успешного окончания работы воркера в ваш Telegram придёт сообщение от бота:

Деплой проекта Prosept Matching успешно выполнен!

Данное сообщение означает что проект успешно запущен на сервере, проведены миграции и собрана статика backend'а.

После этого можно вернуться на удалённый сервер, в директорию prosept_matching и создать суперпользователя:

sudo docker compose -f docker-compose.production.yml exec -it matching-backend python manage.py createsuperuser

Внимание! : Для полноценной работы проекта на вашем удалённом сервере должен быть установлен, настроен и запущен Nginx. Удостоверьтесь что в конфиге по вашему доменному имени настроена переадресация всех запросов на 127.0.0.1:8500 и добавлена переадресация заголовков.

Настройка SSL шифрования через Let's Encrypt

Чтобы проект отвечал базовым стандартам безопасности необходимо настроить SSL сертификат.

Установите certbot:

sudo apt install snapd
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

Запустите sertbot и получите свой SSL сертификат:

sudo certbot --nginx

После перезапустите Nginx:

sudo systemctl reload nginx
sudo certbot certificates

Примечание. SSL-сертификаты от Let's Encrypt действительны в течение 90 дней. Их нужно постоянно обновлять. Если вы не хотите делать это самостоятельно, вы можете настроить автоматическое обновление сертификата с помощью команды ниже.

sudo certbot renew --dry-run

Теперь вы можете получить доступ к сайту по его доменному имени.

Как только убедитесь, что все страницы отображаются корректно - можете начать приглашать пользователей для создания вакансий и подбора кандидатов.


Авторы

Максим Головин
Кирилл Широков

Вы можете заглянуть в другие наши репозитории в наших профилях GitHub.

Максим | Кирилл