Найти в Дзене
Вадим Зырянов

Делаем тестовое задание на позицию DevOps Junior или путь становления как специалиста (часть-2)

Оглавление

Ну что-ж, продолжим. Клонируем репо нашего тестового:

проект на Django
проект на Django
README по проекту
README по проекту

Так случилось, что я уже 2 раза навернул пакетный менеджер, пока пытался разворачивать этот проект) Все из-за того, что Django это у нас Python, а для удобной установки я использую модуль от питона - пакетный менеджер pip. Потом оказывается, что существуют такие вещи, как виртуальное окружение, как раз таки, для таких случаев, чтобы ничего не поломалось на основной машине.

Проект работает на питоне 3.8, поэтому устанавливаем его, если он отсутствует.

Дальше я бы ничего лишнего не устанавливал, что связано с питоном(чтобы снова не поломать пакетный менеджер или чего-нибудь другое), поэтому скачиваем библиотеку виртуальной среды python3-venv

Устанавливаем библиотеку виртуального окружения
Устанавливаем библиотеку виртуального окружения

и создаем рядом с нашим проектом среду

$ python3 -m venv VEPyth
виртуальное окружение в папке VEPyth
виртуальное окружение в папке VEPyth

Как бы странно не звучало, но не запускайте модуль с правами рута (sudo), иначе будем возиться с тем, чтобы устранять ошибки прав :)

Запускаем

$ source VEPyth/bin/activate

Установка uWSGI в виртуальное окружение

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

Слушаем и повинуемся. Перед тем как его собрать установим библиотеки для компиляции.

$ sudo apt-get install build-essential python-dev

Данные пакеты можно устанавливать через apt - ничего не сломает, если что.

Далее скачиваем архив

$ wget https://projects.unbit.it/downloads/uwsgi-latest.tar.gz

Распаковываем и компилируем

$ tar zxvf uwsgi-latest.tar.gz
$ cd <dir>
$ make

Дело за малым, установим uwsgi в пакетный менеджер pip, который в свою очередь находится в виртуальной среде.

$ pip install *путь до uwsgi*/
Проверяем, что uwsgi встал и смотрим его версию
Проверяем, что uwsgi встал и смотрим его версию

Устанавливаем Django в виртуальное окружение

Весь процесс точно такой же, как и с UWSGI, поэтому

$ git clone https://github.com/django/django.git

На официальном сайте Django написано, что его надо установить через модуль pip с ключом -e, чтобы код Django стал доступным для импорта, не совсем понимаю, нужно ли мне использовать это для проекта, который уже сделан на Django, но лишним точно не будет :)

$ pip install -e django/

Сейчас наша home директория выглядит так:

Домашняя директория. p.s. не обращайте внимания на hw.py - это тестовый файлик)
Домашняя директория. p.s. не обращайте внимания на hw.py - это тестовый файлик)

Разворачиваем наш проект и ставим сервер UWSGI

Заходим в папку docker-ci и читаем инструкцию по установке

README installing
README installing
$ pip install --upgrade pip pip-tools
$ make
Не знаю как для вас, но для меня видеть успешную компиляцию очень приятно, т.к. никогда не обходится без того, чтобы я с первого раза смог скомпилировать :) p.s. и этот проект тоже не исключение - переписываю статью 3 раз
Не знаю как для вас, но для меня видеть успешную компиляцию очень приятно, т.к. никогда не обходится без того, чтобы я с первого раза смог скомпилировать :) p.s. и этот проект тоже не исключение - переписываю статью 3 раз

Мы скомпилировали и теперь нам надо подключить БД Postgresql и сервер uwsgi.

Настройки БД данного проекта лежат в пути:

~/docker-ci/src/app/conf/db.py

Открываем его и редактируем, как написано в документации

Настройки БД для Django проекта
Настройки БД для Django проекта
Документация Django - пример настройки для PostgreSQL
Документация Django - пример настройки для PostgreSQL

