Сборка для продакшена — развертывание на Railway

В этой главе вы узнаете, как настроить продакшен-окружение, развернуть приложение Django-блога на Railway и получить публичную ссылку для доступа.


Настройка продакшен-окружения

В среде разработки DEBUG=True, и Django отображает подробную информацию об ошибках и страницы отладки.

В производственной среде DEBUG должен быть отключён, а параметры безопасности должны быть настроены правильно.

settings.py конфигурация для продакшена

Пример

# Путь к файлу: blog_project/settings.py
import os

# Чтение секретного ключа из переменной окружения (не прописывайте его жёстко в коде)
SECRET_KEY = os.environ.get('SECRET_KEY', 'Секретный ключ по умолчанию для среды разработки')

# DEBUG управляется через переменные окружения.
DEBUG = os.environ.get('DEBUG', 'True').lower() == 'true'

# Разрешённые имена хостов
ALLOWED_HOSTS = os.environ.get('ALLOWED_HOSTS', '127.0.0.1,localhost').split(',')

# Каталог сбора статических файлов
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')   # staticfiles/ в каталоге проекта
STATIC_URL = '/static/'

SECRET_KEYЭто самый важный ключ безопасности Django, используемый для шифрования сессий, CSRF-токенов и т. д. Он никогда не должен быть жёстко закодирован в коде или зафиксирован в Git. В production-среде он внедряется через переменные окружения.


Управление зависимостями и requirements.txt

Создайте список зависимостей; платформа развёртывания использует его для установки пакетов, необходимых проекту.

(venv) $ pip freeze > requirements.txt

Проверьте содержимое файла, чтобы убедиться, что включены следующие ключевые зависимости:

Django>=5.0,<6.0
gunicorn>=21.0              # 生产级 WSGI 服务器
whitenoise>=6.0             # 静态文件服务(可选)

Если gunicorn отсутствует, сначала установите его:

(venv) $ pip install gunicorn
(venv) $ pip freeze > requirements.txt

Настройте Gunicorn + Whitenoise

Встроенный в DjangorunserverНе подходит для production-среды.

GunicornЭто промышленный WSGI-сервер для Python, который обрабатывает одновременные запросы.

WhitenoiseПозволяет Gunicorn напрямую обслуживать статические файлы (CSS, JS, изображения).

Пример

# Путь к файлу: blog_project/settings.py

# Промежуточное ПО Whitenoise должно быть размещено после SecurityMiddleware и перед другими middleware.
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware',   # Добавить: middleware для статических файлов
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

Создайте в корневом каталоге проектаProcfileсообщает Railway, как запустить приложение:

web: gunicorn blog_project.wsgi --log-file -

Собрать статические файлы

В производственной среде Django не обслуживает статические файлы автоматически; необходимо использоватьcollectstaticСоберите в единый каталог.

(venv) $ python manage.py collectstatic

Эта команда скопирует статические файлы бэкенда Admin и приложения blog вSTATIC_ROOTКаталог (staticfiles/).

В среде разработки обычно не нужно запускать collectstatic (Django автоматически находит каталог статических файлов каждого приложения). Однако перед развёртыванием его необходимо запустить, чтобы все статические файлы были собраны в один каталог для использования веб-сервером.


Отправьте проект на GitHub

Создайте .gitignore

Убедитесь, что конфиденциальные и временные файлы не попадают в коммит:

venv/
__pycache__/
*.pyc
db.sqlite3
staticfiles/
.env

Отправьте на GitHub

$ git init
$ git add .
$ git commit -m "初始化 Django 博客项目"
$ git branch -M main
$ git remote add origin https://github.com/你的用户名/django-blog.git
$ git push -u origin main

Развёртывание на Railway

RailwayЭто развивающаяся облачная платформа для развёртывания с хорошей поддержкой full-stack приложений, таких как Django.

Шаги развёртывания

  1. Посетитеrailway.app, войдите с учетной записью GitHub
  2. Нажмите "New Project" → "Deploy from GitHub repo" → Выберите репозиторий django-blog
  3. Railway автоматически обнаруживает Procfile и распознаёт команду запуска.
  4. Задайте переменные окружения в Variables.
  5. Нажмите Deploy и дождитесь завершения сборки и развёртывания.

Настройка переменных окружения

Имя переменнойЗначениеОписание
SECRET_KEYСлучайно сгенерированная длинная строкаСекретный ключ Django
DEBUGFalseОтключите режим отладки
ALLOWED_HOSTS.railway.appРазрешить доступ с домена Railway.

Быстро сгенерировать SECRET_KEY:

$ python -c "import secrets; print(secrets.token_urlsafe(50))"

После успешного развёртывания вы получите ссылку вида:https://django-blog.up.railway.app

Бесплатный тариф Railway ограничен ($5 в месяц или 500 часов). Если вы просто тестируете или учитесь, не забудьте приостановить проект после того, как израсходуете лимит. Heroku отменил бесплатный план, поэтому в этом руководстве в качестве альтернативы рекомендуется Railway.


Следующее направление обучения

Направление обученияКому это подходитРекомендуемая отправная точка
Django REST Framework (DRF)Нужно создать API-бэкенд для фронтенд-фреймворков (Vue3/React).Изучите Serializer + ViewSet, чтобы превратить блог в API-сервис
PostgreSQLТребуется база данных промышленного уровняЗамените SQLite и используйте django-environ для управления конфигурацией базы данных
Асинхронная задача CeleryНужны фоновые задачи (отправка писем, генерация отчётов).Интегрируйте Redis + Celery для реализации очереди асинхронных задач.
Django + Vue3/React: разделение фронтенда и бэкендаНужна архитектура с разделением фронтенда и бэкендаСоздайте API-бэкенд с помощью DRF, создайте фронтенд с помощью Vue3/React и обменивайтесь данными через fetch

Итоги главы

В этой главе вы выполнили заключительный шаг: настроили продакшн-окружение (SECRET_KEY/DEBUG/ALLOWED_HOSTS), сгенерировали requirements.txt, настроили Gunicorn + Procfile, отправили код на GitHub и выполнили развёртывание на Railway в один клик.

Другие расширения