Skip to content

Проект сайта для публикации рецептов.

License

Notifications You must be signed in to change notification settings

Dmitri-prog/free-food-recipes

Repository files navigation

Проект cайта для публикации рецептов

Python Django DjangoREST PostgreSQL Nginx Docker Gunicorn YandexCloud GitHubActions Telegram

Описание

Сайт для публикации рецептов, добавления рецептов в избранное и возможности подписки на публикации других авторов.

Реализован REST API сервис для взаимодействия с базой данных, авторизация на JW-токенах. Проект упакован в Docker-контейнеры и настроен CI/CD с подтверждением успешной сборки проекта через telegram-бот.

Как запустить проект на удаленном сервере:

  1. Клонировать репозиторий на локальный компьютер и перейти в него в командной строке:
git clone https://github.com/Dmitri-prog/free-food-recipes.git
cd free-food-recipes
  1. Cоздать в корне проекта файл .env и заполнить его (пример файла .env см. в приложенном файле .env.example). Описание переменных виртуального окружения файла .env для работы проекта:
POSTGRES_USER - имя пользователя БД;
POSTGRES_PASSWORD - пароль пользователя БД;
POSTGRES_DB - название БД PostgreSQL;
DB_HOST - адрес, по которому Django будет соединяться с базой данных. При работе нескольких контейнеров в сети Docker network вместо адреса указывают имя контейнера, где запущен сервер БД;
DB_PORT - порт, по которому Django будет обращаться к базе данных. Порт по умолчанию для PostgreSQL - 5432;
SECRET_KEY - cекретный ключ установки Django. Он используется в контексте криптографической подписи и должен иметь уникальное, непредсказуемое значение. Новый оригинальный секретный ключ можно получить при помощи функции get_random_secret_key(), импортируемой из django.core.management.utils;
DEBUG - настройка вывода отладочной информации в Django-проекте, указывается в файле settings.py, при развертывании проекта должно быть установлено значение False
ALLOWED_HOSTS - список хостов/доменов, для которых может работать текущий проект. По умолчанию доступны хосты '127.0.0.1' и 'localhost'.
  1. Создать Docker-образы проекта. Замените username на Ваш логин на DockerHub:
cd frontend
docker build -t username/foodgram_frontend .
cd ../backend/foodgram
docker build -t username/foodgram_backend .
cd ../../gateway
docker build -t username/foodgram_gateway .
  1. Загрузить созданные образы на DockerHub. Замените username на Ваш логин на DockerHub:
docker push username/foodgram_frontend
docker push username/foodgram_backend
docker push username/foodgram_gateway
  1. Подключиться к удаленному серверу:
ssh -i путь_до_файла_с_SSH_ключом/название_файла_с_SSH_ключом имя_пользователя@ip_адрес_сервера
  1. Создать на сервере через терминал директорию foodgram:
mkdir foodgram
  1. Установить docker compose на сервер:
sudo apt update
sudo apt install curl
curl -fSL https://get.docker.com -o get-docker.sh
sudo sh ./get-docker.sh
sudo apt install docker-compose-plugin 
  1. На локальном компьютере из дирректории foodgram-project-react/ cкопировать на сервер в директорию foodgram/ файл docker-compose.production.yml и .env:
scp -i path_to_SSH/SSH_name docker-compose.production.yml username@server_ip:/home/username/foodgram/docker-compose.production.yml
scp -i path_to_SSH/SSH_name .env username@server_ip:/home/username/foodgram/.env

Где:

path_to_SSH — путь к файлу с SSH-ключом;
SSH_name — имя файла с SSH-ключом (без расширения);
username — Ваше имя пользователя на сервере;
server_ip — IP вашего сервера.
  1. Запустить на сервере docker compose в режиме демона:
sudo docker compose -f docker-compose.production.yml up -d
  1. На сервере выполнить миграции, собрать статические файлы бэкенда и скопировать их в /backend_static/static/, а также загрузить список ингредиентов:
sudo docker compose -f docker-compose.production.yml exec backend python manage.py migrate
sudo docker compose -f docker-compose.production.yml exec backend python manage.py collectstatic
sudo docker compose -f docker-compose.production.yml exec backend cp -r /app/collected_static/. /backend_static/static/
docker compose -f docker-compose.production.yml exec backend python manage.py load_ingredients_into_db
  1. На сервере в редакторе Nano открыть файл настроек Nginx:
sudo nano /etc/nginx/sites-enabled/default
  1. В файле настроек Nginx через редактор Nano указать для проекта настройки location в секции server:
location / {
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:8000;
    }
  1. Чтобы убедиться, что в конфиге (файле настроек) Nginx нет ошибок — выполнить команду проверки конфигурации:
sudo nginx -t
  1. Перезагрузить конфиг Nginx:
sudo service nginx reload
  1. Перейти на страницу проекта по адресу https://ваш_домен_проекта/ и убедиться в его работоспособности.

Как настроить CI/CD проекта и уведомления о деплое от Telegram-бота:

  1. В дирректории .github/workflows приложен готовый файл main.yml для организации CI/CD проекта через GitAction и уведомлений через телеграм-бота.
  2. Для выполнения CI/CD проекта, необходимо в Вашем аккаунте на GitHub для данного проекта создать секреты. Перейти в настройки репозитория проекта — Settings, выбрать на панели слева Secrets and Variables → Actions, нажать New repository secret. Необходимо создать следующие секреты:
DOCKER_USERNAME - имя пользователя в DockerHub;
DOCKER_PASSWORD - пароль пользователя в DockerHub;
HOST - IP удаленного сервера;
USER - имя Вашего пользователя на удаленном сервере;
SSH_KEY - содержимое текстового файла с закрытым SSH-ключом для доступа к удаленному серверу;
SSH_PASSPHRASE - passphrase для закрытого SSH-ключа.
  1. Для получения уведомлений от телеграм-бота об успешном деплое проекта необходимо в Вашем аккаунте на GitHub для GitAction создать следующие секреты:
TELEGRAM_TO - ID Вашего телеграм-аккаунта, можно узнать у телеграм-бота @userinfobot;
TELEGRAM_TOKEN - токен Вашего телеграм-бота, получить этот токен можно у телеграм-бота @BotFather.

Примеры некоторых запросов API

Регистрация пользователя:

   POST /api/v1/users/

Получение данных своей учетной записи:

   GET /api/v1/users/me/ 

Добавление подписки:

   POST /api/v1/users/id/subscribe/

Обновление рецепта:

   PATCH /api/v1/recipes/id/

Удаление рецепта из избранного:

   DELETE /api/v1/recipes/id/favorite/

Получение списка ингредиентов:

   GET /api/v1/ingredients/

Скачать список покупок:

   GET /api/v1/recipes/download_shopping_cart/

Все доступные варианты запросов к API, а также примеры ответов API можно посмотреть после запуска проекта в его документации, выполнив запрос

   foodgram-project-react/docs/redoc/

Автор

Марков Дмитрий