Начинаем развертывание Django-сайта на хостинге

Файлы проекта: cmds_ssh_beget

Предположим, что мы завершили начальную разработку сайта на тестовом веб-сервере и решили предъявить его миру, то есть, выложить на боевом веб-сервере. Часто для этого арендуется хостинг или сервер целиком (иногда его части – технология VPN) где и планируется расположить проект с файлами и БД. У каждого хостинг-провайдера используется свое оборудование и программное обеспечение, поэтому конкретные шаги по установке проекта на разных хостингах будут отличаться. Но общий принцип похож и его я буду демонстрировать на примере довольно популярного хостера – Beget (это не реклама, мои сайты расположены на других хостингах, так сложилось исторически).

Возможно, некоторые из вас уже связаны с этим хостингом, учитывая его популярность. Это была главная причина выбора Beget в качестве примера. Далее, я буду показывать все так, как выглядит на момент записи этого видео. Возможно, со временем интерфейс и даже некоторые шаги изменятся, но, думаю, общий принцип сохранится. Поэтому будьте внимательны и не повторяйте просто так, бездумно, все, что я показываю в этом и последующих видео.

Итак, после простой регистрации в сервисе, с которым, я думаю, вы разберетесь самостоятельно, мы выбираем один из тарифных планов (я выбрал Blog с месячным тестовым периодом, вполне достаточным, чтобы развернуть сайт и записать эти занятия). Админ-панель выглядит следующим образом:

Здесь нужно открыть вкладку FTP и активировать SSH-доступ, так как он нам в дальнейшем пригодится:

Затем, перейдем на вкладку «Управление сайтами» и здесь у нас уже должен быть тестовый домен 3-го уровня от Beget:

Обратите внимание, с этим доменом связан конкретный каталог, где предполагается хранить файлы сайта. В частности, именно в нем мы будем располагать виртуальное окружение, и устанавливать нужную версию Python и Django, а также другие необходимые зависимости (библиотеки).

Конечно, некоторые из вас могут внимательно изучить админку от Beget и увидеть раздел CMS, где, в частности, имеется и Django:

Но я не рекомендую его устанавливать в автоматическом режиме, так как здесь используется далеко не последняя версия, да и версия языка Python также оставляет желать лучшего. Поэтому, мы будем делать все вручную и с использованием виртуального окружения. Благо, хостеры заботятся об этом и выкладывают подробную документацию об этапах установки того или иного фреймворка. В частности, на странице:

https://beget.com/ru/kb/how-to/web-apps/python#ustanovka-i-nastroyka-django

подробно описываются шаги по развертыванию фреймворка Django. Возможно, вас несколько удивит объем приведенной информации и множества шагов, которые необходимо выполнить для установки Django. Но я для того и записываю видео, чтобы постараться все «разложить по полочкам». Конечно, так, насколько я сам понимаю этот процесс.

Для взаимодействия с хостингом на уровне команд нам потребуется специальная программа SSH-клиент PuTTy. Подробно о ней написано здесь:

https://beget.com/ru/kb/how-to/web-apps/obshhie-svedeniya-po-ustanovke-prilozhenij-virtualnoe-okruzhenie-docker#

и используется для ОС Windows (полагаю, что большинство из вас работают именно под этой системой). Скачиваем файл с этой программой (если ее еще нет у вас, или версия устарела) и запускаем. У нас появится следующее окно:

В поле «Host Name (or IP address)» вводим SSH-адрес хостинга и нажимаем на кнопку «Open». Появится консольное окно, где нужно ввести логин и пароль, полученный при регистрации:

Все, теперь мы готовы приступить к установке Django на тестовый сайт sbalak.beget.tech. Что мы будем конкретно делать? Процесс развертывания я для себя определил следующим образом:

  • установить версию языка Python 3.8.3 (такую же, что и в тестовом проекте);
  • настроить виртуальное окружение с именем djangoenv;
  • установить в виртуальное окружение фреймворк Django 3.1.5 (тот же, что и в тестовом проекте);
  • выполнить настройку зависимостей для активации Django для сайта sbalak.beget.tech;
  • создать БД MySQL, связать ее с приложением и перенести все таблицы из нашего проекта.

В принципе, все эти шаги будем выполнять строго по предоставленной хостером документации (кроме последнего шага). Первым делом нужно войти, в так называемый Docker, чтобы иметь возможность запускать интерпретатор Python и устанавливать необходимые пакеты. Для этого выполним команду:

ssh localhost -p222

и еще раз введем пароль. (Список всех команд будет приведен в отдельном файле со ссылкой на github).

Далее, нам понадобится раздел «Локальная установка Python», где подробно приведена установка интерпретатора выбранной версии. Мне нужна версия 3.8.3. Здесь в описании используется каталог .beget/tmp, которого у меня нет. Создать можно командой:

mkdir -p ~/.beget/tmp

