Ну что-ж, продолжим. Клонируем репо нашего тестового:
Так случилось, что я уже 2 раза навернул пакетный менеджер, пока пытался разворачивать этот проект) Все из-за того, что Django это у нас Python, а для удобной установки я использую модуль от питона - пакетный менеджер pip. Потом оказывается, что существуют такие вещи, как виртуальное окружение, как раз таки, для таких случаев, чтобы ничего не поломалось на основной машине.
Проект работает на питоне 3.8, поэтому устанавливаем его, если он отсутствует.
Дальше я бы ничего лишнего не устанавливал, что связано с питоном(чтобы снова не поломать пакетный менеджер или чего-нибудь другое), поэтому скачиваем библиотеку виртуальной среды python3-venv
и создаем рядом с нашим проектом среду
$ python3 -m venv 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*/
Устанавливаем Django в виртуальное окружение
Весь процесс точно такой же, как и с UWSGI, поэтому
$ git clone https://github.com/django/django.git
На официальном сайте Django написано, что его надо установить через модуль pip с ключом -e, чтобы код Django стал доступным для импорта, не совсем понимаю, нужно ли мне использовать это для проекта, который уже сделан на Django, но лишним точно не будет :)
$ pip install -e django/
Сейчас наша home директория выглядит так:
Разворачиваем наш проект и ставим сервер UWSGI
Заходим в папку docker-ci и читаем инструкцию по установке
$ pip install --upgrade pip pip-tools
$ make
Мы скомпилировали и теперь нам надо подключить БД Postgresql и сервер uwsgi.
Настройки БД данного проекта лежат в пути:
~/docker-ci/src/app/conf/db.py
Открываем его и редактируем, как написано в документации
'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
Этого достаточно для бэка. Давайте от имени postgres создадим базу для django, которую прописывали в настройках.
$ psql
=# CREATE DATABASE "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
[uwsgi] -> указываем uwsgi серверу, что это настройки
http-socket -> открываем сокет http
chdir -> директория приложения
wsgi-file -> файл wsgi проекта
master -> мастер процесс
virtualenv -> директория откуда брать либы
запускаем сервер
$ uwsgi uwsgi.ini
Проверим, что у нас по /admin выдает, т.к. это у нас api проект
Что же выводит консоль?
Что в итоге?
- Сделали виртуальное окружение
- Поставили UWSGI сервер
- Настроили postgresql
- Сконфигурировали приложение
- И самое главное - скоммуницировали всё это в одну среду
Что осталось?
Нам нужно все это обернуть в docker и настроить базовый CI.
Осталось совсем немного и тестовое задание будет готово :)