Как развернуть приложение на Heroku?

Back4app Heroku App Deploy Cover

В этом руководстве рассматривается процесс развертывания приложения на основе Python на Heroku. Прочитав эту статью, вы сможете понять основные функциональные возможности Heroku, процесс развертывания приложений на Heroku и то, как развернуть приложение на Heroku.

Кроме того, в нем содержатся инструкции по развертыванию того же приложения на Back4app Containers – отличной бесплатной альтернативе Heroku.

Цели

К концу этого урока вы сможете:

  • Понимание Heroku и его функциональности
  • Развертывание приложений на Heroku
  • Познакомьтесь с контейнерами Back4app и их возможностями
  • Развертывание приложений в контейнерах Back4app
  • Определите, какой сервис использовать для вашего приложения

Что такое Heroku?

Компания Heroku, основанная в 2007 году, является одной из самых надежных платформ “Платформа как услуга” (PaaS). Облачная платформа позволяет легко создавать, управлять, развертывать и масштабировать приложения.

Он поддерживает Ruby, Python, Java, Clojure, Node, Scala, Go и PHP. Тем не менее, он позволяет развертывать другие языки программирования и фреймворки через Docker.

К основным преимуществам Heroku относятся простота использования, возможности масштабирования, функции безопасности, дополнительные модули, Heroku CLI и ориентированность на разработчиков.

С другой стороны, Heroku часто критикуют за дороговизну, неадекватную региональную поддержку и отставание от последних тенденций развития.

Одной из главных причин популярности Heroku является то, что в прошлом компания предлагала бесплатные услуги. До ноября 2022 года вы могли использовать Heroku для размещения своих приложений и даже баз данных абсолютно бесплатно.

К сожалению, они решили отменить эти бесплатные услуги, чтобы бороться с мошенничеством и злоупотреблением бесплатным уровнем. Несмотря на последние изменения, Heroku остается одной из самых популярных хостинговых платформ. Продолжайте читать, чтобы узнать, как развертываться на Heroku.

Чтобы узнать больше о Heroku, прочитайте нашу статью ” Что такое Heroku?

Настройка проекта

Чтобы продемонстрировать, как разворачивать приложения на Heroku и Back4app Containers, я подготовил простое веб-приложение, чтобы показать вам, как развернуть приложение Python на Heroku. Веб-приложение использует фреймворк FastAPI и служит в качестве простого сервиса сократителя URL. Оно поставляется с двумя конечными точками:

  1. /shorten присваивает псевдоним длинному_url
  2. /<alias> перенаправляет пользователя на соответствующий long_url

Не стесняйтесь проверить свое понимание, создав собственный проект.

Пререквизиты

  • Базовое понимание Python и Git
  • Python 3.9+ установлен на вашей локальной машине
  • Установлены и настроеныGit Bash и Docker Desktop
  • Личный аккаунт на GitHub

Клонировать и запустить

Развертывание Heroku начинается с форка этого репозитория на GitHub и последующего клонирования форка на вашу локальную машину:

$ git clone <fork_remote_git_url>
$ cd back4app-heroku-deploy

Если вы не хотите форкать, вы можете создать свой репозиторий и выложить в него исходный код.

Создайте виртуальную среду и активируйте ее:

$ python -m venv env && source env/bin/activate

Затем установите требования к проекту:

(env)$ pip install -r requirements.txt

Наконец, запустите сервер разработки:

(env)$ python -m uvicorn main:app --reload 

INFO:     Will watch for changes in these directories: [...]
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [1488] using WatchFiles
INFO:     Started server process [2316]
INFO:     Application startup complete.

Откройте свой любимый веб-браузер и перейдите на сайт http://localhost:8000/docs. Используйте интерактивную документацию для тестирования веб-приложения. Если вам нужна помощь в форматировании запросов, посмотрите файл test_main.http.

Как развернуть приложение на Heroku?

В этом разделе мы развернем приложение на Heroku.

