Введение или про что будет эта статья
В этой статье я расскажу и покажу, как можно разместить сайта на серверах от beget (хостинг-провайдер). Данный провайдер предоставляет широкий выбор платформ разработки/CMS, которые используются для создания сайта. Но в этой статье я расскажу только о том, как развернуть сайт написанный на Django, ибо разбираюсь в этом.
В дополнение того, что было сказано ранее, я хочу ещё показать, как можно настроить ваш проект/сайт таким образом, чтобы при необходимости внедрения новых фич, или их исправление), это было не сложнее чем нажатие одной кнопки. Делать это будем через bash, git и ssh.
Кроме предоставления обычного хостинга, beget предоставляет такую услугу как VPS.
Так вот, на бегете, можно разместить сайт двумя способами. Первый - простой, но ограниченный, второй - сложный, но и от того куда более интересный. Первый заключается в том, чтобы использовать готовое решение от самого хостинга и немного поколдовать в докере. Суть второго способа, заключается в том, чтобы создать свой VPS и настроить сервер в ручную.
Я продемонстрирую оба, объясню в чём особенности и нюансы обоих, и почему лучше, по моему мнению, именно VPS. Сразу к сравнению можно перейти сюда.
Особенности данной статьи
Для демонстрации я буду использовать специально сделанное для этого django-приложение. Это приложение было специально сделано со всеми фишками, которые возможно потребуются сайту в будущем:
- работа и настройка с БД
- отправка почты
- получение статики
- загрузка на сайт различных медиа
- переводы
- тесты
Так же, я сторонник такого подхода в разработке приложений как TDD (Test Driven Development).
Для чего тебе это знать? А знать следует, ибо я вместо быстрого деплоя одного сайта, на одну машину, с одним доменом, я буду деплоить уже два сайта (один тестовый, максимально приближенный к боевому - staging.bddt.space, другой боевой - bddt.space), на одну машину, с одним доменом и одним поддоменом, для тестового сайта.
И ещё, если тебе не нужна тестовая составляющая для сайта можешь просто прочитать главу предварительной подготовки + развёртывание сайта на хостинге (или развёртывание сайта на VPS до главы развёртывания боевого сервера ( исключительно). Так же, если в названии главы присутствует - опционально, можешь смело её пропускать.
Предварительная подготовка
В последующих трёх главах, потребуется полазить по самому сайту beget и проделать некоторые подготовительные шаги, которые являются общими, что для деплоя сайта через хостинг, что через VPS.
Приобретаем домен и создаём поддомен
С самого начала тебе потребуется уже оплаченный хостинг бегет, плюс приобрести домен. На странице по адресу https://cp.beget.com/domains/register введи любое название домена, которое тебе понравится и нажми продолжить:

После, вас перенаправят на страницу с настройками домена. Вот что тебе нужно знать:
- Это имя твоего домена
- Ни куда не направляем
- После нам потребуется отредактировать несколько DNS-записей для корректной работы домена
- В качестве бонуса получим бесплатный SSL-сертификат, это потребуется для перехода от протокола http к https.

Я получил свой второй домен бесплатно - bddt.space. На нём я и буду демонстрировать, то как добавить поддомен для него и как привязать его к сайту (будь он на VPS или на основном хостинге)
Давай добавим поддомен для тестового сайта. Если ты помнишь, я собираюсь иметь как боевой сервер, так и тестовый, размещённый на поддомене. Давай добавим staging поддомен:

Теперь у нас есть домен и поддомен для развёртывания. Помним, если тебе не нужна тестовая составляющая сайта - не добавляй поддомен.
Создаём базу данных
Зайди на страницу управления базами данных и создай одну:

- Имя твоей базы данных (У меня это будет timachuduk_bddt)
- Пароль, запомни или запиши (Не скажу)
- Добавляем
- Необходим для подключений сайтов созданных для VPS
Всё, база данных готова для использования через хостинг, но не через VPS. Дело в том, что нужно ещё разрешить подключение удалённых адресов. Чтобы это сделать:


Теперь к ней можно подключиться и из удалённого адреса, а не только с той же машины на которой эта база данных размещена. Когда мы дойдём до раздела по написанию файла конфигурации, там, нам пригодятся данные, которые были сгенерированы в этой главе.
Создаём почтовый сервер
Зайди на страницу управления почтовыми ящиками. Там ты увидишь адреса твоих сайтов, нажми на свой:

После, необходимо будет добавить новый ящик.

- Вводишь желаемое имя (без @., и прочего)
- Генерируешь пароль (сохрани)
- Запомни полное название своего ящика, он пригодиться
На этом базовое создание и почтового ящика закончено. Дальше я покажу куда и что писать при конфигурации почты сайта.
Разворачиваем сайт на хостинге
Подготовка или связываем домен с сайтом
Хочу начать с простого способа. Предварительно нам потребуется создать сайт и привязать к нему домен. Всё делается на странице https://cp.beget.com/sites:

Так же, после создания сайта, в настройках укажи редирект с HTTP на HTTPS. Мы ведь хотим, чтобы у нас было защищённое соединение. Я создам 2 сайта один для bddt.space другой для staging.bddt.space. Опять же, если тебе не нужен тестовый функционал, можешь создать только один.
Подключение к хостингу через SSH
Чтобы иметь возможность работать с удалённым сервером, нам необходимо подключиться к нему. Есть несколько способов это сделать, самый простой это использовать встроенные команды и утилиты самого хостинга. Но я буду использовать более олдскульный способ - SSH.
Чтобы это сделать, используй следующую команду в терминале:
Где вместо USERNAME_PLACEHOLDER используй имя созданного пользователя (или логин). После чего, нужно будет ещё войти в докер:
После того как мы успешно вошли в докер, создадим и зайдём в tmp директорию, где и будем устанавливать необходимые пакеты:
Устанавливаем OpenSSL
Для корректной работы Django приложений начиная от 4.4 версии, необходимо использовать версию OpenSSL 1.1.1 и выше. Давай её установим и разархивируем полученный архив:
Теперь, когда данный архив у нас есть, нужно будет сначала сконфигурировать файл для компиляции (make файл), а потом, непосредственно, скомпилировать и установить (используя ранее сгенерированный make файл):
Чтобы проверить, успешно ли был установлен openssl, выполни следующую команду(она должна вернуть версию openssl, т.е. 1.1.1l:
Устанавливаем Python
После того как openssl установлен можно перейти к установке python. Важно отметить что python версии 2.7 уже установлен на систему. Но, так как я лично не люблю данную версию, а ещё она сильно устарела, и её уже почти никто не использует, мы установим python версии 3.11.0.
Теперь очередь за Python. Вернёмся обратно в ~/.beget/tmp, скачаем, а после и разархивируем:
Мы успешно скачали и разархивировали Python приложение, теперь нужно будет сгенерировать файл make для последующей установки в систему:
Чтобы проверить, всё ли установленно и установленно правильно, можно выполнить следующую команду:
Готовим файловую структуру сайта, переносим проект на сервер
У нас есть всё необходимое, чтобы развернуть сайт на хостинг. Для этого обратимся к git репозиторию и скачаем наш сайт в директорию source. Но сначала зайдём в нужную директорию. У тебя дома(~), должна была появиться соответствующая директория под названием того домена, который ты закрепил за сайтом в самом начале. В моём случае это будет staging.bddt.space, зайдём туда и клонируем его:
Теперь создадим виртуальное окружение для данного сайта и установим туда все необходимые пакеты для работы сайта(предварительно активировав его):
Перед тем как устанавливать какие бы то ни было пакеты, лучше убедиться что ты активировал нужное виртуальное окружение, делается это используя команду which, которая укажет путь исполняемой команды. Так, мы узнаем какой питон мы используем:
И если, например (/home/t/timachuduk/staging.bddt.space/venv/bin/python) , ты получил путь который содержит имя виртуального окружения, то всё гуд и ты успешно активировал виртуальное окружение. Можешь с уверенностью устанавливать необходимые пакеты:
Конфигурация файлов работы сервера (.htaccess, passenger_wsgi.py, settings.py)
Теперь нужно настроить некоторые особые файлы для корректной работы (и вообще работы) сайта. Начну с файла passenger_wsgi.py.
Файл passenger_wsgi.py
Этот файл свяжет твоё django-приложение с сервером apache. Этот файл необходим для Passenger - программа для развёртывания Python-приложений на сервере (Ближайший аналог - Gunicorn).
Его нужно ещё создать в корневой директории сайта т.е. ~/staging.bddt.space:
И его необходимо ещё настроить:
- Где под первым комментарием указывается путь до корня твоего проекта ( это там где manage.py файл находится).
- Где под вторым комментарием указывается путь до установленных пакетов через виртуальное окружение.
- Где под третьим комментарием указывается путь до файла settings.py относительно указанного первого путя.
Файл settings.py
Когда ты закончил с созданием и конфигурацией файла для Passenger, можно заняться редактированием файла settings.py. Нам необходимо будет только добавить домен staging.bddt.space в ALLOWED_HOSTS.
Я не меняю файлы конфигурации в settings.py непосредственно. Делаю я это через файл settings.json, который после читается на старте самого приложения. Значения которых и добавляются в необходимые мне константы.
Как я переношу, данные из settings.json в Website/settings.py? В файле settings.py я открываю файл settings.json и читаю от туда данные, вот так:
Использую JSON-формат, ибо просто очень удобно с ним работать через Python. Таким образом я могу спокойно пушить данный файл (settings.py) в коммит не опасаясь, что я могу случайно поместить туда чувствительные данные.
Файл .htaccess
Необходимо сказать веб-серверу Apache, как и через что вообще запускать наше Django-приложение. Делается это через файл .htaccess. Мы укажем, что хотим использовать Passenger и укажем, какую именно версию питона будет использовать:
Данный файл должен быть в корневой директории сайта, т.е. там где public_html директория.
Конфигурация статических и медиа файлов
Последнее, что осталось настроить это места, где будут располагаться статические и медиа файлы. Дело в том, что apache-сервер имеет доступ только к директории public_html, но не к директории Django-приложения. Верно и обратное Django-приложение не имеет доступ к public_html директории ...
По этому, когда твой сайт будет обрабатывать статику и пытаться загрузить на сервер медиа файлы, ему нужно помочь. Это легко можно сделать при помощи создания мягких ссылок, вот так:
И конечно же нужно создать соответствующие директории в public_html:
Завершаем развёртывание сайта
И последними штрихами для завершения развёртывания сайта являются следующие команды:
- Миграция базы данных [./manage.py migrate]
- Сбор статических файлов [./manage.py collectstatic]
- Компиляция переводов (если есть) [./manage.py compilemessages]
- Проверка тестов (если есть) [./manage.py test]
После успешного выполнения каждой из них, можно считать, что сайт успешно развёрнут.
Дополнительно (опционально, хотя не очень)
В следующих главах я описал дополнительные действия, которые можно проделать над вашим новый сайтом, с той целью, чтобы улучшить его работу, безопасность или просто быстрее обновить внесённые изменения.
Как перезагрузить сайт на Django если внёс изменения на нём ?
Сервер почти готов, но сначала нужно обновить сервер, вернее сказать, перезапустить наше Django-приложение. Чтобы заставить Passenger это сделать, нужно создать ещё одну директорию tmp и создать там файл restart.txt:
Теперь, чтобы перезапустить Passenger, нужно только пересоздать файл restart.txt.
Как перенести локальную базу данных на сервер ?
Иногда, хочется держать сервер в продакшене и в разработке синхронизированными. То есть, чтобы они оперировали одной и той же базой данных. А иногда хочется сохранить свой труд и обезопасить его от сбоев и неожиданных потерях.
Для этого можно сделать дамп базы данных и загрузить его, уже на сервере. У Django есть такая встроенная функция, которая позволяет сделать всё выше описанное.
Будет создан дамп базы данных (data.json), который можно будет переместить на сервер при помощи команды scp(не путать с фондом w(°o°)w ). Флаг --exclude необходим для исключения некоторых таблиц при экспорте.
Для того чтобы успешно передать файл с локальной машины на сервер, тебе потребуется знать адрес сервера и место, куда ты бы хотел отправить файл. Где timachuduk это твой логин при создании, а timachuduk.beget.tech, это адрес твоего сервера на beget. Всё это можно найти на главной странице хостинга.
Уже на сервере, нужно будет запустить команду загрузки базы данных, предварительно зайдя в директорию с manage.py файлом внутри.)
Как перенести сайт на HTTPS протокол?
Ты наверняка заметил, что твой сайт сейчас работает на HTTP протоколе, что в наше время не очень поощряется - ни пользователями, ни браузерами, ни поисковиками. Давай исправим это.
На домен bddt.space мы уже выпустили сертификат, но на поддомен нет:

- Выбираем тип сертификата, бесплатный нам подойдёт.
- Выбираем поддомен на который хотим распространить работу сертификата.
Потребуется подождать некоторое время. На самом сайте говорят, что это может занять от 15 минут до 2 дней. Так что дааа ... У меня всё установилось за 10 минут, кстати.
После этого, нужно настроить редирект с http на https. Для этого, на странице управлениями сайтами https://cp.beget.com/sites нужно:

- Выбрать сайт, для которого настроить редирект
- Включить редирект
Это опять же может занять некоторое время, около 15 минут. Но если все предыдущие шаги были сделаны правильно, переход на https версию не должен быть проблемой.
Разворачиваем сайт на VPS
Я рад, что ты решил пойти может не самым простым, но точно самым интересным путём. Даже более, если смог научиться разворачивать сайт на VPS от beget, то ты сможешь развернуть сайт и на других VPS, в независимости от хостинг провайдера.
Давай сделаю небольшой обзор того, что ты должен знать или что ты узнаешь в ходе прочтения данной главы:
- Работа в Linux-терминале
- Работа через оболочку SSH
- Работа с сервисами и демонами через systemctl
- Настройка и работа с Nginx сервером
- Настройка и работа с Gunicorn
- Написание и выполнение Bash-скриптов
Создаём VPS на beget
Первым делом создадим VPS и настроим его. В личном кабинете, на табе с облачком, нажми создать VPS.

Дальше вас ждёт, страница конфигурации в которой следует выбрать Ubuntu и настроить параметры сервера (ко-во ядер, место на диске, оперативку). Можно так же добавить свой SSH-ключ для доступа без пароля. О том как такой ключ можно сделать и как его использовать я написал отдельную статью.

Мы успешно создали виртуальную машину, теперь нужно чтобы с этой машиной ассоциировался купленный нами домен bddt.space. Для этого нужно отредактировать А-запись в DNS. Скопируй IP адрес своего VPS и отредактируй A-запись.

Копируем IP-адрес

Выбираем свой домен, после чего редактируем А-записи в необходимых доменах и поддоменах
Я нашёл вот такую вот, классную инфографику DNS-записей, которая вкратце показывает для чего каждая запись используется. Здесь представлены не все записи, только самые используемые:

Взял от сюда - https://www.nslookup.io/learning/dns-record-types/
Подключаемся к VPS
После создания сервера нужно будет его немного настроить. Совсем чуть-чуть. Установить необходимый минимум пакетов, плюс создать пользователя от лица которого будет запускаться сайт.
Чтобы всё это сделать надо сначала попасть на него. Сделаем мы это через SSH.
Я буду использовать PowerShell, в качестве терминальной оболочки, через которую подключусь к серверу. Вообще не имеет значение через что ты подключишься к серверу. Это может быть Git Bash, PowerShell, PuTTy или что-то ещё. Главное чтобы был установлен SSH-клиент на вашей машине.
Чтобы подключиться к удалённому серверу открой свой любимый терминал и введи следующую команду:
Или, если ты загрузил при создании VPS, ключ аутентификации, можно использовать его (нужен именно приватный):
- Где root - это имя пользователя, через которого ты хочешь иметь доступ к серверу.
- Где 192.168.1.1 - это адрес сервера к которому ты хочешь подключиться.
- Где .ssh/rsa_key - это путь к приватному ключу для подключения без пароля
Всё это, можно найти на странице, ранее созданного VPS. Ну кроме ключа, при его создании, ты должен был запомнить, где его сохранил :). Обычно это .ssh директория.

