Linux: Перенос Django-проекта на другой сервер

Столкнулся с потрясающей задачей: после успешной сдачи веб-проекта на Django, компания разработчик(digitalmust или Digital Мастерская, как она себя величает) скинула мне архив с контентом сайта. Сами они его перенести не смогли, как они признались - не хватает квалифицированного персонала. Наломав кучу дров и потратив много времени, написал маленькую инструкцию(вдруг пригодится). Понеслось!
Даже пытаться разворачивать не известную мне среду я не стал на боевом VPS и принялся осваивать "изолированную" среду virtualenv на тестовой машине. Кстати, слово "изолированную" я неспроста взял в кавычки. Ибо среда на самом деле псевдоизолированна. Но сегодня не об этом. Установим репозиторий EPEL, если не сделали этого раньше:

yum install epel-release -y

Установим Midnight Commander, который является лучшим shell'ом, а главное предоставит возможность работать с прекрасным редактором mcedit:

yum install mc -y

Установим питона(пайтона, если Вам угодно), СУБД PostgreSQL, pip и вебку для интуитивно понятной, а главное визуальной работы с СУБД(не тракторист!):

yum install python-pip python-devel postgresql-server postgresql-devel postgresql-contrib gc phpPgAdmin mod_wsgi -y

Приступим к базовой настройке СУБД для запуска. Сюда вошли: инициализация базы и смена метода авторизации пользователей к базам:

postgresql-setup initdb && cp /var/lib/pgsql/data/pg_hba.conf /var/lib/pgsql/data/pg_hba.conf.old; mcedit /var/lib/pgsql/data/pg_hba.conf

Все peer меняем на md5. Сохраняем файл(F2) и выходим.
Перезапускаем службу СУБД и сообщаем о необходимости автостарта при загрузке:

systemctl restart postgresql; systemctl enable postgresql

Войдем в консольный режим управления СУБД:

su postgres; psql

Создаем Базу под проект:

CREATE DATABASE myNameProjectDB;

Создаем пользователя userForProject, которым будем цепляться к базе из проекта:

CREATE USER userForProject WITH PASSWORD 'password';

И конечно же наделим правами нового пользователя к нашей базе:

GRANT ALL PRIVILEGES ON DATABASE myNameProjectDB TO userForProject;

Завершаем локальный сеанс работы с базой и выходим из под пользователя postgres:
\q
exit
Далее, необходимо импортировать БД проекта из дампа базы, мило предоставленной компанией разработчиком сайта, с названием dump.sql:

cat dump.sql | psql -h localhost -U userForProject myNameProjectDB

Установим псевдоизолированную среду virtualenv через pip:

pip install virtualenv

Дальше работаем в директории, которую Вы выделили под проект. Пускай она зовется myNameProject и ее путь /var/www/html/myNameProject.ru:

cd /var/www/html/myNameProject.ru

При создании виртуального окружения очень рекомендую использовать имя, данное проекту разработчиками:

python -m virtualenv myNameProject

Активируем среду:

source myNameProject/bin/activate

Устанавливаем все необходимые для проекта модули. В моем случае, разработчиком был предоставлен файл автоответа и я обратился к нему:

pip install -r fileName.txt

Если файла-автоответа у вас нет, то лучше уточнить у "создателя" какие версии фрейморка и компонентов были использованы в проекте. С проектами на Django не все так удачно, как у проектов на .Net, к примеру. Если в Вашей операционной системе уже есть версия .NET 4.6, а приложение использует 4.2 - запуск пройдет без ошибок и предупреждений. А в случае использования приложением .NET 4.7 - операционная система нежно и удивительно попросит её установку. Здесь же проект написанный под Django 1.10.7 может легко не запуститься на Django 1.11.5! Потому что разработчик фрейморка решил "отпилить" используемый в проекте компонент из новой версии. И всё!
Итак для установки конкретных версий софта pip'ом используем оператор равенства(==):

pip install django==1.9.5

Бывает так, что проектом используются пакеты для "особой" работы с векторными и растровыми графическими файлами. Поэтому можно установить PIL-форк, как самый распространенный Pillow:

yum install libtiff-devel libjpeg-devel libzip-devel freetype-devel lcms2-devel libwebp-devel tcl-devel tk-devel -y; pip install Pillow; service httpd restart

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

django-admin startproject myNameProject .

Более опытные специалисты конечно же будут использовать git, а мы: копируем(предоставленный разработчиком) контент с заменой файлов. И меняем конфигурационный файл движка для подключения к БД:

mcedit myNameProject/settings.py

Предоставим права к файлам проекта(грубое и безграмотное решение!):

chmod -r 755 *

Проверяем и начинаем миграцию:

./manage.py makemigrations
./manage.py migrate

Если вместо No changes detected и/или No migrations to apply Вам встретились строки: "ImportError: No module named requests(six, tkinter, PIL и т.д.)", то значит не установлены все необходимые модули для работы проекта. И pip install имяОтсутствующегоМодуля Вам поможет! Запускаем проект с портом 8000:

python ./manage.py runserver 0.0.0.0:8000

Если браузер открыл проект по IP-адресу Вашего сервера: http://ipAddr:8000 - можно продолжать! Иначе чтение лога ошибки. Уходим из виртуальной среды:

deactivate

Подготовим конфигурационный файл для нашего проекта под индейца. Учитывая конечно, что у нас Django-проект не единственный житель VPS, настройка пойдет именно VirtuaHost:

mcedit /etc/httpd/conf.d/myNameProject.conf

Содержимое:

<virtualhost mynameproject.ru:80="">
ServerName myNameProject.ru
ServerAlias www.myNameProject.ru
DocumentRoot /var/www/html/myNameProject.ru
ErrorLog /var/log/httpd/myNameProject.ru-error.log
CustomLog /var/log/httpd/myNameProject.ru-access.log common
WSGIScriptAlias / /var/www/html/myNameProject.ru/myNameProject/wsgi.py
WSGIDaemonProcess mysite python-path=/var/www/html/myNameProject.ru:/var/www/html/myNameProject.ru/lib/python2.7/site-packages
WSGIProcessGroup myNameProject
Alias /media/ /var/www/html/myNameProject.ru/media/
Alias /static/ /var/www/html/myNameProject.ru/myNameProject/static/
Alias /robots.txt /var/www/html/myNameProject.ru/robots.txt
<directory var="" www="" html="" mynameproject.ru="" mynameproject="" static="">
Require all granted
</directory>
<directory var="" www="" html="" mynameproject.ru="" media="">
Require all granted
</directory>
<directory var="" www="" html="" mynameproject.ru="" mynameproject="">
<files wsgi.py="">
Require all granted
</files>
</directory>
</virtualhost>

Перезапускаем службу индейца:

systemctl restart httpd

Сделать ошибку и опечатку при написании конфигурационного файла Апачи слишком просто! Поэтому не редки случаи, когда Апач может не запуститься. Читаем внимательно информацию и исправляем:

journalctl -xe

Вот и всё!

Posted in Linux on Oct 03, 2017