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 не все так удачно, как у проектов на dotNet, к примеру. Если в Вашей операционной системе уже есть версия .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
Содержимое:

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

Require all granted


Require all granted



Require all granted



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

Спасибо! Всё!

Запись опубликована в рубрике Заметки