Как перенести django сайт на хостинг от beget
Введение и файлы примера
Это статья является подробной инструкцией о том, как выложить сайт, написанный на django, на сервера хостинг провайдера beget.
Процесс размещения сайта на хостинге от бегет я буду демонстрировать на примере простенького сайта, который я сделал за пару часов.
Вот архив для скачивания. А доменное имя, которое я буду использовать это бесплатный домен который дарится в подарок от этого хостинг провайдера. Вот он timachuduk.bget.ru.
В этой статье подразумевается что вы уже зарегистрировались на beget хостинге и зарегистрировали или перенесли домен.
Как привязать домен к хостингу beget
Что значит привязать домен? Это когда ты присваиваешь определённую директорию к домену. Как это сделать?
-
Выбрать ( или создать ) директорию.
-
В разделе сайтов нажать кнопку создать.
-
Выбрать имеющийся домен
Теперь, когда домен был подключён, можно перейти в терминал и подключиться к серверу.
Подключение к серверу через SSH и установка Python
Установка openssl
Подключаемся к удалённому терминалу сервера.
ssh USERNAME_PLACEHOLDER@USERNAME_PLACEHOLDER.beget.tech
Заходим в докер контейнер.
ssh localhost -p222
И теперь заходим во временную директорию, куда будем скачивать необходимые программы.
cd ~/.beget/tmp/
Если такой директории нет, нужно её создать
mkdir ~/.beget/tmp
И зайти опять
cd ~/.beget/tmp/
Скачиваем архив с последней версией openssl. Этот пакет необходим для работы Python 3.11 и выше.
wget https://www.openssl.org/source/openssl-1.1.1l.tar.gz
Распаковываем архив openssl
tar -xvzf openssl-1.1.1l.tar.gz
Заходим в распакованный архив.
cd openssl-1.1.1l
Сгенерируем файл сборки make
./config --prefix=$HOME/.local --openssldir=$HOME/.local/ssl '-Wl,--enable-new-dtags,-rpath,$(LIBRPATH)'
Скомпилируем и установим программу на сервер
make -j$((`nproc`/4)) && make install
После того как openssl установлен можно перейти к установке python. Важно отметить что python версии 2.7 уже установлен на систему. Но, так как я лично не люблю данную версию, а ещё она сильно устарела и её уже почти никто не использует, мы установим python версии 3.11.0.
Установка Python
Заходим в следующую директорию. Мы всё ещё находимся в докере.
cd ~/.beget/tmp/
Качаем архив с необходимой версией
wget https://www.python.org/ftp/python/3.11.0/Python-3.11.0.tgz
Распаковываем архив
tar -xvzf Python-3.11.0.tgz
Перейдём в распакованную директорию
cd Python-3.11.0
Запускаем скрипт генерации make файла
./configure --prefix=$HOME/.local --with-openssl=$HOME/.local --with-openssl-rpath=auto --enable-optimizations --enable-loadable-sqlite-extensions LDFLAGS="-Wl,-rpath /usr/local/lib"
Компилируем и устанавливаем питон на сервер
make -j$((`nproc`/4)) && make install
Это команда проверки версии питона.
python3 -V
Создание виртуального окружения для работы
Теперь когда у нас есть питон на сервере, можно приступить к созданию виртуального окружения. Что такое виртуальное окружение и зачем мне его вообще использовать? Спросите вы.
Это изолированная среда, со всеми необходимыми библиотеками, программами и скриптами, которые позволяют создавать приложения на python независимо от основной системы на которой это приложение располагается. Отвечу я.
Вернёмся к настройке сервера. Мы всё ещё в докер контейнере.
Заходим в директорию проекта, где будет лежать сайт. Название будет идентичным как у вашего купленого домена.
Возвращаемся в домашнюю директорию
cd ~
Переходим в директорию проекта.
cd timachuduk.beget.tech
Создадим виртуальное окружение.
~/.local/bin/python3.11 -m venv .venv
После создания окружения не забудь его активировать!
source .venv/bin/activate
Чтобы проверить активировано ли окружение выполните команду
which python
Данная команда отобразит путь к указанной команде. Если путь содержит директорию созданного виртуального окружения, мы готовы продолжать. А именно, установим необходимый минимум пакетов.
pip install django==4.1 pillow
Заливаем Django сайт на хостинг
Перенос django проекта на хостинг beget
На локальной машине, то есть на вашем компьютере, cоздайте архив, директории вашего сайта/проекта.
tar -czf HowToPublishYourWebsite_moved.tar.gz HowToPublishYourWebsite
С помощью команды scp переместим архив файлов сайта на сервер
scp HowToPublishYourWebsite_moved.tar.gz USERNAME@HOSTNAME:~/timachuduk.beget.tech/
timachuduk.beget.tech это директория где мы недавно создали виртуальное окружение.
Вернись на удалённый сервер (ты всё ещё в докере ) и переместись к архиву.
cd ~/ timachuduk.beget.tech
Начните новый проект с таким же названием как и тот который вы хотите перенести.
django-admin startproject HowToPublishYourWebsite
Создадим временную директорию
mkdir trans
Теперь разархивируем архив)
tar -xzf HowToPublishYourWebsite_moved.tar.gz -C trans
Надо заметить что я ленивый и заархивировал всё. В том числе и базу данный, и кеш файлы питона. Давай их удалим. Не волнуйся, об переносе базы данных я поговорю отдельно.
rm trans/HowToPublishYourWebsite/db.sqlite3 trans/HowToPublishYourWebsite/manage.py HowToPublishYourWebsite_moved.tar.gz
Теперь перенесём все необходимые файлы в ранее созданную папку проекта HowToPublishYourWebsite
cp -r trans/HowToPublishYourWebsite/* HowToPublishYourWebsite
Удалим временную директорию
rm -r trans
Теперь нужно будет дописать файлы конфигурации, и немного отредактировать файлы нашего сайта.
Настраиваем дополнительные файлы конфигурации
Создай файл passenger_wsgi.py
touch ~/timachuduk.beget.tech/passenger_wsgi.py
Вот что должно быть внутри
import os, sys
sys.path.insert(0, '<полный_путь_до_каталога_с_проектом>')
sys.path.insert(1, '<полный_путь_до_Django>')
os.environ['DJANGO_SETTINGS_MODULE'] = '<название_проекта>.settings'
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
Для примера, вот содержимое моего файла
import os, sys
sys.path.insert(0, '/home/t/timachuduk/timachuduk.beget.tech/HowToPublishYourWebsite')
sys.path.insert(1, '/home/t/timachuduk/timachuduk.beget.tech/.venv/lib/python3.11/site-packages')
os.environ['DJANGO_SETTINGS_MODULE'] = 'HowToPublishYourWebsite.settings'
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
Редактируем файл settings.py. Нужно дописать в ALLOWED_HOSTS твой домен. В моём случае будет timachuduk.beget.tech.
ALLOWED_HOSTS = ['timachuduk.beget.tech', ‘www.timachuduk.beget.tech’]
Ещё если у тебя DEBUG = True, поменяй на False
Создадим файл .htaccess
touch ~/timachuduk.beget.tech/.htaccess
Вот что должно быть внутри
PassengerEnabled On
PassengerPython /home/t/timachuduk/timachuduk.beget.tech/.venv/bin/python
Осталось только создать директорию tmp и файл restart.txt в нём
mkdir ~/timachuduk.beget.tech/tmp; touch ~/timachuduk.beget.tech/tmp/restart.txt
Давай проверим работоспособность данного сайта. Вбей адрес timachuduk.beget.tech (Конечно вместо моего домена подставь свой ). Ты увидишь следующее если всё работает.
Как перезагрузить сайт на Django если внёс изменения на нём
Допустим ты изменил пару своих шаблонов и хочешь увидеть как они выглядят и работают ли вообще. Если ничего не делать то сервера бегета обновятся примерно через 4 — 12 часов. Не очень, правда .
Чтобы изменения вступили в силу сразу, нужно будет пересоздать один файл. Вот команда:
touch ~/timachuduk.beget.tech/tmp/restart.txt
Только не забудь подставить свою директорию, где у тебя располагается сайт.
Как перенести базу данных
Я создал небольшую модель и страницу на замену главной. Чтобы продемонстрировать подключение базы данных.
Для начала нужно будет раскомментировать несколько путей.
В файле urls.py что в директории HowToPublishYourWebsite раскоментируйте путь до приложения Main
path(‘’, include(‘Main.urls’)),
Перезагрузите сайт(пересоздайте файл restart.txt) . И вы увидите что-то вроде этого.
Не переживай, всё нормально. Нужно всего лишь перенести базу данных с локальной машины на сервер. Для этого на хостинге beget, то есть на сайте, создайте базу данных.
Запомните или запишите пароль и имя базы данных. После этого откройте файл settings.py
И отредактируйте его вот так.
DATABASES = {
‘default’ : {
‘ENGINE’: ‘django.db.backends.mysql’,
‘NAME’: ‘NAME_OF_DATABASE’,
‘USER’: ‘NAME_OF_DATABASE’,
‘PASSWORD’: ‘YOUR_PASSWORD’,
‘HOST’: ‘localhost’,
‘PORT’: 3306,
}
}
Где вместо NAME_OF_DATABASE название вашей базы данных.
Где вместо YOUR_PASSWORD пароль от вашей базы данных.
Теперь, когда база данных создана и настроена, нужно будет создать миграции базы данных. Заходим в докер, активируем окружение, создаём миграции.
ssh localhost -p 222
cd ~/timachuduk.beget.tech/
source .venv/bin/activate/
cd HowToPublishYourWebsite
./manage.py migrate
База данных создана и готова к заполнению и переносу. Если обновите сайт то получите что-то вроде этого. Не впечатляет правда, но всё работает и функционирует, нужно только перенести базу данных, то есть заполнить твою пустую базу той базой данных что располагается в вашем проекте на локальной машине.
На вашей локальной машине, где у вас всё ещё осталась база данных. Выполните следующую команду.
./manage.py dumpdata --exclude auth.permission --exclude contenttypes > data.json
Переместим дамп на сервер.
scp data.json timachuduk@timachuduk.beget.tech:~/timachuduk.beget.tech/HowToPublishYourWebsite/
На сервере выполнить следующую команду.
./manage.py loaddata data.json
И вуаля, теперь база данных перенесена и полностью работает. Но пути до медиа файлов всё ещё не настроены и поэтому картинки непрогружаются. Об этом смотри ниже.
Как автоматизировать процесс переноса медиа файлов
После переноса базы данных ты наверняка заметил, если включишь консоль в браузере, что он (браузер) не может найти изображения наших постов. А всё потому что нам нужно переместить папку media в уже существующую директорию public_html.
Похожая ситуация и со статическими файлами. Они тоже должны быть в public_html. И разумеется не вручную же это делать. Чтобы автоматизировать процесс надо:
-
Открой файл settings.py твоего сайта и модифицируй вот эти переменные так. (то есть добавь public перед media и static)
MEDIA_ROOT = os.path.join(BASE_DIR, 'public/media') STATIC_ROOT = os.path.join(BASE_DIR, 'public/static')
-
Создай символическую ссылку public. Она создаётся так:
cd ~/timachuduk.beget.tech/public_html
ln -s ../public_html ../HowToPublishYourWebsite/public
Теперь все новые статические файлы и медиа файлы будут перенаправляться в public_html. Только еще не забудь переместить старые медиа файлы и собрать статические файлы.
По итогу финальная страница будет выглядеть вот так. С работающей базой данных и правильными путями для медиа файлов.
Надеюсь данная статья была полезна и достаточна информативна. И вы смогли перенести свой django проект на боевой сервер.
0