'ENGINE' - какой движок БД использовать django для этого приложения

'NAME' - название БД (это когда через SQL делаем create mydb)

'USER' - как и в любой базе данных есть пользователи, нам нужно прописать от какого пользователя мы будем подключаться

'PASSWORD' - тут и говорить нечего, но как по мне данный метод защиты самый плохой, но для базового тестового подойдет

'HOST' - указываем, где находится наш сервер postgresql. Маленькое отступление: если указывать свой локальный ip адрес, то данное решение не заработает, ну по крайней мере у меня не получилось поднять. Возможно, postgresql ждет либо localhost(то есть на самой системе UNIX будет проверять соединение с БД, либо хоста, который является удаленным. Но я уверен, что это все можно обойти, но навыков пока не хватает. Поэтому указываем 127.0.0.1, либо попробовать изменить host файл и вместо строчки
"127.0.0.1 localhost" указать "<ваш локальный ip> <localhost>"

'PORT' - любой порт не ниже 1023 (диапазон 1-1023 протоколов зарезервирован стандартными службами системы)

Настройка PostgreSQL

Заходим под учетку postgres и идем в наш кластер ->

$ sudo -i -u postgres
$ cd data
Наш кластер, где хранится вся инфа
Наш кластер, где хранится вся инфа

Для начала настроим backend кластера также, как и прописывали в проекте(host и порт)

Заходим в конфиг

$ vim postgresql.conf
пропишем, что будем запускать сервер БД по localhost адресу и port - 5432
пропишем, что будем запускать сервер БД по localhost адресу и port - 5432

Этого достаточно для бэка. Давайте от имени postgres создадим базу для django, которую прописывали в настройках.

$ psql
=# CREATE DATABASE "docker-ci";
создание БД docker-ci
создание БД docker-ci

И создадим пароль для postgres, который также прописали в настройках

=# \password postgres

Выходим из psql

=# \q

Теперь нужно изменить клиентский конфиг, чтобы сказать postgre, что мы будем принимать клиентов, только с этих адресов

$ vim pg_hba.conf
Клиенты, которые могут подключаться к нашей базе
Клиенты, которые могут подключаться к нашей базе

TYPE - пишем host

DATABASE - какую БД использовать хосту

USER - под каким юзером управлять БД

ADDRESS - ip адрес и маска, если хотим чтобы только этот айпишник подключался и никакой больше маска должна быть 32

METHOD - есть много разных методов, но оставляем password (в боевых задачах я бы не стал такой метод использовать)

Сохраняемся и выходим из пользователя postgres.

Миграция и запуск приложения

Переходим в наш проект и запускаем миграцию

$ cd docker-ci/src
./manage.py migrate
Миграция прошла успешно
Миграция прошла успешно

Запуск uwsgi

Создадим файл с настройками, для нашего сервера

$ vim uwsgi.ini
-16
[uwsgi] -> указываем uwsgi серверу, что это настройки
http-socket -> открываем сокет http
chdir -> директория приложения
wsgi-file -> файл wsgi проекта
master -> мастер процесс
virtualenv -> директория откуда брать либы

запускаем сервер

$ uwsgi uwsgi.ini
Заходит на страницу, но статики нет
Заходит на страницу, но статики нет

Проверим, что у нас по /admin выдает, т.к. это у нас api проект

Опачки! Все работает
Опачки! Все работает

Что же выводит консоль?

Состояние сервера - все хорошо. На предупреждения не обращаем внимания
Состояние сервера - все хорошо. На предупреждения не обращаем внимания

Что в итоге?

  • Сделали виртуальное окружение
  • Поставили UWSGI сервер
  • Настроили postgresql
  • Сконфигурировали приложение
  • И самое главное - скоммуницировали всё это в одну среду

Что осталось?

Нам нужно все это обернуть в docker и настроить базовый CI.

Осталось совсем немного и тестовое задание будет готово :)