3 горизонтальные линии, бургер
3 горизонтальные линии, бургер
3 горизонтальные линии, бургер
3 горизонтальные линии, бургер

3 горизонтальные линии, бургер
Удалить все
ЗАГРУЗКА ...

Содержание



    Как развернуть django сайт на хостинг(или VPS) от reg.ru. Полная инструкция

    Часы
    16.03.2025
    /
    Часы
    02.10.2025
    /
    Часы
    22 минут
    Глазик
    4162
    Сердечки
    0
    Соединённые точки
    0
    Соединённые точки
    2
    Соединённые точки
    0

    Введение или про что будет эта статья

    В этой статье я расскажу и покажу, как можно разместить сайта на серверах от reg.ru (хостинг-провайдер). Данный провайдер предоставляет широкий выбор платформ разработки/CMS, которые используются для создания сайта. Но в этой статье я расскажу только о том, как развернуть сайт написанный на Django, ибо разбираюсь в этом.
    Кроме предоставления обычного хостинга, reg предоставляет такую услугу как VPS.
    VPS(Virtual Private Server) - такой сервер размещён вместе с другими на одном железе(компьютере), от сюда и virtual server, так же доступ к такому серверу есть только у его владельца, от сюда и private.
    Так вот, на reg.ru , можно разместить сайт двумя способами. Первый - простой, но ограниченный, второй - сложный, но и от того куда более интересный. Первый заключается в том, чтобы использовать готовое решение от самого хостинга и немного поколдовать в докере. Суть второго способа, заключается в том, чтобы создать свой VPS и настроить сервер в ручную.
    Я продемонстрирую оба, объясню в чём особенности и нюансы обоих, и почему лучше, по моему мнению, именно VPS.

    Особенности данной статьи

    Для демонстрации я буду использовать специально сделанное для этого django-приложение. Это приложение было специально сделано со всеми фишками, которые возможно потребуются сайту в будущем:
    1. работа и настройка с БД
    2. получение статики
    3. загрузка на сайт различных медиа
    4. переводы
    5. тесты
    Я постоянно работаю над этим приложением, ибо собираюсь тестировать его и на других хостингах (не только reg.ru). В конце концов, я вижу его как один, большой интерактивный тест хостингов, на то насколько они дружелюбны к Django-сайтам. Его исходный код и репозиторий можно найти тут -> ГитХаб.
    Так же, я собираюсь использовать следующие домены:
    1. search-result-parser.site - для деплоя сайта на хостинге
    2. bddt2.space - для деплоя сайта на VPS
    Плюс, и это важно, на момент прочтения тобой этой статьи сайт по домену bddt2.site уже не будет доступен (. Ну знаешь, деньги на ветер не бросаю.

    Предварительная подготовка, приобретаем домен

    В этой главе, потребуется полазить по самому сайту reg.ru и проделать некоторые подготовительные шаги, которые являются общими, что для деплоя сайта через хостинг, что через VPS.
    В личном кабинете , нажимаете заказать и выбираете услугу "домен":
    1. Нажимаешь
    2. Выбираешь домен
    3. Вводишь желаемый
    4. Подбираешь
    После, тебе покажут различные вариации твоего домена в различных зонах. Для них будут применены разные скидки и цены. Я выбрал bddt2.space и search-result-parser.site.
    Это не всё, на новой странице тебе предложат кучу других услуг, которые может и были бы полезны в других сценариях и при других обстоятельствах, но не сейчас. Нам просто нужно зарегистрировать домен.

    Разворачиваем сайт на хостинге

    Развернуть сайт на хостинге от reg.ru, куда проще нежели чем на beget. Просто, всё дело в том, что нам не придётся устанавливать необходимое ПО (такое, как Python или OpenSSL, они уже там), да и некоторые шаги автоматизированны (например вход в докер контейнер) - это всё в сравнении с деплоем сайта на beget.

    Настройка хостинга

    Всё начинается с приобретения такой услуги как хостинг. Я думаю, ты уже приобрёл данную услугу на reg.ru иначе ты бы не был здесь :) Нам нужно будет зайти в ISPManager - админка для управления хостингом:
    После перейти в панель управления (значок компьютера):
    Дальше, нужно будет на дашборде перейти на все сайты(1), выбрать соответствующий сайт(2) и нажать кнопку изменить параметры(3). Так как мы уже приобрели домен, у нас будет один готовый сайт.
    Теперь про то, какие рычажки и кнопочки нужно будет прожмякать обязательно. Если быть более конкретным это выбрать необходимую версию пайтона и подключить CGI-скрипты.
    Хочу отметить, если твой django-сайт написан на версиях выше 4.2, то для тебя (ровно, как и для меня) подойдёт только одна версия python, 3.10.1. Так же, если ты ещё покупал SSL-сертификат включи и его.
    Если ты, мой друг, захочешь какую-нибудь версию python отличную от предложенных на хостинге, то спешу тебя разочаровать у тебя не получится. По крайней мере версии старше 3.10 точно нет. Дело в том, что тебе потребуются рут права для установки соответствующей версии OpenSSL - у тебя под докером не будет таких прав. Так что если твоё приложение использует новейшие фичи Python 3.11 и старше, тебе придётся устанавливать сайт на VPS, или искать нового хостинг провайдера.
    И ещё замечание по поводу интерфейса. Очерёдность версий интерпретатора питона идёт от самой ранней, до самой поздней, казалось бы. Но почему-то 3.10 версия находится чуть ли не в середине. Я так-то её и не сразу заметил. А нужна именно она.
    Мы закончили базовую настройку хостинга. И в отличие от хостинг-провайдера beget, нам не потребуется вручную скачивать и устанавливать необходимую версию python и openssl, они уже есть.

    Создаём базу данных

    Любому сайту, так или иначе требуется место для хранения данных. Хостинг провайдер поддерживает только MySQL 8 базы данных, по этому будем работать с ними.
    Данный способ подойдёт только если разворачивать сайт на приобретённом хостинге. А реализовать удалённый доступ можно только для MySQL 5.7. А БД с такой версией создать не получится через ISPManager.
    Давай покажу как создать одну такую:
    1. Где u3044930_bddt2_bd - это имя базы данных
    2. Где u3044930_bddt2_user - это имя пользователя, который будет работать в базе данных
    3. Это просто пароль, запомни или запиши.
    4. Можно поставить, а можно не ставить - не имеет значения. Удалённый доступ к таким базам данным всё равно не разрешён

    Деплой

    Развёртывание сайта всегда начинается с переноса его файлов и установки необходимых зависимостей. Их можно перенести двумя способами, или через панель управления, или используя scp-команду, через терминал. Здесь я рассмотрю только первый способ, ибо это тупо проще.
    Сначала зайди в файловый менеджер, после чего нужно будет зайти в директорию под названием того доменного имени, которое ты купил. В моём случае это search-result-parser.site. Все такие директории находятся в www директории.
    Загрузим архив с файлами сайта и распакуем его соответственно там же. Позже, в корневой директории сайта создай виртуальное окружение, активируй его и установи необходимые пакеты через pip:
    cd /www/search-result-parser.site/ /opt/python/python-3.10.1/bin/python3.10 -m venv .venv source .venv/bin/activate pip install -r req.txt
    Хочу отметить что, если тебе нужно использовать python3.10, то придётся прописывать полный путь до интерпретатора, ибо его нет в переменной окружения $PATH. Учти.
    Мы успешно перенесли файлы нашего сайта, а так же подготовили виртуальное окружение для работы нашего приложения. Дальше мы подключим, ранее созданную базу данных, разберёмся со статикой и подключимся к Apache2 веб-серверу.
    Apache2 - это свободный веб-сервер с открытым исходным кодом, используемый для обслуживания веб-страниц и другого контента в интернете

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

    Необходимо сразу подключить сайт к базе данных, которую мы недавно создали. В файле настроек Django-сайта отредактируй следующие строки:
    DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'database_name', 'USER': 'user_name', 'PASSWORD': 'database_password', 'HOST': 'localhost', } }
    Но это ещё не всё. Конкретно сейчас нас интересуют следующие ключи в словаре:
    1. NAME - Имя базы данных, в моём случае это u3044930_bddt2_bd
    2. USER - Имя пользователя базы данных, в моём случае это u3044930_bddt2_user
    3. PASSWORD - Пароль от базы данных
    Все остальные значения остаются такими, какими я их указал. Чтобы узнать наверняка и завершить данную главу, давай сделаем миграцию на новую базу данных, для этого:
    python manage.py migrate
    Теперь все необходимые таблицы и связи между ними были созданы. И мы можем спокойно работать с Django ORM.
    Django ORM (Object-Relational Mapper) - это компонент фреймворка Django, который позволяет взаимодействовать с базами данных, используя объекты Python, а не писать SQL-запросы напрямую. Он предоставляет абстракции для работы с реляционными базами данных, делая код более читаемым, переносимым и удобным в обслуживании

    Настройка директорий для статических и медиа файлов

    Для того чтобы сервер мог получить доступ к нашим файлам все они должны быть в корневой директории сайта, то есть в моём случае это /www/search-result-parser.site/. Надо будет сделать мягкие ссылки на директории static/ и media/ в корневой директории. Для этого, сперва, создаём директории:
    cd /www/search-result-parser.site/ mkdir static mkdir media
    После создаём мягкие ссылки:
    Мягкая ссылка, также известная как символическая ссылка или симлинк (symlink), - это специальный вид ссылки в файловой системе, который указывает на другой файл или каталог, но не содержит данных файла-оригинала.
    cd /www/search-result-parser.site/Website ln -s ../static static ln -s ../media media
    И в качестве завершения данной главы и теста, всё ли мы сделали правильно, давай соберём всю статику в приложении:
    python manage.py collectstatic
    Все статические файлы должны быть доступны под директорией /www/search-result-parser.site/static/. А все медиа файлы, при загрузке на сервер чего-нибудь, должны быть в /www/search-result-parser.site/media/.

    Подключение к WSGI-серверу

    Теперь подключимся к веб-серверу хостинга. У reg.ru - это Apache2. Для этого нужно будет создать специальный файл passenger_wsgi.py, где его содержимое:
    # -*- coding: utf-8 -*- import os, sys sys.path.insert(0, '/var/www/u3044930/data/www/search-result-parser.site/Website') sys.path.insert(1, '/var/www/u3044930/data/www/search-result-parser.site/.venv/lib/python3.10/site-packages') os.environ['DJANGO_SETTINGS_MODULE'] = 'Website.settings' from django.core.wsgi import get_wsgi_application application = get_wsgi_application()
    1. Где вместо sys.path.insert(0, ..., ты должен будешь указать путь до корневой папки своего django-сайта.
    2. Где вместо sys.path.insert(1, ..., ты должен будешь указать свой путь до пакетов в виртуальном окружении, созданным ранее.
    Мы закончили, разворачивать наш сайт на хостинге от reg.ru.
    Как перезапустить сервер?
    Как перезапустить сервер? Теперь перезапусти сервер создав в корневой директории сайта, /www/bddt2.space/ файл .restart-app. Сервера работают таким образом, что каждую минуту проверяют хостинги на наличие вот такого файла и если он есть, перезапускают. Подожди окончания минуты :)

    Разворачиваем сайт на VPS

    Создаём VPS на Reg.ru

    Для создания выделенных серверов, рег предоставляет очень широкий ассортимент в выборе операционных систем, готовых систем и в выборе железа, на котором ты будешь размещать свой VPS. Плюс, хочу заметить цену, они значительно дешевле в сравнении с тем же beget.
    Итак, перейди на эту страницу конфигурации https://www.reg.ru/vps/.
    1. Тут мы выберем Ubuntu LTS 24.04 (самая последня версия на данный момент).
    2. Тип и мощность процессора
    3. Тариф, много нам не надо. Но чем требовательней сайт, тем больше тебе потребуется
    Делаем заказ и оплачиваем.

    Редактируем DNS записи и добавляем поддомен

    На текущий момент у тебя есть домен и VPS, но они пока никак не связаны. Чтобы связать приобретённый домен и ново созданный VPS нам потребуется покопаться в DNS записях. Именно в тех, что были отправлены тебе письмом при создании сервера, а если более конкретно то это - ns5.hosting.reg.runs6.hosting.reg.ru.
    DNS (Domain Name System) - Это телефонная книга интернета, преобразующая понятные человеку доменные имена (например, google.com) в числовые IP-адреса, используемые компьютерами для определения местоположения друг друга. Она позволяет пользователям получать доступ к веб-сайтам и другим онлайн-ресурсам, используя легко запоминающиеся имена вместо сложных IP-адресов.
    Открой страницу со всеми приобретёнными доменами и выбери пункт редактирования DNS:
    После этого нужно поменять DNS-сервера по умолчанию на те, что я указал выше, то есть: ns5.hosting.reg.runs6.hosting.reg.ru.
    Мы успешно поменял DNS-сервера, теперь необходимо сделать соответствующие A или AAAA записи для указания адреса нашего VPS.
    Учти, чтобы DNS сервера поменялись потребуется время. Сколько? Бывает по-разному, у меня это заняло 15 минут. Только учти что у браузеров есть свой встроенный DNS кеш. Посмотреть его ты можешь вбив вот это(для firefox) : about:networking#dns.
    И где, собственно говоря, редактировать этот ваш DNS? Редактирование DNS серверов для VPS происходит в отдельной админке. Его адрес указывается во всё том же письме при создании VPS. Там же логин и пароль от него.
    При создании домена, нужно указать его имя - bddt2.space и IP купленного VPS.
    После успешного добавления домена в DNS, нам не нужно больше ничего делать. Но если, тебе нужно будет добавить поддомен, например. Или изменить адрес VPS сервера, то:
    Где заполняем все требуемые поля, IP будет таким же как и у основного домена, только имя будет другим. Так, например, мой домен bddt2.space, а поддемен я назову staging.bddt2.space.
    Таким образом, при обращении по указанному домену (в моём случае это bddt2.space), DNS сервер укажет на нужный нам (то есть созданный нами) VPS сервер.

    Создаём базу данных

    Создание базы данных на reg.ru немного мудрёное по моему мнению. Так например, почему бы не разрешать удалённый доступ к базам данным созданным в ISPManager. Это быстро, легко и удобно.
    Но, они решили пойти другим путём. Для тех кто разворачивает сайт на VPS, придётся:
    1. Либо создавать базу данных на том же VPS сервере
    2. Либо воспользоваться облаком и создать там
    3. Либо использовать базы данных других хостингов.
    Я буду демонстрировать 2й способ, ибо ты уже наверняка оплатил хостинг и было бы странно и неэкономно пользоваться чужими услугами. Создание базы данных в облаке reg, очень просто:
    1. Выбираем тип базы данных (в моём случае я буду работать с MySQL)
    2. Выбираем тариф
    MySQL - это система управления реляционными базами данных (СУБД), используемая для хранения, организации и извлечения данных.
    1. Нужна ли нам отказоустойчивая база данных. Если одна падёт, на её место станет другая, её точная копия
    2. Имя базы данных, надо запомнить - в моём случае это bddt2_bd
    3. Имя пользователя, через которого мы будем подключаться к базе данных - bddt2_user
    4. Пароль
    После чего жмякаем "создать кластер" и ждём, когда данный кластер будет создан. На это потребуется время.
    Вообще, когда я написал "потребуется время" тебе прям придётся подождать сутки-двое. Я так долго ждал, что уж начал думать использовать какое-нибудь другое решение. Например, с использованием баз данных бегета. Слёзно прошу владельцев Reg.ru, предупреждайте ваших пользователей(клиентов) сколько процесс создания кластера займёт времени.
    Когда, наш кластер создастся, нам нужно будет узнать хоста к которому можно подключиться и порт на котором сидит MySQL сервер. Для этого:
    1. Открыв создавшийся кластер зайди во вкладку "Базы данных"
    2. bddt2_bd - имя базы данных к которой подключаешься
    3. bddt2_user - имя пользователя через которого подключаешься
    4. 79.174.89.21 - адрес хоста на котором сидит MySQL сервер
    5. 18320 - порт на котором данная база данных принимает запросы
    Теперь у нас есть всё необходимое для подключения к базе данных для нашего сайта на VPS.

    Подключаемся к созданному VPS, через SSH

    Мы успешно создали свой первый виртуальный сервер( и базу данных) на Рег, теперь нужно к нему подключиться. Для этого будем использовать SSH. И чтобы можно было подключиться к нашему серверу нужно узнать его IP и пароль к нему. Всё это приходит по почте, которую вы указали при регистрации аккаунта на Рег.
    SSH (Secure SHell) - это интернет-протокол по которому осуществляется безопасное, зашифрованное общение между клиентом и сервером. Есть SSH-клиент (он необходим для тех машин, с которых будет осуществлено подключение), а есть SSH-сервер (он необходим, если вы хотите предоставить удалённый доступ к своей машине). Все сервера имеют SSH-сервер установленным по умолчанию.
    1. Адрес виртуального сервера
    2. Имя пользователя для входа на сервер
    3. Пароль авторизации на сервер
    Если по какой-то причине тебе не пришло письмо, то адрес сервера можно узнать зайдя в панель управления виртуальными серверами на https://cloud.reg.ru/panel:
    Пароль при необходимости можно будет сбросить, а имя пользователя к которому всегда можно подключиться это root - всегда. Подключимся же к нашему серверу:
    ssh root@83.166.244.155
    На Linux машинах SSH-клиент установлен по умолчанию, но на Windows нет. Чтобы активировать SSH-клиент, потребуется просто активировать такую "Фичу". Вот замечательная статья об этом.
    А через что, собственно подключаться? Можно через PowerShell, можно через Git Bash если привык к Линукс, можно и через специально созданные программы для подключения к серверам через SSH, а можно установить специальное расширение для VSCode и получить не только терминал на удалённом сервере, но и файловый менеджер и среду разработки - расширение такое называется если что Remote - SSH.
    Так как я пока работаю и сижу на Windows, буду использовать самый простой и доступный способ, здесь и дальше - PowerShell.

    Подключение к серверу по ключу (опционально)

    Я вангую, тебе придётся очень часто заходить на удалённый сервер, хотя бы потому, что связь может постоянно обрываться, а вручную вписывать пароль для подключения, та ещё задачка.
    По этому, предлагаю создать ключ-пару для авторизации без пароля. Для этого, на своём рабочем компьютере, введи команду:
    ssh-keygen -t rsa -f .ssh/bddt2
    1. Где флаг -t отвечает за тип сгенерированного ключа
    2. Где флаг -f отвечает за путь к файлу (который может не существовать), куда будет сохранён ключ
    После генерации у тебя будут два файла, bddt2 и bddt2.pub. Первый (bddt2), это приватный ключ, храни его как зеницу ока, он нужен для авторизации. Второй ключ (bddt2.pub) раздаётся всем удалённым серверам, к которым ты хочешь получать доступ без ввода пароля.
    Осталось выполнить ещё одну команду, а именно передать ключ на удалённый сервер, на который ты хочешь попасть по ключу.
    ssh-copy-id .ssh/bddt2.pub USERNAME@SERVER
    1. Где .ssh/bddt2.pub - путь к публичной части ключа
    2. Где USERNAME - это имя пользователя, через которое ты хочешь попасть на сервер, обычно это root, если никаких других пользователей ещё не создавалось.
    3. Где SERVER- это адрес удалённого сервера. Это может быть как IPv4, так и доменное имя.
    Мы закончили. После этого, чтобы войти на сервер, используй данную команду:
    ssh USERNAME@SERVER_ADDR -i .ssh/bddt2

    Устанавливаем необходимые пакеты

    Теперь время для Ctrl-C, Ctrl-V. Сейчас будет немного команд, которые установят на ваш сервер необходимые пакеты:
    apt-get update && apt-get upgrade && apt-get install gettext libgettextpo-dev && apt-get install pkg-config default-libmysqlclient-dev build-essential && apt-get install nginx && apt-get install gunicorn && apt-get install python3.12-venv python3-dev
    Теперь давай поговорим о том, для чего я всё это установил, и что сделала каждая из этих команд:
    1. apt-get update - всегда выполняй её первой, при установке любого пакета. Она синхронизирует индекс пакетов приложений и обновляет все зависимости, при необходимости.
    2. apt-get upgrade - устанавливает самые последние версии установленных пакетов на системе.
    3. apt-get install gettext libgettextpo-dev - она устанавливает зависимости необходимые для генерации переводов для твоих сайтов (которые используют утилиту gettext)
    4. apt-get install pkg-config default-libmysqlclient-dev build-essential - необходимые зависимости для работы с базами данных на MySQL.
    5. apt-get install nginx - для запуска веб-сервера
    6. apt-get install gunicorn - для переадресации запросов от nginx-сервера к нашему django-приложению
    7. apt-get install python3-dev python3.12-venv - для возможности создания виртуального окружения при работе python-приложений
    С установкой необходимых пакетов на сервер мы закончили. Остались только "не необходимые". Можешь пропустить до начала следующей главы, если у тебя нет функциональных тестов в приложении.
    nginx - это легко конфигурируемый веб-сервер и прокси для запросов направляемые на сервер.
    gunicorn - это сервер для python-приложений который связывает веб-сервера (такие, как nginx и apache) и python приложение
    Мой "не необходимый" пакет - это selenium. Чтобы мои функциональные тесты отработали, мне он необходим. И чтобы он работал, ему потребуется браузер Firefox, который мы и установим как .deb пакет. О бой, это то ещё приключение trueヽ(°〇°)ノ. Всех интересующихся приглашаю посетить официальный сайт мозилы и выполнить одну команду за другой.
    В дополнение к firefox, потребуется ещё установить geckodriver. Версии последних релизов можно найти здесь: https://github.com/mozilla/geckodriver/releases . И теперь, команда для установки этого geckodriver:
    wget https://github.com/mozilla/geckodriver/releases/download/v0.36.0/geckodriver-v0.36.0-linux64.tar.gz tar -xzvf geckodriver-v0.36.0-linux64.tar.gz sudo mv geckodriver /usr/local/bin/
    Скачав (wget) и разархивировав geckodriver (tar -xzvf), мы после поместили его в /usr/local/bin/ директорию, чтобы у всех приложений был доступ к драйверу.

    Создаём пользователя

    Этот шаг обязателен и не думай делать сайт на root-правах. Сейчас необходимо будет создать пользователя с root привилегиями и домашней директорией.
    useradd -m -s /bin/bash site passwd site usermod -aG sudo site
    Первая команда создаст пользователя по имени "site", создаст для него домашнюю директорию (флаг -m) и установит командную оболочку по умолчанию т.е. bash. Вторая команда задаст пароль для нового пользователя. Третья добавит пользователя "site" в sudo группу, которая способна выполнять все команды, только с использованием команды sudo.
    sudo - это команда(программа) выполняемая в терминале на Unix-like операционных системах (Linux, MacOS), которая позволяет запускать другие программы с разрешениями выполнять административные и потенциально опасные команды.

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

    База для нашего сервера готова, теперь давай займёмся файлами самого сайта. Я собираюсь создать простую файловую структуру, где при помощи git получу файлы своего проекта и скопирую их в source директорию. А так же, создам виртуальное окружение:
    Все дальнейшие команды я выполнял от лица новосозданного пользователя "site". Если, что-то изменится, я дам знать.
    mkdir ~/bddt2.space cd ~/bddt2.space git clone https://github.com/DmRafaule/DjangoDeploymentTest source python -m venv venv
    После выполнения всех этих команд, у тебя должна будет получиться следующая структура проекта:
    1. bddt2.space <- Ты тут
    2. venv
    3. source
    Теперь, активируем виртуальное окружение и установим необходимые пакеты из source/requirements.txt:
    source ./venv/bin/activate pip install -r source/requirements.txt
    Здесь не должно возникнуть ни каких проблем, но если всё таки возникли прочитайте внимательно логи ошибок. Зачастую, это просто не установленные зависимости на сервере, которые легко исправить при помощи пакетного менеджера apt.
    Давай попробуем запустить установленное Django-приложение (предварительно зайдя в директорию с файлом manage.py:
    cd ./source/Website python manage.py runserver

    Настройка базы данных mysql (опционально, хотя не очень)

    Тебе выдаст ошибку, что файл settings.json не был найден. Это файл конфигурации, который я использую как прокси, вместо того чтобы писать непосредственно в settings.py. Сделал я это с той целью, чтобы можно было безопасно добавлять файл settings.py в git репозиторий и для упрощения развёртывания.
    Вот пример такого файла(settings.json), создай его в source/Website директории:
    { "SECRET_KEY": "django-insecure-4#-wrp_(53^0_9$%p8lq+qf43z0dx0ji6bh!sa1mfn^l)4-lq@", "DEBUG": true, "ALLOWED_HOSTS": ["bddt2.space"], "DATABASES": { "default": { "ENGINE": "django.db.backends.mysql", "NAME": "bddt2_bd", "USER": "bddt2_user", "PASSWORD": "aD9bN5oV3pjD7qJ9", "HOST": "79.174.89.21", "PORT": 18320 } }, "EMAIL": { "DEFAULT_FROM_EMAIL": "bddt@bddt.space", "DEFAULT_TO_EMAIL": "chedrden@gmail.com", "EMAIL_HOST": "", "EMAIL_PORT": , "EMAIL_HOST_USER": "", "EMAIL_HOST_PASSWORD": "" } , "STAGING_SERVER": "http://staging.bddt2.space" }
    Как ты видишь, я уже использую MySQL в качестве базы данных. Что нужно знать для подключения к базе данных из VPS:
    1. Во-первых нужно знать какой бекенд подключать - django.db.backends.mysql
    2. Во-вторых имя базы данных- bddt2_bd
    3. Во-вторых имя пользователя - bddt2_user
    4. В-третьих, пароль от базы данных - aD9bN5oV3pjD7qJ9
    5. В-четвёртых, имя хоста базы данных - 79.174.89.21
    6. И в пятых, порт подключения - он всегда один и тот же - 18320
    Все эти данные можно получить при создании своей базы данных, процесс которого я описал в соответствующей главе.
    Как я переношу, данные из settings.json в Website/settings.py? В файле settings.py я открываю файл settings.json и читаю от туда данные, вот так:
    from django.utils.translation import gettext_lazy as _ from pathlib import Path import os import json import sys # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent # Read the settings file with open(os.path.join(BASE_DIR,"settings.json"), 'r') as settings_file: settings = json.load(settings_file) # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = settings["SECRET_KEY"] # SECURITY WARNING: don't run with debug turned on in production! DEBUG = settings["DEBUG"] ALLOWED_HOSTS = settings["ALLOWED_HOSTS"] STAGING_SERVER = settings["STAGING_SERVER"] # More code bellow # ...
    Использую JSON-формат, ибо просто очень удобно с ним работать через Python.

    Заканчиваем перенос проекта

    Уже, кстати, можно запустить тесты и посмотреть, что работает, а что нет. Всё должно отработать:
    Итак, мы успешно закинули наш сайт на сервер и даже прошли все тесты. А это значит, что пора настроить nginx, после чего свяжем наш сайт с nginx веб-сервером через gunicorn.
    Почему, а главное зачем именно Nginx и Gunicorn? Смотри, nginx делает наш VPS сервер, как бы доступным для других машин. Он настраивает 80-й порт и домен(при необходимости), чтобы другие машины знали где он, и куда направлять свои запросы. Но одного nginx мало, нам нужно как-то передать запросы от других машин на наше Django-приложение. Для этого и используется Gunicorn, он тоже прослушивает соответствующий, 80-й порт (хотя можно и нужно это делать через UNIX-сокеты, я покажу), а после того как получил запрос направляет его в Django-приложение, где уже и происходи вся остальная логика сайта.

    Настраиваем Nginx

    Вместе с файлами проекта, ты ещё получишь дефолтные файлы конфигурации для настройки nginx - nginx-server-http_only.conf, nginx-server-https_301.conf, nginx-server-https.conf.

    Супер быстрая настройка Nginx (очень опционально)

    Дальше я собираюсь подробно описать, для чего используется каждый файл, как запускать и перезапускать nginx, плюс как добавлять сайты на nginx. Если тебе это интересно, то милости прошу, но если нет ты можешь воспользоваться скриптом server-setup.sh, который я оставил в репозитории.
    Чтобы им воспользоваться, введи:
    ./server-setup.sh YOUR_DESIRED_DOMAIN on_https
    1. Где YOUR_DESIRED_DOMAIN - это желаемый домен
    2. Где on_https - это флаг, который говорит настроить редирект на HTTPS протокол
    Этот скрипт создаст соответствующие файлы конфигураций и будет перезагружен.

    Продолжаем настраивать Nginx

    Ну а если всё-таки интересны детали и процесс, давай продолжим. Пока открой файл nginx-server-http_only.conf, ты увидишь следующую конфигурацию для нашего сайта:
    server { listen 80; server_name HOST_PLACE_SETUP; location /static { root /home/USER_PLACE_SETUP/HOST_PLACE_SETUP; } location /media { root /home/USER_PLACE_SETUP/HOST_PLACE_SETUP; } location / { proxy_set_header Host HOST_PLACE_SETUP; proxy_pass http://unix:/tmp/HOST_PLACE_SETUP.socket; } }
    1. В этой конфигурации мы настраиваем порт на котором мы будем слушать входящие запросы.
    2. Имя для нашего сервера (доменное имя). В моём случае это должно быть bddt2.space.
    3. Папки, которые этот сервер будет обслуживать. Как минимум нужно настроить корневой каталог "/". Но этим всё не ограничивается, на моём сайте используется различная статика в виде картинок и иконок. Плюс медиа файлы, которые загружаются непосредственно пользователем.
    Что за непонятные переменные USER_PLACE_SETUP и HOST_PLACE_SETUP? Всё дело в том, как работает мой кастомный скрипт по настройке сервера. Если в кратце, то он, используя sed команду заменяет две вышеуказанные переменные и заменяет их на необходимые администратору значения. Всё это делается через специальный скрипт server-setup.sh, о котором через главу.
    Итак, финальная версия этой конфигурации будет выглядеть вот так:
    server { listen 80; server_name bddt2.space; location /static { root /home/site/bddt2.space; } location /media { root /home/site/bddt2.space; } location / { proxy_set_header Host bddt2.space; proxy_pass http://unix:/tmp/bddt2.space.socket; } }
    Чтобы не забыть, давай сразу создадим директории media и static в ~/bddt2.space директории и мягкие ссылки на них. Мягкие ссылки на них создаются с тем, чтобы предоставить серверу доступ к ним.
    cd ~/bddt2.space mkdir static mkdir media cd source/Website
    Мягкая ссылка, также известная как символическая ссылка или симлинк (symlink), - это специальный вид ссылки в файловой системе, который указывает на другой файл или каталог, но не содержит данных файла-оригинала.
    Все необходимые директории были созданны и теперь мы готовы создать мягкие ссылки, на эти директории:
    ln -s ../../static static ln -s ../../media media
    Теперь у проекта следующая структура:
    1. bddt2.space
    2. venv
    3. media
    4. static
    5. source
    6. Website
    7. Backend
    8. Frontend
    9. Website
    10. media -> ../../media
    11. static -> ../../static
    12. manage.py
    13. settings.json
    14. deploy.sh
    15. server-setup.sh
    16. requirements.txt
    17. gunicorn.service
    18. nginx-server-http_only.conf
    19. nginx-server-on_httsp-301.conf
    20. nginx-server-on_https.conf
    При работе с медиа файлами, сервер может дать 413 ответ - 413 Request Entity Too large. Связано это с тем, что максимальный размер тела в запросе по умолчанию может быть не больше 1 Мегабайта. Что бы изменить это, в файле /etc/nginx/nginx.conf, в раздел http добавь: ```client_max_body_size 50M;```
    Теперь, любой файл который будет создан в директории ~/bddt2.space/source/Website/static или ~/bddt2.space/source/Website/media будет доступен и в директориях ~/bddt2.space/static и ~/bddt2.space/media.
    Чтобы это проверить, можешь запустить команду collectstatic и убедиться что все файлы, хоть и были скопированы в ~/bddt2/source/Website/static, так же доступны и в ~/bddt2.space/static.

    Решаем проблему с 403 ошибкой - запрещено (опционально, надеюсь)

    Ещё одна, очень часто возникающая проблема, это то что сервер может возвращать 403 ответ на запрос какого-нибудь статического файла. Зачастую это связано с тем что у пользователя www-data, нет разрешения на чтение определённых файлов. В файле настройки nginx указан пользователь от лица которого и запускается веб-сервер.
    Чтобы это исправить есть три способа:
    1. Заменить пользователя в файле /etc/nginx/nginx.conf
    2. Дать доступ всем к чтению файлов
    3. Добавить пользователя www-data в группу пользователя, который запускает приложение.
    Я опишу 3-й ибо это, на мой взгляд самый простой и правильный способ. И нужно всего лишь выполнить одну команду:
    sudo usermod -aG site www-data
    1. site - имя группы к которому хотите добавить пользователя (оно будет совпадать с именем пользователя)
    2. www-data - имя пользователя, которого хотите присоединить к группе.
    Теперь вся статика, и все медиа файлы на сайте должны быть доступны.

    Заканчиваем настройку Nginx

    Давай закончим настраивать веб-сервер и скопируем созданный файл конфигурации в /etc/nginx/sites-available:
    sudo cp ~/bddt2.space/source/nginx-server.conf /etc/nginx/sites-available/staging-nginx-server.conf
    Теперь сделаем то же самое что и с директориями static и media, создадим мягкую ссылку на этот файл конфигурации. Но сначала перейди в директорию где должна быть эта ссылка:
    sudo cd /etc/nginx/sites-enabled sudo ln -s ../sites-available/staging-nginx-server.conf staging-nginx-server.conf
    Перезапустим nginx-службу при помощи systemctl, чтобы изменения вошли в силу:
    sudo systemctl restart nginx
    Я думаю, сейчас стоит попробовать посетить наш сайт - bddt2.space.
    И да, ты должен увидеть что-то вроде этого. Почему так происходит, что за "Плохой шлюз"? А дело всё в одной строке, в файле конфигурации сайта /etc/nginx/sites-available/staging-nginx-server.conf.
    ... proxy_pass http://unix:/tmp/bddt2.space.socket; ...
    По факту, nginx-сервер перенаправил мой GET-запрос по указанному сокету, но к нему ещё ничего не подключено. Вот на этом моменте в роль вступает gunicorn.

    Настраиваем Gunicorn

    Почти готовый файл конфигурации, находится там же где и файл конфигурации nginx-сервера - ~/bddt2.space/source/gunicorn.service. Это файл описывающий работу linux-демона, вот его содержимое:
    [Unit] Description=Gunicorn server for HOST_PLACE_SETUP [Service] Restart=on-failure User=USER_PLACE_SETUP WorkingDirectory=/home/USER_PLACE_SETUP/HOST_PLACE_SETUP/source/Website ExecStart= /home/USER_PLACE_SETUP/HOST_PLACE_SETUP/venv/bin/gunicorn --bind unix:/tmp/HOST_PLACE_SETUP.socket Website.wsgi:application [Install] WantedBy=multi-user.target
    Данный скрипт имеет подстановочные переменные HOST_PLACE_SETUP И USER_PLACE_SETUP. Я заменяю их на необходимые мне значения через специальный скрипт server-setup.sh. О нём подробнее в следующей главе.
    Данный сервис(демон), запущенный пользователем site и с его привилегиями, будет перезагружаться каждый раз при возникновении какой-либо ошибки (Restart=on-failure). Работать данный демон будет в директории указанной в WorkingDirectory. А делать он будет то, что указано в ExecStart, то есть запускать gunicorn сервер.
    При запуске gunicorn мы так же указали к какому сокету подключаться и куда перенаправлять запросы - в наше Django-приложение.
    Создай такой же файл в /etc/systemd/system/ и отредактируй вставив своего пользователя, свой домен и свой сокет. Теперь запустим службу и сделаем так, чтобы она запускалась на сервере при загрузке.
    sudo cp ~/bddt2.space/source/gunicorn.service /etc/systemd/system/gunicorn.service sudo vim /etc/systemd/system/gunicorn.service sudo systemctl start gunicorn sudo systemctl enable gunicorn
    Теперь всё будет работать. Мы создали специальный сервис, который запускает gunicorn-сервер при старте, а он в свою очередь запускает наше django-приложение. Обновив вкладку, ты должен будешь увидеть следующее:
    На этом процесс развёртывания Djanog-сайта на VPS от reg.ru завершён. Рекомендую ещё прочитать следующую главу о том как поместить данный сайт на новый протокол HTTPS.

    Переходим на HTTPS (опционально, хотя не очень)

    Вообще, изначально, я думал, что есть какой-то способ получить(переместить) сгенерированный сертификат от Beget на VPS. Но я такого способа не нашёл.
    Для того, чтобы поместить наш сайт на HTTPS протокол, потребуется получить специальный сертификат. Его мы получим у LetsEncrypt. Он бесплатный, но что более классно, всё можно сделать через командную строку, а значит автоматизировать. Смотри, для того чтобы, настроить nginx веб-сервер под https, потребуется сертификат и ключ к нему.
    Команда LetsEncrypt, сделала специальную утилиту, которая очень крутая в плане поддерживаемых стеков технологий для сертификации. Вот, например страница для генерации, подписи и издания сертификатов для сайтов на nginx и использующий pip. Просто чума) И не нужно этой мозгоебли с самоподписанными сертификатами, которым никто не доверяет, и как результат, никто не заходит на сайт.
    Активируем виртуальное окружение и установим программу:
    source ~/bddt2.space/venv/bin/activate pip install certbot certbot-nginx
    Теперь генерируем и подписываем сертификаты:
    sudo ~/bddt2.space/venv/bin/certbot certonly --nginx -d bddt2.space
    Данная команда сгенерирует и подпишет сертификаты, которые расположит в /etc/letsencrypt/live/bddt2.space. Ты увидишь вот такой вот интерактивный промпт:
    1. Просит ввести почту
    2. Согласись на продажу своей души и души своего сайта)
    3. Регистрация, по желанию
    4. Выбор доменов(поддоменов) для который будет действовать данный сертификат. Если просто нажать ENTER, сертификат будет применён ко всем.
    5. Путь до сертификата (для настройки nginx)
    6. Путь до ключа (для настройки nginx)
    Можно так же задать cron-задачу на обновление сертификата, каждый месяц:
    echo "0 0,12 * * * root /opt/certbot/bin/python -c 'import random; import time; time.sleep(random.random() * 3600)' && sudo certbot renew -q" | sudo tee -a /etc/crontab > /dev/null
    Осталось только поменять конфигурации в sites-available, делается это так:
    server { listen 443 ssl; server_name HOST_PLACE_SETUP; ssl_certificate /etc/letsencrypt/live/bddt2.space/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/bddt2.space/privkey.pem; location /static { root /home/USER_PLACE_SETUP/HOST_PLACE_SETUP; } location /media { root /home/USER_PLACE_SETUP/HOST_PLACE_SETUP; } location / { proxy_set_header Host HOST_PLACE_SETUP; proxy_pass http://unix:/tmp/HOST_PLACE_SETUP.socket; } }
    Отличие от предыдущей конфигурации состоит в том, что мы поменяли порт и добавили ssl_certificate и ssl_certificate_key. Пути для которых вам скажет certbot. Вот собственно и всё, по тому как добавить https на ваш сайт.
    Но ты мог заметить, что при попытке получить свой сайт через обычный http, уже не получиться. Нужно будет сделать отдельную конфигурацию для 80 порта и сделать 301 редирект на https версию. Это считается хорошей практикой. Для этого создайте ещё один файл конфигурации в /etc/nginx/sites-available, например http_301_redirect-bddt2.space, и создайте файл со следующей конфигурацией:
    server { listen 80; server_name HOST_PLACE_SETUP; location / { return 301 https://HOST_PLACE_SETUP$request_uri; } }
    Где HOST_PLACE_SETUP, это домен вашего сайта, например bddt2.space. Данная конфигурация делает 301 редирект с любых страниц с протоколом http на страницы с протоколом https.
    301 код сервера - Его ещё называют перманентный редирект, ответ сервера при котором происходит перенаправление с одного URL на другой.
    Есть ещё и 302 код сервера и это тоже редирект. Так в чём их отличие? Отличие в значении которое передаёт 302 код. Если 301, то он как бы говорит: УРЛ на который ты попал, всегда будет доступен только по новому адресу. А 302, в свою очередь говорит: УРЛ на который ты попал сейчас доступен по этому адресу, но возможно так будет не всегда.

    Сравнение запуска сайта через Хостинг и через VPS

    Возможность тестированияБез ограниченийБез ограничений
    Кастомная структура проектаОграниченаБез ограничений
    Автоматизация деплоя, настроекОграниченаБез ограничений
    WSGI серверPhusion PassengerБез ограничений
    Веб серверApache2Без ограничений
    Переход на HTTPSПочти незаметноСложно
    Настройка базы данныхЛегкоСложно
    Подключение доменаПочти незаметноСложно
    ЦенаДешевоДороже
    ПоказателиReg.ru HostingReg.ru VPS
    Честно скажу, я бы разворачивал сайты на виртуальном хостинге, чем самолично бы это делал на VPS. Но ограничения в версиях используемого питона, ещё в невозможности использовать другие БД, сильно меня отталкивают.

    Заключение

    И вот очередной хостинг-провайдер покорён и изучен. Теперь ты знаешь, как можно размещать сайты на reg.ru. По моему опыту скажу, что разместить сайт на reg.ru сложнее чем на том же beget. Уж больно очень много подводных камней и не очевидностей. Надеюсь я разобрал всех их и показал приемлемые способы их решения и обхода.
    А ещё я надеюсь, что данная статья помогла тебе разобраться с тем, как и где разворачивать твой сайт написанный на Django и на твой благой комментарий и тем, что ты можешь захотеть поделиться этой статьёй с другом или подругой, тоже надеюсь. В любом случае до встречи в следующей статье (⌒‿⌒)


    Не забудь поделиться, лайкнуть и оставить комментарий)

    Комментарии

    (1)

    captcha
    Отправить
    ЗАГРУЗКА ...
    Часы
    4 апреля 2025 г. 16:05
    Человек
    Денис
    Вторя часть гайда не понятная (рофлы с тем что при выборе питона 3.10 они дают 3.8 это конечно да) допиши полностью вторую часть
    Все ответы (1)
    Ответить
    ЗАГРУЗКА ...

    Другое

    Похожие статьи


    Как развернуть Django сайт на бегет хостинг (или VPS). Полная инструкция.

    Часы
    12.05.2024
    /
    Часы
    02.10.2025
    Глазик
    6246
    Сердечки
    3
    Соединённые точки
    1
    Соединённые точки
    2
    Соединённые точки
    0
    Это статья-инструкция о том как можно разместить django-сайт на beget. Показываю два способа (деплой на хостинге и деплой на VPS). Плюс, как настроить и подключить базу данных, почту, статику и …

    Серия статей о создании и продвижении SearchResultParser | Tim the webmaster

    Часы
    16.07.2024
    /
    Часы
    05.10.2025
    Глазик
    541
    Сердечки
    0
    Соединённые точки
    0
    Соединённые точки
    2
    Соединённые точки
    0
    Это статья-вступление и статья-навигатор по проекту/веб-инструменту SearchResultParser. Чему можно будет научиться и для кого эта серия статей

    Разработка фронтенда сайта на React с бэкендом на Django | SearchResultParser ч. 2

    Часы
    16.08.2024
    /
    Часы
    02.10.2025
    Глазик
    1563
    Сердечки
    0
    Соединённые точки
    0
    Соединённые точки
    0
    Соединённые точки
    0
    Показываю и рассказываю о том как разработать фронтен для сайта на Реакте с бэкендом на django. Использую MaterialUI и TailwindCSS, с исходным кодом и комментариями.

    Как добавить локализацию для django сайта (python, js, шаблоны и модели) ч. 5

    Часы
    06.02.2025
    /
    Часы
    02.10.2025
    Глазик
    6027
    Сердечки
    0
    Соединённые точки
    0
    Соединённые точки
    0
    Соединённые точки
    0
    В этой статье я покажу, как можно добавить локализацию и переводы для django сайта(i18n). Мы будем переводить Python, JS код, а так же шаблоны и django-модели. Плюс, переводы используя i18next …

    Анализ трафика и их источников в метрике, яндекс вебмастере и GSC, за Январь, Февраль

    Часы
    03.03.2025
    /
    Часы
    02.10.2025
    Глазик
    342
    Сердечки
    0
    Соединённые точки
    0
    Соединённые точки
    0
    Соединённые точки
    0
    Про анализ трафика сайта и их источников, SEO продвижении за Январь-Февраль. Анализ трафика от Google через GSC и анализ трафика от Яндекса используя Yandex.Webmaster. Так же предоставлена полная статистика о …

    Использованные термины


    Релевантные вопросы