Деплой Django-приложения на виртуальный хостинг

В этой статье мы разберем, как загрузить Django-приложение на хостинг на примере full-stack приложения, в котором Django выполняет роль бэкэнда, а React — фронтэнда.
Настройка WSGI файла
WSGI (Web Server Gateway Interface) — это стандарт, который позволяет веб-серверу взаимодействовать с вашим Django-приложением. Этот файл необходим для того, чтобы сервер знал, как запускать и работать с Django-приложением.
WSGI файл обычно называется passenger_wsgi.py или wsgi.py и находится в корне вашего проекта. В нем прописываются настройки для корректной работы приложения на сервере.
Почему WSGI файл называется passenger_wsgi.py? Связано это с использованием на хостинге Phusion Passenger — популярного веб-сервера и приложения для деплоя на shared-хостингах и VPS.
import os
import sys
sys.path.insert(0, os.path.dirname(__file__))
# Указываем путь до manage.py
sys.path.append(os.path.dirname(__file__) + "path/to/your_app")
# Указываем путь до settings.py
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_app.settings')
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()Настройка settings.py
Переменные окружения
Вместо того чтобы хранить чувствительные данные (например, секретные ключи, пароли к базам данных или API-токены) прямо в коде, их лучше выносить в переменные окружения, чтобы не допустить утечек при публикации проекта или работе с Git.
Для работы приложения в settings.py необходимо указать такие чувствительные данные как:
- секретный ключ,
- имя, логин и пароль пользователя для подключения к БД
Такие данные лучше хранить в отдельном .env файле, чтобы недопустить утечек данных при публикации проекта или работе с Git.
Чтобы подключить переменные окружения, нужно установить модуль python-dotenv и подключить его в файле settings.py:
pip install python-dotenvimport os
from dotenv import load_dotenv
load_dotenv()После установки python-dotenv переменные окружения можно использовать следующим образом:
SECRET_KEY = os.getenv("название_переменной")- с помощью
SECRET_KEYзлоумышленники могут подделать cookies и получить доступ к чужим аккаунтам - с помощью данных для подключения к базе данных злоумышленники могут прочитать, изменить или удалить БД, добавить в БД вредоносные скрипты или обойти логику приложения
- использовать переменные окружения
.env - не коммитить
.envилиsettings.pyс настоящими паролями, а если случайно закоммитили пароли - обязательно поменяйте их - настроить файрволлы и доступ к базе только с доверенных IP
Настройка ALLOWED_HOSTS
В Django настройка ALLOWED_HOSTS определяет, какие доменные имена или IP-адреса могут обращаться к вашему приложению. Это важная мера безопасности, которая помогает предотвратить такие атаки, как DNS spoofing (подделка DNS-запросов) и HTTP Host header attacks (атаки с подменой заголовка Host).
Когда сервер получает HTTP-запрос, он проверяет значение заголовка Host и сравнивает его с доменами или IP-адресами, указанными в ALLOWED_HOSTS. Если значение заголовка не совпадает с разрешенными адресами, сервер отклоняет запрос и возвращает ошибку 400 (Bad Request).
В файле settings.py нужно указать только допустимые хосты, которые будут обслуживаться на сервере.
Указывать * в ALLOWED_HOSTS в продакшене нельзя, поскольку это может привести к проблемам с безопасностью, описанным выше.
ALLOWED_HOSTS = [
"your-site.com",
"www.your-site.com"
]Подключение БД
Для работы приложению на Django нужна база данных (БД). Django из коробки поддерживает все самые популярные решения, как MySQL, PostgreSQL и т.д.
mysqlclient — это популярная библиотека для работы Django с базой данных MySQL, но она требует компиляции на стороне сервера.
На виртуальном хостинге (shared hosting) часто невозможно установить mysqlclient, потому что:
- нет прав администратора (root access)
- нет необходимых системных библиотек
В таких случаях лучше использовать альтернативы как pymysql или mysql-connector-python.
mysql-connector-python — это официальная библиотека от MySQL для подключения к базам данных из Python. Она написана полностью на Python, не требует компиляции, и поэтому хорошо подходит для виртуального хостинга.
Для подключения mysql-connector-python к Django нужно установить библиотеку и в settings.py указать новый движок:
DATABASES = {
"default": {
"ENGINE": "mysql.connector.django",
...
}
}PyMySQL — это Python-библиотека для подключения к MySQL, которая не требует установки дополнительных системных компонентов и компиляции.
Для подключения PyMySQL к Django нужно установить библиотеку и добавить следующий код в __init__.py:
import pymysql
pymysql.install_as_MySQLdb()Пример подключения БД
DATABASES = {
"default": {
"ENGINE": "django.db.backends.mysql",
# если PostgreSQL = django.db.backends.postgresql
# если mysql-connector-python = mysql.connector.django
"NAME": os.getenv("название_переменной"),
"USER": os.getenv("название_переменной"),
"PASSWORD": os.getenv("название_переменной"),
"HOST": os.getenv("название_переменной"),
"PORT": os.getenv("название_переменной"),
# если в БД есть кириллица, нужно указать кодировку utf-8
"OPTIONS": {
"charset": "utf8mb4",
}
}
}Сортировка БД
Сортировка (collation) в базе данных определяет, как сравниваются и сортируются текстовые значения. Она влияет на:
- Порядок сортировки — например, будет ли а идти перед
Я, илиAпередa. - Сравнение строк — будет ли
Привет=привет, зависит от чувствительности к регистру. - Поиск по тексту — учитываются ли диакритические знаки, регистр и язык.
В Django сортировка влияет на результаты запросов, фильтры (.filter(name='Test')), порядок (.order_by('name')) и уникальность строк.
utf8mb4_general_ci — сортирует без учёта регистра (ci = case-insensitive) и достаточно быстро, но без языковых нюансов.
utf8mb4_general_ci?- поддержка многоязычного текста (русский, английский и другие языки),
- поддержка пользовательского ввода, включая эмодзи, спецсимволы и юникод,
- нет проблем с сохранением нестандартных символов.
- Выберите нужную БД в phpMyAdmin
- Перейдите во вкладку Operations
- Пролистайте до раздела Collation в конце страницы
Статические файлы
Статические файлы в Django — это ресурсы, которые отображаются на странице в браузере. К ним относятся HTML, CSS, JS-файлы, а также изображения, видео, музыка, векторная графика и GIF-анимации.
Необходимо правильно указать пути к этим статическим файлам, чтобы они корректно отображались после деплоя Django. Например, в full-stack приложении, где за бэкенд отвечает Django REST Framework, а за фронтенд — React, потребуется настроить путь к build-файлам React.
Сделать это можно добавив путь к параметру STATICFILES_DIRS в settings.py.
Деплой React + Django
Так как фронтенд приложения написан на React, его нужно сначала «собрать» с помощью команды npm run build, чтобы получить готовые HTML, CSS и JS файлы.
Эти файлы Django будет использовать как обычные статические ресурсы, поэтому в settings.py нужно указать путь к ним через STATICFILES_DIRS.
STATIC_URL = '/static/'
STATICFILES_DIRS = [
FRONTEND_DIR / "build",
# или [os.path.join(BASE_DIR, "путь_к_папке_build_React")]
]
STATIC_ROOT = BASE_DIR / "static"Позволяет Django обслуживать интерфейс React напрямую без дополнительного веб-сервера.
Фронтенд и бэкенд работают как единое приложение, где Django сам отдаёт собранный React через index.html и static.
- Подходит для простых проектов, где удобнее всё держать в одном месте
- Быстрее настраивается, меньше DevOps-сложностей
- Хорошо для MVP, прототипов, внутренних админок
- Масштабировать или кэшировать такую систему сложнее
Метод обратного прокси (reverse proxy setup)
При деплое с обратным прокси (например, Nginx) фронтенд и бэкенд работают отдельно: React-приложение собирается и размещается как обычный сайт (HTML, JS, CSS), а Django отвечает только за API-запросы.
Nginx настраивается так, чтобы запросы к /api/ шли к Django, а все остальные — к статическим файлам React. Такой подход разделяет ответственность и улучшает производительность.
- Лучше для масштабируемых приложений, продакшена, проекта с высокой нагрузкой, или если есть отдельная команда фронта
- Разделение фронта и бэка даёт гибкость: можно развернуть на разных серверах
- Можно кэшировать фронт отдельно, обновлять без перезапуска сервера
- Требует доп. настройки: Nginx, домены, HTTPS, и т.д.
Генерация статических файлов
Чтобы сгенерировать все статические файлы проекта, нужно прописать в терминале следующую команду:
python manage.py collectstaticПосле этого файлы будут доступны по пути, указанному в STATIC_URL.
Необходимо перенести папку /static/ (со всеми сгенерированными файлами) в директорию PUBLIC_HTML на хостинге. Это позволит корректно отображать статические файлы (CSS, JavaScript, изображения и т.д.) на вашем сайте.
Чек-лист под деплою Django-приложения на виртуальный хостинг (cPanel)
- Клонировать репозиторий в новую папку
- Настроить
Set up Python Appв этой же папке - Подключится к
venvпроекта в терминале - Установить все dependencies проекта через
pip install - Если у некоторых dependencies ошибки
- Нужно поробовать установить binary версию
- Если дело в модулях для подключения БД, как mysqlclient, установить аналоги на чистом python
- В случае с
PyMySQL, нужно добавитьimportи инициализировать их в файле__init__.py
- Создать заново или настроить уже существующие переменные окружения (environment variables)
- Отредактировать код в
passenger_wsgi.py - Добавить домен в
ALLOWED_HOSTSиCORS_HEADERSвsettings.py - Подключить БД в
settings.py - Изменить сортировку БД на
utf8_mb4 general ci - Мигрировать все изменения в БД с помощью
python manage.py makemigrationsиpython manage.py migrate - Собрать все статические файлы с помощью
python manage.py collectstatic - Если домен основной на сервере — переместить папку
staticвpublic_html - Создать пользователя-администратора с помощью
python manage.py createsuperuser
Источники
Опубликовано: 16 дек. 2024 г.
Обновлено: 23 июл. 2025 г.