- Введение
- Создание проекта на приложении Railway
- Шаблон Django-проекта Railway
- Развертывание из репозитория GitHub в Railway
- Создание приложения Django
- Настройка виртуальной среды
- Настройка приложения Django
- Создание файла runtime.txt
- Создание файла requirements.txt
- Создание Procfile
- Настройка переменных окружения
- Разбор переменных окружения с помощью python-dotenv
- Добавление файла gitignore
- Git Commit Django Project
- Создание проекта Railway
- Раскрутка базы данных
- Загрузка конфигурации базы данных
- Обслуживание статических файлов
- Развертывание на GitHub
- Railway CLI
- Заключение
Введение
Мы уже рассмотрели процесс развертывания приложения Django на Heroku, теперь мы можем перейти к другой платформе, которой является Railway App. Она позволяет быстрее и интуитивно понятнее развернуть Django приложение (или любое другое веб-приложение). Эта платформа имеет несколько Starter Apps для отправки вашего приложения в несколько кликов, безусловно, это потребует некоторой конфигурации и настройки.
Мы будем следовать аналогичным шагам из руководства по развертыванию Django-Heroku для конфигурирования и настройки нашего проекта Django для развертывания на платформе Railway. Мы рассмотрим несколько различных способов создания и развертывания проекта Django на Railway.
Создание проекта на приложении Railway
После того, как мы настроили наш проект Django, мы можем двигаться дальше и создать проект Railway. Проект Railway — это набор окружений, плагинов, сервисов и переменных развертывания. Перейдя на веб-страницу New Project, вы можете войти в систему или зарегистрировать бесплатную учетную запись и создать простой проект.
Здесь у нас есть несколько вариантов:
- Создать шаблон приложения Django (Djangopy Starter)
- Извлечь проект из репозитория GitHub (Deploy from GitHub Repo).
Мы рассмотрим каждый из них, первый — это позволить боту Railway
создать готовый Django шаблон на нашем аккаунте GitHub. Второй вариант — получение и развертывание существующего репозитория проекта Django на GitHub.
Шаблон Django-проекта Railway
Railway предоставляет простой шаблон проекта Django, он состоит из одного приложения и простого представления, которое отображает HttpResponse
. Шаблон проекта Django, предоставляемый Railway, имеет открытый исходный код и доступен на GitHub. При использовании этого метода вам не потребуется создавать проект django самостоятельно, это будет шаблон проекта django, созданный ботом Railway. Хотя для расширения и создания полноценного django-проекта вам придется клонировать репозиторий и внести в него необходимые изменения.
Создайте проект, перейдя на вкладку New Project и выполнив поиск Django
, вы должны увидеть проект django
в качестве стартового пакета.
После выбора проекта Django перед нами откроется вкладка начальной конфигурации. Обязательно нужно заполнить переменную окружения SECRET_KEY
, так как она делает ваш проект django более безопасным. Также измените имя repository
, так как это будет имя вашего репозитория в вашем аккаунте GitHub.
Чтобы создать ключ SECRET_KEY
, вы можете перейти в терминал и немного поработать с python.
Откройте Python REPL, введя команду python
или python3
. Импортируйте модуль secrets
и запустите функцию token_hex(24)
, которая сгенерирует ключ длиной 24.
python
import secrets
secrets.token_hex(24)
Теперь скопируйте SECRET_KEY
без кавычек в подсказку, и это создаст репозиторий на вашем GitHub с указанным именем. Бот Railway
создаст проект django с именем djangopy
в этом репозитории с некоторыми предварительно настроенными параметрами.
Это создаст простой репозиторий на вашем GitHub, а также приложение django, развернутое на Railway, вместе с базой данных PostgreSQL, прикрепленной к нему.
Таким образом, проект будет развернут на Railway с помощью URL-ссылки https://djangopy-production-43cb.up.railway.app/. Имя ссылки можно настроить на вкладке Settings в разделе Dashboard и отредактировать домены службы и даже добавить пользовательский домен.
Вот так мы развернули базовое django приложение на Railway. Далее, вы можете изменить содержимое репозитория Github и добавить код, зафиксировав изменения, и он возьмет его оттуда и также автоматически развернет, создавая таким образом своего рода CI-CD.
Мы продемонстрируем это в следующем разделе, который представляет собой метод развертывания проекта из пользовательского репозитория GitHub, то есть путем самостоятельной настройки и последующего подключения приложения Railway для развертывания. Преимущество этого метода в том, что мы можем настроить некоторые уже существующие приложения Django, немного изменив их.
Развертывание из репозитория GitHub в Railway
Это второй метод развертывания проекта Railway. Для этого нам нужен соответствующий Django проект, мы создадим django приложение с нуля, я уже создал простое CRUD приложение на Django для блога на GitHub. Это не будет руководством по Django для настройки представлений и создания моделей, я объяснил всю настройку django-блога в моей серии «Основы Django».
Создание приложения Django
Для развертывания приложения нам определенно нужно приложение, нам нужно создать базовое Django-приложение для развертывания в интернете. Мы создадим простое приложение для блога с парой представлений и простой структурой модели. Что касается базы данных, мы будем использовать Postgres, так как у Railway есть служба баз данных для нее, и ее довольно легко настроить.
Настройка виртуальной среды
Нам необходимо создать виртуальное окружение, чтобы поддерживать проект Django в чистоте и порядке, управляя зависимостями и пакетами, относящимися к конкретному проекту. Мы можем использовать пакет virtualenv, чтобы изолировать проект python от остальной системы.
# install the virtualenv package
pip install virtualenv
# create a virtual env for the project
virtualenv .venv
# activate the virtualenv
Windows:
.venvScriptsactivate
Linux/macOS:
source .venv/bin/activate
Это настроит проект наилучшим образом для проекта Django, теперь вы установите основной пакет Django и приступите к созданию приложения Django.
# install django
pip install django
# start a django project
django-admin startproject blog .
cd blog
# create a application in django project
python manage.py createapp api
# Create some models, views, URLs, templates
# run the server
python manage.py runserver
Мы предполагаем, что у вас уже есть проект Django, настроенный с некоторыми основными URL, представлениями и шаблонами или статическими файлами в соответствии с вашим проектом и требованиями, для этого руководства я буду использовать простое приложение блога из моих предыдущих руководств по Django в качестве ссылки. Как было сказано ранее, вы можете следовать моей серии «Основы Django» и обратиться к проекту Blog Application на GitHub.
Настройка приложения Django
Обязательно создайте и активируйте виртуальное окружение для этого проекта django. Это необходимо сделать для управления зависимостями и пакетами, используемыми в проекте. Если вы не знаете о виртуальном окружении и настройке django, вы можете прочесть этот пост.
Создание файла runtime.txt
Теперь, во-первых, нам нужно указать, какой тип и версию языка мы используем. Поскольку Django — это веб-фреймворк на основе Python, нам нужно выбрать версию python в текстовом файле.
runtime.txt
python-3.9.5
Здесь версия может быть любой в соответствии с вашим проектом и установленными пакетами.
Создание файла requirements.txt
Сначала мы создадим файл requirements.txt
для хранения всех зависимостей и пакетов, установленных в приложении. Это поможет при установке зависимостей во время развертывания приложения. Мы можем использовать файл requirements.txt
с помощью virtualenv
или Pipfile
с помощью Pipenv. Оба варианта служат одной и той же цели, но немного по-разному.
Предполагая, что вы находитесь в изолированной виртуальной среде для этого проекта Django, вы можете создать файл requirements.txt с помощью следующей команды:
Перед выполнением команды убедитесь, что виртуальная среда virtualenv активирована:
pip freeze > requirements.txt
Это создаст простой текстовый файл, содержащий имена пакетов вместе с версиями, используемыми в текущей виртуальной среде. Простой файл требований Django будет выглядеть примерно так:
asgiref==3.4.1
Django==3.2.11
pytz==2021.3
sqlparse==0.4.2
typing_extensions==4.0.1
Это ванильный Django без каких-либо дополнительных зависимостей, но если вы интегрировали другие функциональные возможности, такие как Django Rest Framework, PostgreSQL, Crispy Forms, планировщики и т.д., то могут возникнуть дополнительные зависимости, которые станут очень важными для бесперебойной работы проекта.
Если вы используете pipenv, вам не нужно прилагать никаких усилий для ручной активации и управления виртуальным окружением, зависимости устанавливаются и заботятся об этом с помощью программы установки pipenv. Вам просто нужно убедиться, что вы устанавливаете любой пакет с помощью pipenv install
, а не pip install
для лучшего и улучшенного отслеживания пакетов.
Вот и все, что нам нужно для заботы о пакетах и ведения списка этих интегрированных пакетов для проекта. Вам необходимо обновлять файл requirements.txt каждый раз, когда вы устанавливаете какой-либо новый пакет или изменяете зависимости для проекта. Просто используйте команду pip freeze > requirements.txt
в активированной виртуальной среде.
Создание Procfile
Далее у нас есть Procfile
, procfile — это специальный файл, который содержит информацию о процессах, которые должны быть запущены для запуска или активации проекта. В нашем случае, для django нам нужен веб-процесс, который может управлять сервером.
Procfile — это простой файл без расширения, обязательно напишите Procfile
, так как это имя файла в корневой папке проекта. Внутри файла добавьте следующее содержимое:
Procfile
web: gunicorn <project_name>.wsgi
Для Procfile в шаблоне Django есть встроенный Procfile, вы можете обратиться к нему и создать его следующим образом:
web: python manage.py migrate && gunicorn <project_name>.wsgi
Как мы видим, мы определили процесс web
, используя gunicorn
, Gunicorn — это пакет python, который помогает в создании WSGI HTTP сервера для операционных систем UNIX. Итак, нам нужно установить пакет и обновить список зависимостей пакета.
pip install gunicorn
pip freeze > requirements.txt
Настройка переменных окружения
Нам нужно хранить наши секреты для проекта django вне развернутого кода и в безопасном месте, мы можем создать переменные окружения и хранить их в файле .env
, который будет git-ignored. Мы не хотим, чтобы этот файл .env
был с открытым исходным кодом и поэтому не должен быть зафиксирован.
Сначала нам нужно создать новый секретный ключ, если у вас уже есть репозиторий на GitHub, есть шанс, что вы зафиксировали секретный ключ по умолчанию, открытый для всеобщего обозрения, это небезопасный способ развертывания приложений django в продакшене.
Здесь должен быть сгенерирован секретный ключ, который теперь знаете только вы. Итак, просто скопируйте ключ без кавычек и создайте файл .env
в корневой папке проекта.
.env
SECRET_KEY=76419fd6885a677f802fd1d2b5acd0188e23e001042b05a8
Файл .env
также должен быть добавлен в файл .gitignore
, поэтому просто добавьте следующее в файл .gitignore
.env
Это только одна из переменных окружения в нашем проекте django, далее мы добавим еще несколько переменных, таких как учетные данные базы данных, статус отладки и т.д.
Мы создали переменные окружения для нашего приложения django, теперь нам нужен способ анализа этих переменных окружения в проекте Django.
Разбор переменных окружения с помощью python-dotenv
Мы будем использовать python-dotenv для разбора переменных в конфигурации настроек django, таких как SECRET_KEY
и DATABASES
.
- Установите
python-dotenv
с помощью pip командой :
pip install python-dotenv
Затем нам нужно изменить переменные по умолчанию в файле settings.py
. Во-первых, мы загрузим файл .env
для доступа к переменным окружения для конфигурации проекта.
Добавьте следующий код в начало файла settings.py
, убедитесь, что не переопределяете конфигурацию, поэтому удалите ненужные импорты и конфигурации.
# <project_name>/settings.py
import os
from dotenv import load_dotenv
BASE_DIR = Path(__file__).resolve().parent.parent
load_dotenv(os.path.join(BASE_DIR, ".env"))
Мы импортировали пакет dotenv
в основном python-dotenv
в файл settings.py
и модуль os
для загрузки файла .env
. Функция load_dotenv
помогает загрузить пары key-value
, которые являются переменными конфигурации, которые могут действовать как фактические переменные окружения. Мы предоставляем файл для функции load_dotenv, который в нашем случае является файлом .env
, вы можете выбрать любое расположение файла .env
, но обязательно измените расположение при разборе файла в функции load_dotenv
.
После загрузки переменных в файл settings.py
, нам теперь нужно получить доступ к этим переменным и установить соответствующую переменным конфигурацию из переменных, полученных из функции load_dotenv
. Функция os.getenv
для доступа к переменным окружения. Функция os.getenv
принимает параметр в качестве ключа
для переменной среды и возвращает значение переменной среды.
SECRET_KEY = os.getenv("SECRET_KEY")
Мы тайно настроили SECRET_KEY
для проекта django. Если у вас есть какие-либо другие переменные в виде простых пар ключ-значение, таких как AUTH
пароли, имя пользователя и т.д., вы можете использовать этот метод для получения конфигурационных переменных.
Добавление файла gitignore
Нам понадобится файл .gitignore
для того, чтобы только коммитить проект и переносить его в удаленный репозиторий. Здесь мы создадим минимальный файл .gitignore
в нашем корневом репозитории.
Вот пример .gitignore
для минимального проекта django.
.env/
.venv/
env/
venv/
*.env
*.pyc
db.sqlite3
staticfiles/
Если вам нужен полноценный .gitignore
для сложного django проекта, вы можете взять за основу шаблон gitignore для django проекта от Jose Padilla.
Это будет полезно для создания и обслуживания проекта при развертывании проекта на Railway App.
Git Commit Django Project
Теперь мы можем безопасно зафиксировать код и разместить его в репозитории GitHub. Это обеспечит наличие базового проекта django на GitHub, из которого мы сможем собрать приложение Railway для развертывания.
git status
git add .
git commit -m "config for railway deployment"
Внимательно проверьте статус git-репозитория перед фиксацией и убедитесь, что вы ничего не забыли по ошибке, фиксируйте только те файлы, которые считаете важными, а остальные игнорируйте.
git remote add rail https://github.com/Mr-Destructive/django-blog/tree/railway
git push rail railway
Создание проекта Railway
Теперь, поскольку у нас есть проект django, хорошо настроенный и установленный на GitHub, мы можем вытащить проект Railway и получить проект из репозитория GitHub.
Раскрутка базы данных
Нам также нужна база данных, которую мы можем подключить в проекте django в нашем приложении Railway. Мы можем интегрировать базу данных PostgreSQL
в качестве сервиса, запущенного в нашем экземпляре проекта Railway. Мы можем сделать это, найдя вкладку +New
на приборной панели проекта и присоединив Database
в выпадающем меню.
После создания службы базы данных нам понадобятся учетные данные базы данных или DATABASE_URL
PostgreSQL, чтобы интегрировать ее в настройки django. Мы можем найти Connect
сервиса PostgreSQL и получить URL базы данных. Он может быть сохранен в основном приложении django в качестве переменной окружения.
DATABASE_URL=postgresql://postgres:SE74bEw@containers-51.railway.app:6919/railway
В Django Starter Project, предоставленном компанией Railway, у нас должна быть база данных PostgreSQL, интегрированная в качестве сервиса. Таким образом, мы можем использовать базу данных в нашем проекте django.
Мы добавим конфигурационную переменную DATABASE_URL
в файл .env
, а также добавим ее в основной сервис проекта Django, чтобы он мог общаться с базой данных. Вам нужно скопировать DATABSE_URL
в наш локальный файл настроек (.env
файл). Скопируйте URL базы данных и вставьте его в файл .env
следующим образом:
DATABASE_URL=postgres://sjxgipufegmgsw:78cbb568e@ec2-52-4-104-184.compute-1.amazonaws.com:5432/dbmuget
Формат URL-адреса Postgres следующий:
postgresql://[user[:password]@][netloc][:port][/dbname]
Загрузка конфигурации базы данных
Базы данных немного отличаются от других простых конфигураций в django. Нам нужно внести несколько изменений в конфигурацию базы данных по умолчанию. Мы установим другой пакет dj-database-url
для настройки DATABASE_URL
. Поскольку databse_url имеет несколько компонентов, нам нужен способ извлечь детали, такие как hostname
, port
, database_name
, и password
. Используя пакет dj-database-url
, мы имеем несколько функций, которые могут служить этой цели.
pip install dj-database-url
В конце вашего файла settings.py
добавьте следующий код.
import dj_database_url
DATABASE_URL = os.getenv("DATABASE_URL")
DATABASES = {
"default": dj_database_url.config(default=DATABASE_URL, conn_max_age=1800),
}
Нам понадобится адаптер для выполнения миграций на базу данных PostgreSQL
, то есть пакет psycopg2
. Это обязательный шаг, если вы работаете с базой данных postgres
. Его можно установить с помощью простой команды pip install:
pip install psycopg2
# If it does not work try
pip install psycopg2-binary
# if still error persists try installing setuptools
pip install -U setuptools
pip install psycopg2
Теперь, когда мы настроили базу данных, мы можем применить миграции к новой базе данных Postgres, предоставленной Railway. Мы просто выполним команду migrate, и в проекте Railway база данных PostgreSQL будет изменена, а соответствующая схема будет применена.
python manage.py migrate
Обязательно обновите файл requirements.txt
перед переносом проекта в приложение Railway, чтобы убедиться, что все работает так, как ожидается. Поскольку мы установили несколько дополнительных пакетов, которые непосредственно используются в файле settings.py
, нам необходимо выполнить команду pip freeze
для обновления файла requiremnets.txt
.
Обслуживание статических файлов
Теперь, если у вас есть статические файлы, такие как CSS
, Javascript
или изображения
, вам нужно настроить статические файлы, чтобы обслуживать их с сервера приложений Railway. Для сбора статических файлов из выбранного репозитория нам потребуется еще одна переменная конфигурации.
STATIC_URL = "static/"
STATICFILES_DIRS = [os.path.join(BASE_DIR, "static")]
STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles")
Если вы обслуживаете статические файлы из папки static
в корневом каталоге вашего django проекта, вы можете добавить вышеуказанный код в файл settings.py. Мы соберем все статические файлы в папке вместе со статическими файлами по умолчанию, предоставляемыми django, в директории staticfiles
. Если вы хотите проверить, правильно ли собраны и обслуживаются статические файлы, выполните следующую команду.
python manage.py collectstatic
Итак, эта команда соберет все статические файлы и сохранит их в одном месте. Мы видим, что файлы из раздела администратора также скопированы, как и пользовательские статические файлы из конфигурации проекта. Теперь мы можем перейти к установке переменной конфигурации для приложения Railway на вкладке Variables.
DISABLE_COLLECTSTATIC = 0
Мы можем установить переменную DISABLE_COLLECTSTATIC
как 0
или 1
, указывая, отключить ее или нет. В настоящее время мы включили сбор статических файлов при развертывании приложения, но вы можете установить значение 1
, чтобы отключить сбор статических файлов.
Поскольку я впервые тестировал приложение на Railway, статические файлы не работают так, как ожидалось, нам нужен еще один пакет, чтобы убедиться, что статические файлы обслуживаются. Мы установим пакет whitenoise
, который служит в качестве промежуточного программного обеспечения для обслуживания статических файлов.
pip install whitenoise
Добавьте промежуточное ПО whitenoise whitenoise.middleware.WhiteNoiseMiddleware
в список MIDDLEWARE
в файле settings.py
.
MIDDLEWARE = [
...
...
...
'whitenoise.middleware.WhiteNoiseMiddleware',
]
Этого должно быть достаточно, чтобы максимально использовать развертывание на приложении Railway. Вам придется внести несколько изменений в соответствии с вашими требованиями и проектом.
Развертывание на GitHub
Наконец, мы соединили все части, осталось только перенести код в репозиторий GitHub, чтобы запустить сборку на приложении Railway. Итак, мы убедимся, что зафиксировали все критические вещи, которые есть в нашем проекте django, и включили всю важную информацию в файл gitignore.
pip freeze > requirements.txt
Этот шаг очень важен, потому что вам нужно убедиться, что все пакеты перечислены в файле requirements.txt
, иначе вам придется ждать сбоя сборки и переразвертывать ее.
Убедитесь, что сервер запущен на вашей локальной машине, помните, что сервер будет настроен с нуля, но база данных уже применит миграции, если вы применяли миграции ранее после подключения службы базы данных Railway.
python manage.py collectstatic
python manage.py runserver
Это установит происхождение удаленного репозитория, в который будет загружен код проекта. Далее необходимо зафиксировать код, который будет содержать все необходимое для развертывания кода.
Контрольный список для развертывания кода
- requirements.txt
- Procfile
- runtime.txt
- django-project
- environment variables / config variables
- static file configuration
- database configuration
- migrate schema of database
- gitignore file for ignoring virtualenvs, .env file, staticfiles, etc
git push origin main
origin -> remote repository URL
main -> branch name
Railway CLI
Railway также предоставляет классный CLI, в нем есть несколько довольно удобных функций, таких как создание и управление сервисами, локальная среда разработки и т.д. Мы просто рассмотрим несколько приятных возможностей инструмента CLI.
Сначала мы установим CLI на нашу локальную систему, для этого руководство довольно ограничено несколькими вариантами на выбор, такими как npm
, shell
и scoop
. Я выбрал shell, но у него было несколько проблем с разрешениями, поэтому я внес несколько изменений в сценарий install.sh, запущенный на моей машине, и все заработало нормально.
Теперь, когда мы установили Railway CLi
, мы можем выполнить несколько команд, например:
railway login
OR
# if it doesn't work
railway login --browserless
OR
# with node
npx railway login
В результате вы войдете в систему под своей учетной записью railway.
Теперь нам нужно связать наш проект и выполнить команду в этом проекте из приложения railway. Чтобы связать проект из учетной записи railway, необходимо использовать команду link
. Команда link принимает в качестве параметра id проекта, который можно получить на вкладке настроек приборной панели проекта.
railway link <proejct_id>
Теперь мы можем изучить некоторые другие команды, такие как run
, up
и так далее. Команда run
довольно удобна и предоставляет интерфейс для запуска команд для вашего проекта, например, для Django, создания суперпользователя, управления зависимостями, сбора статических файлов и т.д. Это позволяет нам настраивать и запускать команды в реальной производственной среде просто из CLI.
# railway run (command to be executed)
railway run python manage.py createsuperuser
# deploy the project
railway up
Итак, это было все о создании и развертывании django-приложения на Railway. Вот некоторые ссылки:
- Репозиторий GitHub
- Живая веб-страница
Заключение
Итак, вот как мы развертываем Django проект на приложении Railway. Мы рассмотрели два из многих способов создания и развертывания приложения Django на Railway. Мы также интегрировали сервис PostgreSQL, предоставляемый Railway, в наш проект Django. Используя Railway CLI, мы смогли управлять и создавать проекты из терминала, также было достигнуто взаимодействие проекта Railway вместе с производственной сборкой из CLI.
Надеюсь, вам понравилось вышеприведенное руководство, если у вас есть какие-либо вопросы, отзывы или пожелания, вы можете связаться со мной через социальные ручки, указанные ниже. Спасибо за чтение и до следующего поста, счастливого кодинга :)серия: «django-deployment»