Для выполнения следующих шагов потребуется учетная запись Heroku. Если у вас его еще нет, зарегистрируйтесь. Кроме того, не забудьте добавить платежную информацию в свой аккаунт Heroku.

Если вы удалите приложение сразу после прохождения обучения, с вас ничего не возьмут.

Переключитесь на новую ветку под названием heroku:

$ git checkout -b heroku

Цели

  1. Установите Heroku CLI.
  2. Создайте приложение для Heroku.
  3. Укажите время выполнения в файле runtime.txt.
  4. Укажите процессы приложения с помощью Procfile.
  5. Разместите исходный код на Heroku.

Heroku CLI

Существует несколько способов взаимодействия с Heroku. Вы можете использовать приборную панель, Heroku CLI или Heroku API.

Я предпочитаю Heroku CLI, поскольку это мощный инструмент, позволяющий быстро выполнять работу. Мы будем использовать его на протяжении всего урока.

Сначала установите Heroku CLI, следуя официальным инструкциям по установке.

После этого убедитесь, что установка прошла успешно, проверив версию CLI:

$ heroku --version
heroku/8.4.2 win32-x64 node-v16.19.0

Затем проверьте наличие обновлений CLI и авторизуйтесь с помощью учетной записи Heroku:

$ heroku update
$ heroku login

При выполнении второй команды откроется окно браузера. Чтобы пройти аутентификацию, нажмите “Войти” и закройте окно браузера.

Создание приложения Heroku

Чтобы развернуть приложение на Heroku, сначала нужно создать приложение Heroku.

Снова откройте терминал, перейдите в локальный проект (например, в папку back4app-heroku-deploy ) и выполните следующую команду:

$ heroku create -a <app_name>

Creating ⬢ <app_name>... !
https://<app_name>-31a6fd70e769.herokuapp.com/ | 
https://git.heroku.com/<app_name>.git

Обязательно замените <app_name> на нужное имя приложения.

Затем проверьте, успешно ли создано приложение, просмотрев список приложений:

$ heroku apps

=== <email_address> Apps
<app_name>

Затем проверьте информацию о приложении:

$ heroku apps:info <app_name>

=== <app_name>
Auto Cert Mgmt: false
Dynos:
Git URL:        https://git.heroku.com/<app_name>.git
Owner:          <email_address>
Region:         us
Repo Size:      0 B
Slug Size:      0 B
Stack:          heroku-22
Web URL:        https://<app_name>-21de155883d3.herokuapp.com/

Как вы, наверное, знаете, Heroku тесно интегрирована с Git. При создании приложения Heroku создается удаленный Git-репозиторий, в который вы можете отправить исходный код для развертывания. В нашем случае удаленный Git URL имеет следующий вид:

https://git.heroku.com/<app_name>.git

Heroku CLI автоматически регистрирует Git remote при создании приложения. Попробуйте перечислить удаленные ресурсы:

$ git remote -v

heroku  https://git.heroku.com/back4app-url-shortener.git (fetch)
heroku  https://git.heroku.com/back4app-url-shortener.git (push)
origin  [email protected]:duplxey/back4app-heroku-deploy.git (fetch)
origin  [email protected]:duplxey/back4app-heroku-deploy.git (push)

В следующем разделе мы будем использовать heroku remote для развертывания нашего исходного кода.

runtime.txt

Файл runtime.txt позволяет указать точную версию Python, которую вы хотите использовать в Heroku. Это важно, если для работы вашего проекта требуется определенная версия Python. На момент написания статьи по умолчанию используется python-3.11.5.

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

python-3.11.5

Список поддерживаемых сред исполнения Python можно найти в разделе Поддержка Python в Heroku.

Procfile

Procfile позволяет определить команды, которые должны быть выполнены для запуска процессов приложения. Мы будем использовать Procfile для запуска веб-сервера Uvicorn.

Создайте Procfile в корне проекта с веб-процессом:

web: gunicorn -w 1 -k uvicorn.workers.UvicornWorker main:app

В производственных приложениях вы, скорее всего, захотите породить несколько рабочих процессов вместо одного. Поскольку база данных не поддерживает наше приложение (оно использует данные в памяти), мы не можем синхронизировать данные между несколькими рабочими процессами. Поэтому мы должны использовать один рабочий.

Внесите изменения в свой репозиторий GitHub:

$ git add .
$ git commit -m "configured app for heroku"
$ git push origin heroku

Развертывание приложения Heroku

Heroku использует так называемые билдпаки для преобразования приложений в блоки, которые могут быть выполнены на динозависимых системах. Бильдпак – это набор специализированных скриптов для определенного языка программирования.

Когда вы размещаете код на Heroku, Heroku автоматически определяет язык программирования вашего проекта и пакет сборки, необходимый для его создания. В случае с Python он проверяет наличие файла requirements.txt.

Чтобы развернуть приложение, достаточно отправить код на пульт heroku:

$ git push heroku heroku:main

Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 318 bytes | 318.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Updated five paths from 30a4ffb
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Building on the Heroku-22 stack
remote: -----> Using buildpack: heroku/python
remote: -----> Python app detected
remote: -----> Requirements file has been changed, clearing cached dependencies
remote: -----> Installing python-3.11.5
remote: -----> Installing pip 23.2.1, setuptools 68.0.0 and wheel 0.41.0
remote: -----> Installing SQLite3
remote: -----> Installing requirements with pip
remote: -----> Discovering process types
remote:        Procfile declares types -> web
remote:
remote: -----> Compressing...
remote:        Done: 30.6M
remote: -----> Launching...
remote:        Released v5
remote:        https://<app_name>-31a6fd70e769.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.

Heroku автоматически выбрал подходящий скрипт сборки, установил все необходимые требования и развернул приложение в динотеке.

Если развертывание не удалось, используйте Heroku CLI для просмотра журналов:

$ heroku logs --tail

Затем проверьте статус вашего приложения:

$ heroku apps:info <app_name>

=== <app_name>
Auto Cert Mgmt: false
Dynos:          web: 1
Git URL:        https://git.heroku.com/<app_name>.git
Owner:          <your_email>
Region:         us
Repo Size:      9 KB
Slug Size:      31 MB
Stack:          heroku-22
Web URL:        https://<app_name>-31a6fd70e769.herokuapp.com/

Попробуйте зайти в приложение в браузере, перейдя по “Web URL”.

Это все, что касается части, посвященной Heroku. В следующем разделе мы рассмотрим развертывание того же приложения в контейнерах Back4app.

Как развернуть приложение в контейнерах Back4app?

В этом разделе мы развернем приложение в контейнерах Back4app Containers.

Что такое Back4app Containers?

Back4app Containers – это отличная платформа Containers as a Service (CaaS). Она позволяет развертывать, управлять и масштабировать приложения в глобально распределенных контейнерах.

Платформа тесно интегрирована с GitHub и предоставляет встроенную систему CI/CD. Другие ее возможности включают развертывание с нулевым временем простоя, привязку пользовательских доменов, ведение журналов, мониторинг и многое другое.

Самое приятное, что платформа предоставляет щедрый бесплатный уровень. Более 600 бесплатных контейнерных часов в месяц позволят вам легко создавать прототипы и размещать свои любимые проекты. По мере роста вашего приложения вы сможете перейти на премиум-уровень с предсказуемой ценой.

Чтобы узнать больше о контейнерах как услуге, прочитайте статью Что такое CaaS – контейнеры как услуга?

Переключитесь на новую ветку с именем back4app, основанную на мастер-ветке:

$ git checkout master && git checkout -b back4app

Цели

  1. Выполните докеризацию приложения.
  2. Подключите GitHub к своей учетной записи Back4app.
  3. Импортируйте нужную репозицию GitHub.
  4. Развернуть!

Dockerize