а, затем, перейти в него:

cd ~/.beget/tmp/

Далее, по документации, для сборки интерпретатора Python потребуется библиотека ffi, которую нужно сначала скачать командой:

wget ftp://sourceware.org/pub/libffi/libffi-3.2.1.tar.gz

Распаковать:

tar -xf libffi-3.2.1.tar.gz && cd libffi-3.2.1

Сконфигурировать:

./configure --prefix $HOME/.local LDFLAGS="-L/usr/local/lib"

и собрать:

make -j33 && make install

После этого, в директории с кодом libffi-3.2.1/x86_64-unknown-linux-gnu/include появятся два файла: ffi.h и ffitarget.h. Их нужно скопировать в каталог ~/.local/include. Переходим в корневой каталог

cd ~

создаем нужные каталоги:

mkdir -p ~/.local/include

делаем для этой папки общий доступ и выполняем копирование:

cp x86_64-unknown-linux-gnu/include/ffi.h ~/.local/include/
cp x86_64-unknown-linux-gnu/include/ffitarget.h ~/.local/include/

Далее, нам нужно скачать и собрать Python 3.8.3. Снова переходим в каталог:

cd ~/.beget/tmp

и скачиваем архив с версией 3.8.3:

wget https://www.python.org/ftp/python/3.8.3/Python-3.8.3.tgz

Распаковываем архив и переходим в созданный каталог:

tar -xf Python-3.8.3.tgz && cd Python-3.8.3

Настраиваем все необходимые зависимости:

./cnfigure --prefix=$HOME/.local LDFLAGS="-L/usr/local/lib"

и запускаем процесс компиляции:

make -j33 && make install

Проверить корректность установки можно командой:

~/.local/bin/python3.8 –V

Настройка окружения virtualenv

Все, язык Python нужной версии 3.8.3 установлен и следующим шагом нам нужно создать виртуальное окружение. Это окружение будем создавать в каталоге sbalak.beget.tech, поэтому вначале выполним команду:

cd ~/sbalak.beget.tech

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

~/.local/bin/pip3.8 install virtualenv
~/.local/bin/python3.8 -m virtualenv djangoenv

У нас появится папка djangoenv в каталоге sbalak.beget.tech. Виртуальное окружение с именем djangoenv создано. Активируем его командой:

source djangoenv/bin/activate

А командой

which python

можно проверить текущую работающую версию языка Python. Далее, мы установим пакет Django в это виртуальное окружение:

pip install django==3.1.5

(Здесь дополнительно указана версия пакета 3.1.5, так как я этого хочу, если вы устанавливаете последнюю версию, то просто напишите django).

В принципе, фреймворк Django установлен и должен быть готов к работе. Создадим с его помощью проект coolsite и проверим как он будет работать. Вначале выполним знакомую нам команду:

django-admin.py startproject coolsite

Далее, в каталог sbalak.beget.tech нужно скопировать файл с именем passenger_wsgi.py и следующим содержимым:

# -*- coding: utf-8 -*-
 
import os, sys
sys.path.insert(0, '/home/s/sbalak/sbalak.beget.tech/coolsite')
sys.path.insert(1, '/home/s/sbalak/sbalak.beget.tech/ djangoenv/lib/python3.8/site-packages')
os.environ['DJANGO_SETTINGS_MODULE'] = 'coolsite.settings'
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

Здесь первый путь – путь к проекту, а второй – к виртуальному окружению. И создать файл .htaccess с содержимым:

PassengerEnabled On
PassengerPython /home/s/sbalak/.local/bin/python3.8
#PassengerPython /home/s/sbalak/sbalak.beget.tech/venv/bin/python3.8

Кроме того, в пакете конфигурации в файле settings.py нужно указать разрешенный хост для работы фреймворка Django:

ALLOWED_HOSTS = ['sbalak.beget.tech', 'www.sbalak.beget.tech']

Не забываем сделать общий доступ к папке ~/.local, иначе сайт работать не будет! И в заключении в каталоге сайта sbalak.beget.tech создать подкаталог tmp и разместить в нем пустой файл restart.txt:

mkdir tmp; touch tmp/restart.txt

Все, теперь, обращаясь к странице

http://sbalak.beget.tech

должно появляться окно с тестовой страницей фреймворка Django:

Вот, эта несколько запутанная и длинная последовательность шагов по установке интерпретатора языка Python, Django и связывания всего этого с конкретным сайтом. Опять же, запоминать все это не нужно. Можно сказать, что это справочная информация, которая обычно приведена в документации по каждому хостингу. Мы лишь последовательно следовали указанным шагам и получили ожидаемый результат. Но это был лишь первый этап по развертыванию нашего проекта. На следующем занятии мы перенесем наш сайт, создадим связи с БД и окончательно завершим процесс переноса проекта с тестового веб-сервера на реальный, боевой.

Видео по теме