Skip to content

ijaric/yamdb_final-1

 
 

Repository files navigation

Yamdb_final

yamdb_final workflow

GitHub%20Actions GitHub docker NGINX Python Django PostgreSQL

Проект Yamdb_final создан для демонстрации методики DevOps (Development Operations) и идеи Continuous Integration (CI), суть которых заключается в интеграции и автоматизации следующих процессов:

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

Само приложение взято из проекта api_yamdb, который представляет собой API сервиса отзывов о фильмах, книгах и музыке. Зарегистрированные пользователи могут оставлять отзывы (Review) на произведения (Title). Произведения делятся на категории (Category): «Книги», «Фильмы», «Музыка». Список категорий может быть расширен администратором. Приложение сделано с помощью Django REST Framework.

Для Continuous Integration в проекте используется облачный сервис GitHub Actions. Для него описана последовательность команд (workflow), которая будет выполняться после события push в репозиторий.

Начало

Клонирование проекта:

git clone https://github.com/SergeyMMedvedev/yamdb_final.git

Для добавления файла .env с настройками базы данных на сервер необходимо:

  • Установить соединение с сервером по протоколу ssh:

    ssh username@server_address
    

    Где username - имя пользователя, под которым будет выполнено подключение к серверу.

    server_address - IP-адрес сервера или доменное имя.

    Например:

  • В домашней директории проекта Создать папку www/:

    mkdir www
    

    В ней создать папку yamdb_final/:

    mkdir www/yamdb_final
    

    В папке yamdb_final создать файл .env:

    touch www/yamdb_final/.env
    
  • Добавить настройки в файл .env:

    sudo nano www/yamdb_final/.env
    

    Пример добавляемых настроек:

    DB_ENGINE=django.db.backends.postgresql
    DB_NAME=postgres
    POSTGRES_USER=postgres
    POSTGRES_PASSWORD=postgres
    DB_HOST=postgres
    DB_PORT=5432
    

Также необходимо добавить Action secrets в репозитории на GitHub в разделе settings -> Secrets:

  • DOCKER_PASSWORD - пароль от DockerHub;
  • DOCKER_USERNAME - имя пользователя на DockerHub;
  • HOST - ip-адрес сервера;
  • SSH_KEY - приватный ssh ключ (публичный должен быть на сервере);
  • TELEGRAM_TO - id своего телеграм-аккаунта (можно узнать у @userinfobot, команда /start)
  • TELEGRAM_TOKEN - токен бота (получить токен можно у @BotFather, /token, имя бота)

Проверка работоспособности

Теперь если внести любые изменения в проект и выполнить:

git add .
git commit -m "..."
git push

Комманда git push является триггером workflow проекта. При выполнении команды git push запустится набор блоков комманд jobs (см. файл yamdb_workflow.yaml). Последовательно будут выполнены следующие блоки:

  • tests - тестирование проекта на соответствие PEP8 и тестам pytest.

  • build_and_push_to_docker_hub - при успешном прохождении тестов собирается образ (image) для docker контейнера и отправлятеся в DockerHub

  • deploy - после отправки образа на DockerHub начинается деплой проекта на сервере. Происходит копирование следующих файлов с репозитория на сервер:

    • docker-compose.yaml, необходимый для сборки трех контейнеров:
      • postgres - контейнер базы данных
      • web - контейнер Django приложения + wsgi-сервер gunicorn
      • nginx - веб-сервер
    • nginx/default.conf - файл кофигурации nginx сервера
    • static - папка со статическими файлами проекта

    После копировния происходит установка docker и docker-compose на сервере и начинается сборка и запуск контейнеров.

  • send_message - после сборки и запуска контейнеров происходит отправка сообщения в телеграм об успешном окончании workflow

После выполнения вышеуказанных процедур необходимо установить соединение с сервером:

ssh username@server_address

Отобразить список работающих контейнеров:

sudo docker container ls

В списке контейнеров копировать CONTAINER ID контейнера username/yamdb_final_web:latest (username - имя пользователя на DockerHub):

CONTAINER ID   IMAGE                            COMMAND                  CREATED          STATUS          PORTS                NAMES
0361a982109d   nginx:1.19.6                     "/docker-entrypoint.…"   50 minutes ago   Up 50 minutes   0.0.0.0:80->80/tcp   yamdb_final_nginx_1
a47ce31d4b7b   username/yamdb_final_web:latest  "/bin/sh -c 'gunicor…"   50 minutes ago   Up 50 minutes                        yamdb_final_web_1
aed19f6751f3   postgres:13.1                    "docker-entrypoint.s…"   50 minutes ago   Up 50 minutes   5432/tcp             yamdb_final_postgres_1

Выполнить вход в контейнер:

sudo docker exec -it a47ce31d4b7b bash

Внутри контейнера выполнить миграции:

python manage.py migrate

Также можно наполнить базу данных начальными тестовыми данными:

python3 manage.py shell
>>> from django.contrib.contenttypes.models import ContentType
>>> ContentType.objects.all().delete()
>>> quit()
python manage.py loaddata fixtures.json

Теперь проекту доступна статика. В админке Django (http://<server_address>/admin) доступно управление данными. Если загрузить фикструры, то будет доступен superuser:

  • email: admin5@admin5
  • password: admin512345

Для создания нового суперпользователя можно выполнить команду:

$ python manage.py createsuperuser

и далее указать:

Email:
Username:
Password:
Password (again):

Для обращения к API проекта:

Cписок и подробное описание доступных запросов к приложению можно посмотреть:

Для остановки и удаления контейнеров и образов на сервере:

sudo docker stop $(sudo docker ps -a -q) && sudo docker rm $(sudo docker ps -a -q) && sudo docker rmi $(sudo docker images -q)

Для удаления volume базы данных:

sudo docker volume rm yamdb_final_postgres_data

Автор

Releases

No releases published

Packages

No packages published

Languages

  • JavaScript 41.5%
  • CSS 39.4%
  • Python 18.7%
  • Other 0.4%