# Перенос Django-проектов

Эта инструкция описывает перенос пользовательских сайтов, написанных на Django, в новый хостинг-контейнер. Подробнее о хостинг-контейнерах (opens new window) и новой программной платформе (opens new window) можно прочитать в наших новостях.

Процесс переноса Django-проекта состоит из следующих этапов:

# Подготовка нового хостинг-контейнера

Шаг 1. В панели управления аккаунтом выберите раздел «Хостинг» и нажмите «Создать новый хостинг»:

«django_move»

Все хостинг-контейнеры, которые создаются после 28 апреля 2022 года, автоматически размещаются на новой программной платформе, никаких дополнительных опций выбирать не нужно.

Шаг 2. В разделе Услуги подключите поддержку веб-приложений, MySQL и SSH:

«django_move»

Для первого подключения к хостингу по SSH нужно задать пароль пользователя. Это можно сделать в разделе Управление — Настройки SSH:

«django_move»

Здесь же можно включить ограничение SSH-доступа по IP-адресу и добавить IP-адрес вашего компьютера в список разрешённых для подключения.

Примечание:

На новых аккаунтах не нужно подключать услугу SSH-доступ. Консоль доступна из панели УправлениеКонсоль.

Шаг 3. В разделе УправлениеУправление MySQL создайте новую базу данных, которая будет работать с Django-проектом.

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

«django_move»

После настройки хостинг-контейнера подготовьте сам проект к переносу.

# Подготовка проекта к переносу

Чтобы подготовить проект к переносу, нужно:

  • проверить версию Python, на которой работает проект;
  • создать список зависимостей проекта;
  • создать дамп базы данных проекта.

# Проверка версии Python

Подключитесь по SSH к хостинг-контейнеру, на котором расположен проект.

Активируйте виртуальное окружение, в котором работает Django-проект:

source ./path/to/venv/bin/activate

Здесь /path/to/venv/ — путь к директории, в которой расположено виртуальное окружение.

После активации окружения проверьте версию Python:

python --version

#Output
Python 2.7.18

Эта версия понадобится вам при создании виртуального окружения в новом хостинг-контейнере.

# Список зависимостей проекта

Если у вас ещё нет файла со списком зависимостей проекта, создайте его.

Перейдите в папку с Django-проектом:

cd ~/django-project/

Затем выполните команду:

pip freeze > requirement.txt

Эта команда создаст файл requirements.txt с названиями и версиями всех модулей, установленных в виртуальное окружение.

# Создание дампа базы данных

Примечание

Создание и перенос дампа базы данных рекомендуем выполнять в самую последнюю очередь, перед перенаправлением домена. Во время переноса все обращения на сайт, при которых происходят изменения в базе данных, записываются на старом аккаунте. Чтобы избежать потери этих данных, дамп базы данных нужно сделать в конце.

Создайте дамп вашей базы данных, которая используется с проектом:

Создание дампа базы данных из командной строки

Чтобы создать дамп базы данных при помощи SSH-подключения, воспользуйтесь командой:

mysqldump --opt -Q -uLogin -pPassword db_name  > dump_file_name.sql  
  • Login — имя пользователя базы;
  • Password — пароль пользователя для подключения к базе;
  • db_name — имя базы данных, для которой создаётся дамп;
  • dump_file_name — имя файла, который будет содержать дамп базы данных.

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

Создание дампа базы данных с помощью phpMyAdmin

phpMyAdmin — веб-интерфейс для работы с базами данных.

Чтобы войти в панель работы с phpMyAdmin, зайдите в раздел УправлениеУправление MySQL и нажмите кнопку Войти в разделе phpMyAdmin:

«django_move»

В phpMyAdmin в левой части окна выберите базу, дамп которой будете создавать, перейдите на вкладку Экспорт и нажмите Вперёд:

«django_move»

Дамп выбранной базы скачается на вашу локальную машину.

После того как вы проверили версию Python, создали список зависимостей, подключённых к проекту, и дамп базы данных, перенесите доменное имя с одного хостинг-контейнера на другой.

# Перенос доменного имени

Примечание

  • Чтобы протестировать работу сайта во время переноса, рекомендуем использовать технический адрес. Перенаправляйте основной домен только после того, как убедитесь, что сайт работает на новом аккаунте без ошибок.

  • Для перенаправления технического адреса зайдите на новый аккаунт и в разделе УправлениеОбщие настройки выберите папку, куда планируете перенести сайт. В блоке «Интерпретатор» для технического адреса выберите нужную версию Python.