Чтобы развернуть приложение в Back4app Containers, его нужно сначала докеризировать.

Докеризация – это процесс создания, развертывания и запуска приложений в контейнерах Docker. Самый простой способ докеризации приложения – через Dockerfile.

Dockerfile

Dockerfile – это скрипт, содержащий инструкции по созданию образа контейнера Docker. Вы можете использовать этот файл для определения окружения, зависимостей и других команд, необходимых для сборки и запуска приложения.

Он имеет следующий синтаксис:

COMMAND <arg_1> <arg_2> ... <arg_n>

Создайте в корне проекта файл Dockerfile со следующим содержимым:

FROM python:3.9.6-alpine

# Set the working directory
WORKDIR /app

# Set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# Copy over the requirements file and install the dependencies
COPY ./requirements.txt .
RUN pip install --no-cache-dir --upgrade -r ./requirements.txt

# Copy over the source code
COPY . .

# Expose the port
EXPOSE 80

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"]

Этот Dockerfile основан на образе python:3.9.6-alpine. Сначала он устанавливает рабочий каталог, переменные окружения, а затем обрабатывает требования. После этого он копирует исходный код, открывает порт 80 и запускает сервер Uvicorn на этом порту.

Для развертывания других языков программирования и фреймворков не стесняйтесь брать Docker-файлы из документации Back4app Containers.

Если вам нужно пояснить, как работает команда Dockerfile, обратитесь к справке по Dockerfile.

.dockerignore

Мы можем использовать файл .dockerignore, чтобы уменьшить размер образа Docker. Эти файлы работают аналогично файлам .gitignore. Вы должны указать файлы и каталоги, которые вы хотите исключить из образа.

В нашем случае это виртуальная среда, файлы IDE и папка .git.

Создайте файл .dockerignore следующим образом:

.git/
.idea/
venv/

Не стесняйтесь адаптировать файл .dockerignore в соответствии с потребностями вашего проекта.

Внесите изменения в свой репозиторий GitHub:

$ git add .
$ git commit -m "configured app for back4app"
$ git push origin back4app

Сборка, запуск и тестирование

Прежде чем отправлять свой код в облако, неплохо бы протестировать его локально.

Сначала создайте изображение и пометьте его:

$ docker build -t back4app-url-shortener:1.0 .

Затем перечислите изображения:

$ docker images

REPOSITORY                      TAG            IMAGE ID       CREATED         SIZE
back4app-url-shortener          1.0            1cbe348a04ad   1 minute ago    68.7MB

Запустите контейнер, используя только что созданный образ:

$ docker run -p 80:80 --name back4app-url-shortener back4app-url-shortener:1.0

Объяснение аргументов:

  1. -p 80:80 связывает порт 80 хост-машины с портом 80 контейнера
  2. --name back4app-url-shortener называет экземпляр контейнера

Вы можете использовать -d, чтобы запустить контейнер в отсоединенном режиме (не занимая терминал).

Проверьте, запущен ли контейнер:

$ docker ps

CONTAINER ID   IMAGE                        CREATED    STATUS    PORTS
b3b82313ab65   back4app-url-shortener:1.0   3s ago     1s        0.0.0.0:80->80/tcp

Откройте свой любимый веб-браузер и перейдите на сайт http://localhost/docs. Вы должны увидеть службу сократителя URL.

Развернуть приложение

Для выполнения следующих действий потребуется учетная запись Back4app. Если у вас его еще нет, зарегистрируйте бесплатный аккаунт. Все, что мы будем делать в этом руководстве, будет происходить в рамках бесплатного уровня.

Когда вы войдете в свою учетную запись Back4app, перед вами откроется список приложений. Нажмите “Создать новое приложение”, чтобы начать процесс создания приложения.

Back4app Создание приложений

Back4app предлагает два решения:

  1. Бэкенд как услуга (BaaS) – готовое решение для бэкенда
  2. Containers as a Service (CaaS) – платформа для развертывания контейнеров на базе Docker.