Устанавливаем необходимые пакеты
Теперь время для Ctrl-C, Ctrl-V. Сейчас будет немного команд, которые установят на ваш сервер необходимые пакеты:
Теперь давай поговорим о том, для чего я всё это установил, и что сделала каждая из этих команд:
- apt-get update - всегда выполняй её первой, при установке любого пакета. Она синхронизирует индекс пакетов приложений и обновляет все зависимости, при необходимости.
- apt-get upgrade - устанавливает самые последние версии установленных пакетов на системе.
- apt-get install gettext libgettextpo-dev - она устанавливает зависимости необходимые для генерации переводов для твоих сайтов (которые используют утилиту gettext)
- apt-get install pkg-config default-libmysqlclient-dev build-essential - необходимые зависимости для работы с базами данных на MySQL.
- apt-get install nginx - для запуска веб-сервера
- apt-get install gunicorn - для переадресации запросов от nginx-сервера к нашему django-приложению
- apt-get install python3-dev python3.12-venv - для возможности создания виртуального окружения при работе python-приложений
Мой "не необходимый" пакет - это selenium. Чтобы мои функциональные тесты отработали, мне он необходим. И чтобы он работал, ему потребуется браузер Firefox, который мы и установим как .deb пакет. О бой, это то ещё приключение ヽ(°〇°)ノ. Всех интересующихся приглашаю посетить официальный сайт мозилы и выполнить одну команду за другой.
В дополнение к firefox, потребуется ещё установить geckodriver. Версии последних релизов можно найти здесь: https://github.com/mozilla/geckodriver/releases . И теперь, команда для установки этого geckodriver:
Скачав (wget) и разархивировав geckodriver (tar -xzvf), мы после поместили его в /usr/local/bin/ директорию, чтобы у всех приложений был доступ к драйверу.
Создаём пользователя
Этот шаг обязателен и не думай делать сайт на root-правах. Сейчас необходимо будет создать пользователя с root привилегиями и домашней директорией.
Первая команда создаст пользователя по имени "site", создаст для него домашнюю директорию (флаг -m) и установит командную оболочку по умолчанию т.е. bash. Вторая команда задаст пароль для нового пользователя. Третья добавит пользователя "site" в sudo группу, которая способна выполнять все команды, только с использованием команды sudo.
Перенос проекта
База для нашего сервера готова, теперь давай займёмся файлами самого сайта. Я собираюсь создать простую файловую структуру, где при помощи git получу файлы своего проекта и скопирую их в source директорию. А так же, создам виртуальное окружение:
После выполнения всех этих команд, у тебя должна будет получиться следующая структура проекта:
- staging.bddt.space
<-Ты тут - venv
- source
Теперь, активируем виртуальное окружение и установим необходимые пакеты из source/requirements.txt:
Здесь не должно возникнуть ни каких проблем, но если всё таки возникли прочитайте внимательно логи ошибок. Зачастую, это просто не установленные зависимости на сервере, которые легко исправить при помощи пакетного менеджера apt. Давай попробуем запустить установленное Django-приложение (предварительно зайдя в директорию с файлом manage.py:
Настройка базы данных mysql и почты (опционально, хотя не очень)
Тебе выдаст ошибку, что файл settings.json не был найден. Это файл конфигурации, который я использую как прокси, вместо того чтобы писать непосредственно в settings.py. Сделал я это с той целью, чтобы можно было безопасно добавлять файл settings.py в git репозиторий и для упрощения развёртывания.
Вот пример такого файла(settings.json), создай его в source/Website директории:
Как ты видишь, я уже использую MySQL в качестве базы данных. Что нужно знать для подключения к базе данных из VPS:
- Во-первых нужно знать какой бекенд подключать - django.db.backends.mysql
- Во-вторых имя пользователя и базы данных, они будут совпадать - timachuduk_bddt
- В-третьих, пароль от базы данных - xW%exys3ORGS
- В-четвёртых, имя хоста базы данных - его можно найти на странице настройки баз данных
- И в пятых порт подключения - он всегда один и тот же - 3306
Все эти данные можно получить при создании своей базы данных, процесс которого я описал в соответствующей главе в начале.
Так же, у меня ещё настроенна почта. Давай я расскажу для чего существует каждая их этих переменных:
- DEFAULT_FROM_EMAIL - это адрес почты от имени которого мы отправляем сообщения. Необязательно
- DEFAULT_TO_EMAIL - это адрес почты на имя которой отправляется сообщение. Необязательно
- EMAIL_HOST - это константа, smtp.beget.com
- EMAIL_PORT - это константа, 25
- EMAIL_HOST_USER - имя ранее созданного почтового ящика, bddt@bddt.space в моём случае
- EMAIL_HOST_PASSWORD - ранее заданный пароль
Как я переношу, данные из settings.json в Website/settings.py? В файле settings.py я открываю файл settings.json и читаю от туда данные, вот так:
Использую JSON-формат, ибо просто очень удобно с ним работать через Python.
Заканчиваем перенос проекта
Уже, кстати, можно запустить тесты и посмотреть, что работает, а что нет. Всё должно отработать:

Итак, мы успешно закинули наш сайт на сервер и даже прошли все тесты. А это значит, что пора настроить nginx, после чего свяжем наш сайт с nginx веб-сервером через gunicorn.
Настраиваем Nginx
Вместе с файлами проекта, ты ещё получишь дефолтные файлы конфигурации для настройки nginx - nginx-server-http_only.conf, nginx-server-https_301.conf, nginx-server-https.conf. Пока открой файл nginx-server-http_only.conf, ты увидишь следующую конфигурацию для нашего сайта:
- В этой конфигурации мы настраиваем порт на котором мы будем слушать входящие запросы.
- Имя для нашего сервера (доменное имя). В моём случае это должно быть staging.bddt.space.
- Папки, которые этот сервер будет обслуживать. Как минимум нужно настроить корневой каталог "/". Но этим всё не ограничивается, на моём сайте используется различная статика в виде картинок и иконок. Плюс медиа файлы, которые загружаются непосредственно пользователем.
Итак, финальная версия этой конфигурации будет выглядеть вот так:
Чтобы не забыть, давай сразу создадим директории media и static в ~/staging.bddt.space директории и мягкие ссылки на них. Мягкие ссылки на них создаются с тем, чтобы предоставить серверу доступ к ним.
Все необходимые директории были созданны и теперь мы готовы создать мягкие ссылки, на эти директории:
Теперь у проекта следующая структура:
- staging.bddt.space
- venv
- media
- static
- source
- Website
- Backend
- Frontend
- Website
- media -> ../../media
- static -> ../../static
- manage.py
- settings.json
- deploy.sh
- server-setup.sh
- requirements.txt
- gunicorn.service
- nginx-server-http_only.conf
- nginx-server-on_https-301.conf
- nginx-server-on_https.conf
Теперь, любой файл который будет создан в директории ~/staging.bddt.space/source/Website/static или ~/staging.bddt.space/source/Website/media будет доступен и в директориях ~/staging.bddt.space/static и ~/staging.bddt.space/media.
Чтобы это проверить, можешь запустить команду collectstatic и убедиться что все файлы, хоть и были скопированы в ~/staging.bddt/source/Website/static, так же доступны и в ~/staging.bddt.space/static.
Решаем проблему с 403 ошибкой - запрещено
Ещё одна, очень часто возникающая проблема, это то что сервер может возвращать 403 ответ на запрос какого-нибудь статического файла. Зачастую это связано с тем что у пользователя www-data, нет разрешения на чтение определённых файлов. В файле настройки nginx указан пользователь от лица которого и запускается веб-сервер.
Чтобы это исправить есть три способа:
- Заменить пользователя в файле /etc/nginx/nginx.conf
- Дать доступ всем к чтению файлов
- Добавить пользователя www-data в группу пользователя, который запускает приложение.
Я опишу 3-й ибо это, на мой взгляд самый простой и правильный способ. И нужно всего лишь выполнить одну команду:
- site - имя группы к которому хотите добавить пользователя (оно будет совпадать с именем пользователя)
- www-data - имя пользователя, которого хотите присоединить к группе.
Теперь вся статика, и все медиа файлы на сайте должны быть доступны.
Заканчиваем настройку Nginx
Давай закончим настраивать веб-сервер и скопируем созданный файл конфигурации в /etc/nginx/sites-available:
Теперь сделаем то же самое что и с директориями static и медиа, создадим мягкую ссылку на этот файл конфигурации. Но сначала перейди в директорию где должна быть эта ссылка:
Перезапустим nginx-службу при помощи systemctl, чтобы изменения вошли в силу:
Я думаю, сейчас стоит попробовать посетить наш сайт - staging.bddt.space.

И да, ты должен увидеть что-то вроде этого. Почему так происходит, что за "Плохой шлюз"? А дело всё в одной строке, в файле конфигурации сайта /etc/nginx/sites-available/staging-nginx-server.conf.
По факту, nginx-сервер перенаправил мой GET-запрос по указанному сокету, но к нему ещё ничего не подключено. Вот на этом моменте в роль вступает gunicorn.
Настраиваем Gunicorn
Почти готовый файл конфигурации, находится там же где и файл конфигурации nginx-сервера - ~/staging.bddt.space/source/gunicorn.service. Это файл описывающий работу linux-демона, вот его содержимое:
Данный сервис(демон), запущенный пользователем site и с его привилегиями, будет перезагружаться каждый раз при возникновении какой-либо ошибки (Restart=on-failure). Работать данный демон будет в директории указанной в WorkingDirectory. А делать он будет то, что указано в ExecStart, то есть запускать gunicorn сервер.
При запуске gunicorn мы так же указали к какому сокету подключаться и куда перенаправлять запросы - в наше Django-приложение.
Создай такой же файл в /etc/systemd/system/ и отредактируй вставив своего пользователя, свой домен и свой сокет. Теперь запустим службу и сделаем так, чтобы она запускалась на сервере при загрузке.
Теперь всё будет работать. Мы создали специальный сервис, который запускает gunicorn-сервер при старте, а он в свою очередь запускает наше django-приложение. Обновив вкладку, ты должен будешь увидеть следующее:

Переходим на HTTPS (опционально, хотя не очень)
Вообще, изначально, я думал, что есть какой-то способ получить(переместить) сгенерированный сертификат от Beget на VPS. Но я такого способа не нашёл.
Поэтому, решил получить сертификат от LetsEncrypt непосредственно. Он бесплатный, но что более классно, всё можно сделать через командную строку, а значит автоматизировать. Смотри, для того чтобы, настроить nginx веб-сервер потребуется сертификат и ключ к нему.
Команда LetsEncrypt, сделала специальную утилиту, которая очень крутая в плане поддерживаемых стеков технологий для сертификации. Вот, например страница для генерации, подписи и издания сертификатов для сайтов на nginx и использующий pip. Просто чума) И не нужно этой мозгоебли с самоподписанными сертификатами, которым никто не доверяет, и как результат, никто не заходит на сайт.
Активируем виртуальное окружение и установим программу:
Теперь генерируем и подписываем сертификаты:
Данная команда сгенерирует и подпишет сертификаты, которые расположит в /etc/letsencrypt/live/staging.bddt.space. Ты увидишь вот такой вот интерактивный промпт:

- Просит ввести почту
- Согласись на продажу своей души и души своего сайта)
- Регистрация, по желанию
- Выбор доменов(поддоменов) для который будет действовать данный сертификат. Если просто нажать ENTER, сертификат будет применён ко всем.
- Путь до сертификата (для настройки nginx)
- Путь до ключа (для настройки nginx)
Можно так же задать cron-задачу на обновление сертификата, каждый месяц:
Осталось только поменять конфигурации в sites-available, делается это так:
Отличие от предыдущей конфигурации состоит в том, что мы поменяли порт и добавили ssl_certificate и ssl_certificate_key. Пути для которых вам скажет certbot. Вот собственно и всё, по тому как добавить https на ваш сайт.
Но ты мог заметить, что при попытке получить свой сайт через обычный http, уже не получиться. Нужно будет сделать отдельную конфигурацию для 80 порта и сделать 301 редирект на https версию. Это считается хорошей практикой. Для этого создайте ещё один файл конфигурации в /etc/nginx/sites-available, например http_301_redirect-staging.bddt.space, и создайте файл со следующей конфигурацией:
Где HOST_PLACE_SETUP, это домен вашего сайта, например staging.bddt.space. Данная конфигурация делает 301 редирект с любых страниц с протоколом http на страницы с протоколом https.
Деплой боевого сервера (опционально)
Самая тяжёлая часть пройдена. И если ты хотел просто развернуть сайт без каких-либо тестовых версий и поддоменов, то тут ты можешь остановиться. Ведь мне больше нечего сказать по этому поводу. Сайт развернули, почтовый сервис и базы данных подключили, сервера nginx и gunicorn настроили, HTTPS протокол подключили.
Ну а если ты, как и я хотел развернуть сначала тестовый сайт, давай продолжим.
По сути, чтобы развернуть уже боевой сервер, нужно проделать всё то же самое что и с тестовым, только выбрать соответствующий домен. Как ты уже понял это не самое весёлое занятие по этому я написал 2 bash скрипта, которые помогут в настройке сервера - server-setup.sh и в подготовке файловой системы и проекта в целом - deploy.sh.
Я не буду расписывать, особенности работы этих скриптов, ибо написал о них отдельно, смотри ссылки. По факту, скрипт deploy.sh описывает главу "Перенос проекта" с некоторыми особенностями работы git. А скрипт server-setup.sh описывает главы: Настраиваем Nginx, Настраиваем Gunicorn и Переходим на HTTPS.
Сначала запустим скрипт server-setup.sh:
- bddt.space - это домен боевого сервера
- on_https - это флаг, который указывает скрипту разместить сайт сразу на протоколе HTTPS
Запустив, ты увидишь, что-то вроде этого:

