Развертывание Django + PostgreSQL на железнодорожном приложении


Введение

Мы уже рассмотрели процесс развертывания приложения Django на Heroku, теперь мы можем перейти к другой платформе, которой является Railway App. Она позволяет быстрее и интуитивно понятнее развернуть Django приложение (или любое другое веб-приложение). Эта платформа имеет несколько Starter Apps для отправки вашего приложения в несколько кликов, безусловно, это потребует некоторой конфигурации и настройки.

Мы будем следовать аналогичным шагам из руководства по развертыванию Django-Heroku для конфигурирования и настройки нашего проекта Django для развертывания на платформе Railway. Мы рассмотрим несколько различных способов создания и развертывания проекта Django на Railway.

Создание проекта на приложении Railway

После того, как мы настроили наш проект Django, мы можем двигаться дальше и создать проект Railway. Проект Railway — это набор окружений, плагинов, сервисов и переменных развертывания. Перейдя на веб-страницу New Project, вы можете войти в систему или зарегистрировать бесплатную учетную запись и создать простой проект.

Здесь у нас есть несколько вариантов:

  1. Создать шаблон приложения Django (Djangopy Starter)
  2. Извлечь проект из репозитория 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»

Оцените статью
devanswers.ru
Добавить комментарий