Поскольку мы развертываем пользовательское приложение Python, мы будем использовать CaaS. Выберите “Контейнеры как сервис” в правой части экрана.

Back4app Containers as a Service

Вам будет предложено связать свой аккаунт GitHub, если вы впервые работаете с Back4app. Кроме того, убедитесь, что импортированы все репозитории, которые вы хотите развернуть.

Затем “Выберите” репозиторий GitHub, который вы хотите развернуть:

Back4app Containers Select GitHub Repository

Поскольку мы развертываем простое приложение, нам не нужно особо настраивать окружение. Все, что вам нужно сделать, это установить:

  1. Название приложения: back4app-url-shortener (вы можете выбрать другое название)
  2. Ответвление: back4app (ваше ответвление на GitHub)

Затем нажмите кнопку “Развернуть”.

Back4app Containers Configure Environment

Back4app Containers предлагает множество вариантов конфигурации, включая автоматическое развертывание, настройки портов, переменные окружения и проверку работоспособности.

Back4app Containers потребуется некоторое время для создания и развертывания вашего образа Docker. Когда ваше приложение будет готово, его статус изменится на “Доступно”. Чтобы посетить приложение, нажмите на ссылку под статусом, как показано на рисунке.

Успешное развертывание контейнеров Back4app

Отличная работа! Вы успешно развернули веб-приложение в Back4app Containers.

Заключение

В этом уроке вы узнаете, как развернуть простое веб-приложение на Heroku и Back4app Containers. У обеих платформ есть плюсы и минусы, которые следует учитывать при развертывании приложения.

Как правило, я бы выбрал Back4app Containers для приложений, которым не нужна база данных. Back4app Containers поможет вам сэкономить деньги, а его бесплатного уровня будет более чем достаточно для ваших домашних проектов.

Heroku может быть лучше, если ваше приложение опирается на базу данных или причудливые дополнения.

В таблице ниже я привел основные различия между платформами:

HerokuКонтейнеры Back4app
Облачная модельПлатформа как услуга (PaaS)Контейнеры как услуга (CaaS)
Создание и развертываниеBuildpacksDocker
Поддерживаемые языки9 языков программированияЛюбой язык или фреймворк
Бесплатный HTTPS/SSL✔️✔️
Пользовательские домены✔️✔️
Свободный ярус✔️
Риск блокировки поставщика✔️
Управляемые базы данных✔️
Удобно для начинающихДа (требуются некоторые навыки DevOps)Да (требует некоторых навыков работы с Docker)

Не стесняйтесь брать готовый исходный код из репозитория GitHub.

ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ

Что такое Heroku?

Heroku, основанная в 2007 году, является одной из первых платформ как услуга (PaaS). Она позволяет развертывать приложения на девяти языках программирования, включая Java, PHP, Python и Ruby. Кроме того, она предоставляет управляемые базы данных, надстройки, расширенное ведение журналов, мониторинг и многое другое.

Как развернуть приложение на Heroku?

1. Зарегистрируйтесь на Heroku.
2. Установите и настройте Heroku CLI.
3. Создайте приложение на Heroku.
4. Укажите среду выполнения через runtime.txt.
5. Укажите процессы приложения через Procfile.
6. Отправьте исходный код на Heroku.

Что такое Back4app Containers?

Containers — это отличная платформа контейнеров как услуга (CaaS). Она позволяет быстро развертывать, управлять и масштабировать Docker-приложения на глобально распределённых контейнерах. Встроена система CI/CD, поддержка развертывания без простоя, пользовательские домены и многое другое!

Как развернуть приложение на Back4app Containers?

1. Зарегистрируйтесь на бесплатный аккаунт Back4app.
2. Создайте Docker-образ вашего приложения.
3. Отправьте исходный код на GitHub.
4. Свяжите GitHub с аккаунтом Back4app.
5. Импортируйте нужный репозиторий и разверните приложение!


Leave a reply

Your email address will not be published.