Теперь деплой. Скрипт deploy.sh как раз этим и занимается. Он работает в тандеме с git, по этому желательно его иметь установленным. Если указанного сайта ещё нет на сервере он его клонирует с репозитория и соответственно настроит. А если он уже есть он обновит его до последнего совершённого комита.
- Где bddt.space - домен твоего боевого сервера.
- Где --skip-tests - пропуск тестов
Вот что выдаст скрипт deploy.sh, при запуске:

Всё, мы закончили разворачивать боевой сервер. И теперь наш рабочий процесс будет выглядеть следующим образом, по крайней мене, я так его вижу:
- Мы делаем некоторые изменения в проекте на локальном сервере на ноутбуке(например)
- Делаем коммит
- Подключаемся к серверу и тащим(git pull) обновления на тестовый сервер - staging.bddt.space
- Запускаем тесты (Функциональные, Модульные). Сами, в конце концов, обозреваем не сломали ли чего
- Если всё ок, запускаем deploy.sh и изменения, которые были сделаны на локальном сервере применяются на боевом сервере - bddt.space.
Сравнение запуска сайта через Хостинг и через VPS
Я решил написать сравнение в форме таблицы, где явно покажу что и где лучше делать.
| Возможность тестирования | Нет или ограничена | Без ограничений |
| Кастомная структура проекта | Ограничена | Без ограничений |
| Автоматизация, деплоя, настроек и пр. | Ограничена | Без ограничений |
| WSGI сервер | Passenger | Без ограничений |
| Веб сервер | Apache | Без ограничений |
| Переход на HTTPS | Почти незамтена | Сложно |
| Настройка базы данных | Лекго | Чуть сложнее |
| Настройка почты | Легко | Легко |
| Подключение домена | Почти незаметна | Сложно |
| Цена | Дёшево | Дороже |
| Показатели | Beget Hosting | Beget VPS |
|---|
Могу сказать, что мой выбор это всё-таки разворачивание сайта на VPS. Это даёт мне больше свободы, но и ответственности тоже. Для меня лично, очень большим минусом является отсутствие тестирование как такового на хостинге. Они чего-то не до установили и теперь TDD тут не сделаешь, а я очень хочу (╥_╥)
Заключение
Надеюсь, что я просто ошибаюсь и просто чего-то не знаю и запускать тесты всё-таки можно и даже функциональные. Но, если тебе не нужна тестовая прослойка или просто хочется установить сайт, чтобы его видели, то beget хорошо подходит для этого. Просто, понятно, наглядно.
А так, я надеюсь, что данная статья помогла тебе разобраться с тем как и где разворачивать твой сайт написанный на Django. Ещё я надеюсь на твой благой комментарий и тем, что ты можешь захотеть поделиться этой статьёй с другом или подругой. В любом случае до встречи в следующей статье (⌒‿⌒)