Как перенести django сайт на хостинг от beget

Введение и файлы примера

Это статья является подробной инструкцией о том, как выложить сайт, написанный на django, на сервера хостинг провайдера beget.
Процесс размещения сайта на хостинге от бегет я буду демонстрировать на примере простенького сайта, который я сделал за пару часов.
Вот архив для скачивания. А доменное имя, которое я буду использовать это бесплатный домен который дарится в подарок от этого хостинг провайдера. Вот он timachuduk.bget.ru.
В этой статье подразумевается что вы уже зарегистрировались на beget хостинге и зарегистрировали или перенесли домен.

Как привязать домен к хостингу beget

Что значит привязать домен? Это когда ты присваиваешь определённую директорию к домену. Как это сделать?
  • Выбрать ( или создать ) директорию.
    сайт beget выбираю домен
  • В разделе сайтов нажать кнопку создать.
    сайт 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 независимо от основной системы на которой это приложение располагается. Отвечу я.
Шеврон Ну а для чего тебе это делать? Если у тебя есть несколько приложений и они требуют разные версии пакетов или версий 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
Шеврон Пакет pillow необязателен, но он необходим чтобы поле модели ImageField работало. А так как изображения используются повсеместно, то я решил что вам нужно это знать.

Заливаем 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.
Шеврон Дописывать вторую версию твоего домена необязательно, но в будущем google будет ругаться и это скажется на ранжировании твоего сайта, так что лучше добавь вторую версию домена с www

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, ошибка сервера
Не переживай, всё нормально. Нужно всего лишь перенести базу данных с локальной машины на сервер. Для этого на хостинге beget, то есть на сайте, создайте базу данных.
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
	
База данных создана и готова к заполнению и переносу. Если обновите сайт то получите что-то вроде этого. Не впечатляет правда, но всё работает и функционирует, нужно только перенести базу данных, то есть заполнить твою пустую базу той базой данных что располагается в вашем проекте на локальной машине.
Пустая страница, без ошибок, beget, django
На вашей локальной машине, где у вас всё ещё осталась база данных. Выполните следующую команду.

./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
	
И вуаля, теперь база данных перенесена и полностью работает. Но пути до медиа файлов всё ещё не настроены и поэтому картинки непрогружаются. Об этом смотри ниже.
Страница с выводом из базы данных, без ошибок, beget, django

Как автоматизировать процесс переноса медиа файлов

После переноса базы данных ты наверняка заметил, если включишь консоль в браузере, что он (браузер) не может найти изображения наших постов. А всё потому что нам нужно переместить папку media в уже существующую директорию public_html.
Шеврон Конечно твоя папка не обязательно должна носить имя media, можешь дать ей любое другое имя в settings.py, просто я так привык.
Похожая ситуация и со статическими файлами. Они тоже должны быть в 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. Только еще не забудь переместить старые медиа файлы и собрать статические файлы.
По итогу финальная страница будет выглядеть вот так. С работающей базой данных и правильными путями для медиа файлов.
База данных полностью работает, на beget с django
Надеюсь данная статья была полезна и достаточна информативна. И вы смогли перенести свой django проект на боевой сервер.

сердце
0
3 соединённые точки
0