Для переноса основного домена откройте панель управления Хостингом и зайдите в раздел ДоменыУправление доменами. В списке доменов выберите тот, на котором работает ваш Django-проект.

В открывшемся окне с настройками домена выберите новый хостинг-контейнер, чтобы привязать к нему доменное имя.

«django_move»

# Перенос проекта

Перенос проекта — копирование всех файлов проекта из одного хостинг-контейнера в другой.

Располагать файлы проекта нужно в папке domains в подпапке с доменным именем, на котором будет работать проект (например: ~/domains/example.com).

Примечание

Если на предыдущем шаге вы успешно перенесли доменное имя, то в новом хостинг-контейнере уже будет создана папка с нужным именем домена.

Для переноса файлов из одного хостинг-контейнера в другой есть несколько способов.

# Перенос проекта из командной строки (команда rsync)

Команда rsync позволит скопировать все файлы проекта из старого хостинг-контейнера в новый.

Подключитесь по SSH к новому хостинг-контейнеру, который вы создали на первом шаге, и в командной строке введите:

rsync -av username@host_name:Source Destination

Здесь:

  • username@host_name — имя пользователя и имя хоста для SSH-подключения к хостинг-контейнеру, на котором расположен проект;
  • Source — путь к папке с проектом в старом хостинг-контейнере (например: ~/django_projects/app1);
  • Destination — путь к папке, в которую будете помещать проект (например: ~/domains/example.com).

После установки соединения нужно будет ввести пароль для SSH-подключения к указанному хосту. Далее начнётся копирование данных.

По завершении копирования в консоли будет выведена информация о том, сколько файлов и с какой скоростью было скопировано:

#Output
…
sent 339,834 bytes  received 2,034,714,717 bytes  23,801,807.61 bytes/sec
total size is 2,033,094,800  speedup is 1.00

# Перенос проекта по SFTP

SFTP — безопасный протокол передачи данных.

При использовании SFTP вы подключаетесь к хостинг-контейнеру, на котором расположен ваш проект, скачиваете оттуда файлы проекта на локальную машину. После этого вам нужно подключиться к новому хостинг-контейнеру и загрузить их туда.

Про подключение к хостингу по SFTP для загрузки файлов Django-проекта можно прочитать в отдельной статье.

# Копирование файлов проекта с помощью файлового менеджера

Создать архив с файлами проекта и скачать его на локальную машину, чтобы затем загрузить в новый хостинг-контейнер, можно с помощью встроенного файлового менеджера Джино:

  • выберите папку с файлами проекта в разделе УправлениеФайловый менеджер и заархивируйте её;

  • скачайте архив на локальную машину;

  • переключитесь в новый хостинг-контейнер;

  • откройте файловый менеджер и загрузите скачанный архив.

Примечание

Этот вариант не подходит для больших Django-проектов. Если у вас объёмный сайт, воспользуйтесь SFTP-подключением или командой rsync.

# Запуск проекта

Чтобы запустить проект в новом хостинг-контейнере, нужно:

  • разместить все его файлы в папке ~/domains/ в подпапке с именем домена;
  • создать виртуальное окружение для работы проекта;
  • установить все необходимые зависимости из файла requirements.txt;
  • загрузить в созданную для проекта базу данных дамп базы с предыдущего контейнера;
  • подключить проект к новой базе;
  • пересобрать статическое наполнение проекта;
  • создать файл passenger_wsgi.py, который будет запускать проект.

# Размещение файлов

Для запуска Django-проекта на новом хостинге все файлы проекта должны располагаться в папке domains в подпапке с именем домена, на котором будет работать проект (например: ~/domains/example.com).

Вы можете сделать это любым удобным для вас способом.

# Создание виртуального окружения

Cоздайте новое виртуальное окружение для работы вашего проекта:

/opt/alt/python37/bin/virtualenv --python /opt/alt/python310/bin/python3 venv310

В данном случае приведена команда создания виртуального окружения для Python 3.10.

Если ваш проект работает на другой версии Python (вы проверили это на первом шаге), создайте виртуальное окружение именно для неё. Список поддерживаемых версий Python и адреса их интерпретаторов представлены в разделе УправлениеТехническая информация.

Примечание:

Команда для создания виртуального окружения состоит из двух частей:

  1. Первая часть — /opt/alt/python37/bin/virtualenv— запускает утилиту virtualenv, отвечающую за создание нового виртуального окружения;
  2. Вторая часть — --python /opt/alt/python310/bin/python3 venv310 — указывает, где расположен интерпретатор Python, для которого нужно создать виртуальное окружение.

Обратите внимание, что при создании виртуального окружения для определённой версии Python вы изменяете только вторую часть команды. Первая остаётся в прежнем виде.

# Установка зависимостей

Активируйте виртуальное окружение:

source ./venv310/bin/activate

Перейдите в папку, где расположен файл requirements.txt вашего проекта:

cd domains/example.com

Запустите установку всех необходимых зависимостей:

pip install -r requirements.txt

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

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

pip freeze

#Output
certifi==2021.10.8
chardet==4.0.0
Django==1.11.2
django-ckeditor==5.2.2
django-mptt==0.8.7
django-suit==2.0a1
idna==2.10
mysqlclient==1.4.6
pytz==2017.2
requests==2.27.1
urllib3==1.26.9

# Загрузка дампа базы данных

Загрузить дамп базы данных можно через SSH командой mysqldump или через веб-интерфейс MySQL — phpMyAdmin.

Загрузка дампа базы данных из командной строки

Чтобы загрузить дамп базы данных, введите в консоли команду:

mysqldump --opt -Q -uLogin -pPassword db_name  < dump_file_name.sql

Здесь Login, Password и db_name — параметры для доступа к базе данных, в которую загружается дамп. Это база данных, созданная на первом шаге инструкции.

Загрузка дампа базы данных с помощью phpMyAdmin

Перейдите в раздел УправлениеУправление MySQL и зайдите в phpMyAdmin. Выберите созданную для приложения базу, перейдите на вкладку «Импорт» и выберите файл с дампом базы данных, который вы создали на предыдущем шаге:

«django_move»

После загрузки вы увидите сообщение «Импорт успешно завершён, выполнено N запросов (db_name)».

# Подключение к базе

Чтобы подключить проект к новой базе данных, в файле settings.py проекта в блоке DATABASES замените параметры NAME, USER и PASSWORD на актуальные.

# Сбор статики

Всё статическое содержимое проекта (сайта) должно располагаться в подпапке public_html (~/domains/example.com/public_html/static).

В файле settings.py в строке STATIC_ROOT укажите актуальный путь к папке со статикой (например, ~/domains/example.com/public_html/static) и выполните команду collectstatic в консоли:

python manage.py collectstatic

# Запуск приложения. Файл passenger_wsgi.py

Для запуска Python-кода в новом хостинг-контейнере вам понадобится файл passenger_wsgi.py. Этот файл описывает взаимодействие веб-сервера с проектом Django. Он должен быть расположен в папке с доменным именем, на котором запускается проект, непосредственно рядом с файлами самого проекта (~/domains/example.com).

Содержимое файла passenger_wsgi.py должно быть следующим:

import sys, os
INTERP = os.path.expanduser("~/venv310/bin/python3")

if sys.executable != INTERP: os.execl(INTERP, INTERP, *sys.argv)

from app_name.wsgi import application

Здесь мы указываем путь к виртуальному окружению, в котором запускается проект (~/venv310/bin/python3), и указываем wsgi-файл проекта, который запускает сам проект (app_name.wsgi).

В данном случае вам нужно заменить путь к виртуальному окружению на актуальный и вместо app_name указать имя вашего проекта.

Итоговая структура файлов и папок вашего проекта в новом хостинг-контейнере:

«django_move»

После создания файла passenger_wsgi.py перейдите в раздел УправлениеНастройки веб-сервера, выберите нужную версию интерпретатора для доменного имени и перезагрузите веб-сервер.

«django_move»

После этого можно проверять работу сайта.

# Вопросы и ответы

Ошибка установки модуля MySQL-Python

Иногда при установке зависимостей проекта возникает ошибка с установкой модуля MySQL-Python.

В этом случае нужно открыть файл requirements.txt, найти строчку с указанием этого пакета и удалить её.

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

pip install mysqlclient

После этого можно продолжить работу по запуску проекта, двигаясь дальше по шагам инструкции, — замена одного клиента на другой никак не скажется на работе самого проекта и не потребует дополнительных настроек.