Как задеплоить java web приложение на heroku
СОДЕРЖАНИЕ ЦИКЛА СТАТЕЙ Решил попробовать запустить простое приложение на облаке. За основу я взял эту статью Как разместить Spring-Boot-приложение на heroku.com. Пошаговая инструкция Если ты ее прочитал(-а) и все заработало без вопросов, то ниже текст не для тебя. Лично у меня возникло несколько дополнений: 1. В пунктах 5, 6 и 7 показывается как использовать в приложении облачную базу данных, прочитать это все интересно. Но если тебе, как и мне, это показалось лишним, то можно использовать СУБД H2 (включи гугл траслит). Тут показан пример как наполнить БД с помощью файла data.sql и скриптов. Я использовал не скрипты, а интерфейс CommandLineRunner, который предоставляет метод run. Нужно просто реализовать класс, например MyRunner навесить на него java-конфигурацию и имплементировать интерфейс. Ниже пример использования: Метод исполниться в момент запуска приложения и сохранит сущности в БД. Важно: из пункта 7 основной статьи, в application.properties (или application.yaml) необходимо добавить настройку server.port=$ – дефолтный порт избавит от распространенной проблемы: heroku[router]: at=error code=H20 desc="App boot timeout" method=GET 2. В пункте 8 показывается как публиковать приложение. Там довольно интересно написано про особенности использования приложений на версии Java 11, я как старообрядец использую восьмую Java, поэтому файл system.properties мне не нужен. Если у тебя Java 9+ то не забудь создать упомянутый файл и добавить версию Java. Автор предлагает следующий порядок публикации: <samp>Для этого выполним следующие шаги: • Откроем папку с репозиторием проекта в терминале Git Bash. • Найдём ссылку на удалённый репозиторий heroku для вашего приложения в Settings — в разделе App Information → Heroku git URL. • Добавим новый удалённый репозиторий к вашему Git.</samp> Я использовал порядок, который описан на сайте Heroku. В созданном на сайте приложении нужно найти вкладку Deploy, прочитать все что там написано. А затем выполнить команды в блоке Create a new Git repository. В структуре проекта IDEA должен присутствовать файл . gitignore и папка target должна быть исключена из отслеживания Git. В качестве консоли я использовал Terminal IDEA, просто в том же проекте который хочу запустить в облако, открыл вкладку Terminal, вот так она выглядит: Поэтому не мне надо искать нужную директорию. (cd my-project/) heroku login - мы уже сделали(если нет, то самое время). Далее копирую и исполняю по очереди гит команды: Сначала создаю гит репозиторий git init heroku git:remote -a from-java-rush Теперь делаю коммит и осуществляю деплой git add . git commit -am "make it better" git push heroku master В консоли будут появляться логи: что приложение начало сборку, что Maven выкачивает зависимости и в конце: Где указана ссылка https://from-java-rush.herokuapp.com/, у тебя будет своя ссылка, вот в нее и тыкни. Само собой, если у тебя нет графического интерфейса в приложении, а только набор rest методов, нужно после ссылки указать через слеш название метода, например так: https://from-java-rush.herokuapp.com/heroku/city (надо подождать пока контейнер проснется, если не проснулся, то значит я удалил приложение) Теперь ты можешь вносить изменения в развернутое приложение на heroku, прямо из IDEA, используя консольные Git команды git add . git commit -am "make it better" git push heroku master Или привычные, но менее информативные кнопки интерфейса
Heroku – очень крутая штука! Тебе не нужно заморачиваться с настройкой железа, балансирования, маршрутизации и прочими радостями воздвижения нового сервиса, т. к. все за тебя сделали (и будут делать) разработчики. Тебе дается уже готовый сервак – бери и ваяй свое приложение.
Это руководство поможет развернуть Java-приложение за считанные минуты.
Предполагается, что у тебя уже:
- есть бесплатный аккаунт Heroku;
- установлена Java 8;
- установлен Maven 3.
Если ты больше любишь Gradle, то тебе в раздел официального хелпа.
Для Heroku CLI требуется система контроля версий Git. Если она у тебя еще не установлена, выполни следующие действия:
CLI используется для управления и масштабирования приложений, подготовки модулей, просмотра журналов и т. д.
Загрузи и запусти нужный установщик: Mac, Win32, Win64, Linux ( sudo snap install heroku --classic ).
После установки уже можно вводить команды с помощью директивы heroku в любимом терминале.
Используй команду heroku login для входа в Heroku CLI (может ругнуться фаервол – все разрешаем):
Эта команда откроет страницу Heroku – нажми там кнопку Войти .
Аутентификация требуется для правильной связки heroku и git .
Чтобы создать локальную копию приложения, которую можно развернуть в Heroku, выполни следующие команды в терминале:
Теперь у тебя есть рабочий репозиторий. Приложение включает в себя файл pom.xml, используемый менеджером Maven.
На этом шаге ты развернешь приложение в Heroku.
Первым делом подготовим Heroku к получению исходного кода:
На этом шаге создается удаленный репозиторий (с именем heroku) и связывается с локальным.
По дефолту Heroku генерирует случайное имя для приложения, но можно указать и свое.
Теперь давай развернем код:
Готово. Убедись, что хотя бы один экземпляр приложения запущен:
Теперь перейди в приложение по ссылке, созданной из его имени, или поступи следующим образом:
Heroku собирает события со всех выходных потоков приложения и компонентов платформы в единый журнал, упорядоченный по времени.
Чтобы посмотреть логи запущенного приложения, воспользуйся командой heroku logs --tail :
Heroku использует специальный текстовый файл Procfile (мини-конфиг) для явного указания директив запуска приложения.
Procfile в развернутом приложении выглядит примерно так:
Здесь объявляется тип процесса web и команда, необходимая для его запуска. Web указывает на то, что этот тип процесса будет прикреплен к стеку маршрутизации Heroku для получения трафика.
Сейчас приложение работает на одном dyno-процессе. Dyno – это легковесный контейнер Linux, запускаемый по команде из Procfile.
Проверить, сколько dyno сейчас запущено, можно так:
По умолчанию приложение деплоится в свободном dyno. Свободными они становятся (засыпают) после тридцати минут бездействия (т. е. если они не получают никакого трафика). Это поведение вызывает задержку в несколько секунд при первом запросе “пробуждения”. Последующие запросы будут выполняться нормально.
Чтобы избежать спящего режима dyno, можно обновить тип dyno на хобби или профи. Например, если ты мигрируешь свое приложение на профи уровень, можно легко масштабировать его, попросив Heroku подготовить определенное количество dyno.
Масштабирование приложения в Heroku эквивалентно изменению количества запущенных dyno.
Установить ненулевое количество веб dyno можно так:
Heroku автоматически определяет Java-приложение, если оно содержит файлик pom.xml в корневом каталоге. Ты можешь создать pom.xml для других приложений с помощью команды mvn archetype: create .
В развернутой демке приложения уже имеется pom.xml с такой начинкой:
В этом файлике указаны зависимости, требуемые для работы приложения. При развертывании Heroku прочитает файл и все установит, запустив mvn clean install .
В папке есть еще один файл, system.properties , указывающий на версию Java. Содержимое этого необязательного файла ниже:
Запусти mvn clean install в локальном каталоге, чтобы установить зависимости и подготовить систему к локальному запуску приложения. Обрати внимание, что приложению требуется Java 8, но ты можешь запушить другие приложения с поддержкой другой версии Java.
Если Maven не установлен или появляется ошибка, например, mvn is not recognized as an internal or external command , используй команду-обертку: запустив mvnw clean install на Windows или ./ mvnw clean install на Mac и Linux. Это одновременно устанавливает и запускает Maven.
Процесс Maven скомпилит и создаст JAR с зависимостями, помещая его в корневой каталог приложения. Этим процессом рулит spring-boot-maven-plugin из pom.xml.
Если ты не юзаешь Spring в pom.xml, можно указать иной плагин:
Запусти приложение с помощью команды heroku :
Для остановки приложения вернись в окно терминала и нажми CTRL+C .
На этом шаге ты узнаешь, как внести локальные изменения и развернуть их в Heroku. В качестве примера мы добавим зависимость и некоторый код.
Измени pom.xml, добавив зависимости для jscience в блок dependencies :
В 28 строке добавь:
Теперь добавь следующие объекты в 19 строку файла src/main/java/com/example/Main.java :
Добавь метод hello в 59 строку src/main/java/com/example/Main.java :
Создай src/main/resources/templates/hello.html с таким содержимым:
Heroku предоставляет поддержку Postgres, Redis, MongoDB и MySQL.
На этом шаге ты узнаешь о дополнении Heroku Postgres , поставляемом при развертывании всех приложений Java.
Heroku Postgres сама по себе является надстройкой, поэтому для обзора БД можно использовать команду heroku addons :
При разработке веб-приложения естественным шагом является его подключение к сети и предоставление его конечным пользователям. Чтобы сделать эту задачу проще, для размещения вашего приложения доступно множество облачных платформ - Heroku - одна из них.
Heroku предоставляет платформу в качестве службы для развертывания приложений различных технологических стеков, таких как Node, Java, Python и т.д. Она заботится обо всех сложных аспектах развертывания, инфраструктуры, масштабирования, обновления, безопасности и т.д. И позволяет нам сосредоточиться на логика приложения и предоставление большей ценности нашим конечным пользователям, а не развертывание.
В этой статье мы создадим действительно простое API-приложение Spring Boot REST, которое предоставит конечную точку, и рассмотрим различные способы развертывания приложения в Heroku.
Создание приложения Spring Boot
Инициализация приложения Spring Boot
Как всегда, самый простой способ начать со скелетного проекта Spring Boot - это использовать Spring Initializer:
Выберите предпочитаемый инструмент для сборки, мы будем использовать Maven. Единственная зависимость, в которой мы нуждаемся, - это зависимость от Spring Web.
В качестве альтернативы мы можем создать приложение с помощью Spring Boot CLI:
Создать конечную REST точку
Сделав скелет, давайте добавим простую конечную точку REST:
В случае, если вы не знакомы с аннотацией @RestController , это удобство аннотация выполнена в виде комбинации из @Controller и @ResponseBody .
Эта конечная точка просто возвращает текущее время сервера по запросу. Давайте запустим приложение на нашей локальной машине и проверим, работает ли оно:
Или, используя вашу IDE, просто запустите приложение и перейдите по URL-адресу вашего браузера localhost:8080/api/v1.0/time :
В качестве альтернативы вы можете использовать curl :
Развертывание в Heroku
Подготовив наше приложение, давайте рассмотрим различные способы его развертывания в Heroku.
Использование Heroku CLI с Git
Heroku предлагает собственный CLI, который мы можем использовать для развертывания приложения. Для этого нам нужно установить Heroku CLI и Git.
Прежде чем мы попытаемся развернуть его на Heroku, необходимо, чтобы приложение находилось в репозитории Git, поэтому давайте создадим репозиторий в каталоге нашего проекта:
После того, как репозиторий создан, давайте добавим и зафиксируем файлы:
Следующий шаг - войти в Heroku с помощью интерфейса командной строки Heroku и создать приложение Heroku:
Он запросит адрес электронной почты и пароль для вашей учетной записи Heroku:
После того, как мы вошли в систему, давайте создадим приложение:
Относительно быстро мы будем привязаны к приложению:
Наконец, мы можем развернуть наш код:
Heroku обнаружит, что это приложение Java / Maven по наличию файла pom.xml в хранилище. После нажатия, если вы посмотрите на журналы, вы сможете заметить:
И, наконец, развертывание завершено, и нам предлагается URL-адрес, ведущий к нашему приложению:
Давайте снова протестируем приложение, используя curl :
Или перейдя в наш браузер по его URL:
Heroku Deploy Plugin
Если мы хотим развернуть наше приложение напрямую, без использования Git-репозитория, мы можем сделать это с помощью плагина heroku-cli-deploy . Давайте начнем с его установки:
Как и в предыдущем разделе, мы просим Heroku создать приложение, но на этот раз мы включили аргумент --no-remote , чтобы не запрашивать репозиторий Git:
Обратите внимание, что на этот раз мы упомянули имя приложения - heroku-demo-stackabuse . Это создаст приложение с заданным именем, а не сгенерирует случайное имя, как в предыдущем разделе.
Мы также должны упомянуть порт, с которым Heroku будет связывать приложение в файле application.properties :
Примечание: Это необходимо, поскольку Heroku связывает приложение с портом, передаваемым в качестве переменной среды PORT , а Spring Boot по умолчанию предоставляет порт 8080 . Здесь мы просим Spring использовать PORT или 8080 если переменная окружения отсутствует, т.е. мы работаем локально.
Наконец, мы создаем наше приложение с Maven, чтобы создать jar файл и развернуть его:
Плагин Maven
Возможны сценарии, в которых мы хотели бы выполнить развертывание как часть нашей сборки Maven. Это возможно с помощью плагина Heroku Maven. Давайте разместим конфигурацию плагина в нашем pom.xml :
Всегда проверяйте последнюю версию плагина здесь.
И теперь мы можем использовать heroku:deploy для развертывания приложения:
Панель инструментов Heroku с GitHub
С CLI подходами в стороне, есть также действительно удобный подход GUI. Мы можем создать приложение на панели инструментов Heroku, связать его с учетной записью GitHub и развернуть оттуда.
Перейдите к опции «new app»:
Затем подключите свою учетную запись GitHub и найдите свой репозиторий для подключения:
После подключения вы можете развернуть свое приложение, выбрав ветвь для развертывания или непосредственно выбрав основную ветвь. Также вы можете включить автоматическое развертывание на основе коммитов в конкретной ветке:
Проверка журналов развернутых приложений
Проверка журналов развернутого приложения может быть полезна для многих целей. К счастью, к ним действительно легко получить доступ.
Используя CLI, это всего лишь одна команда:
Это позволит увидеть запущенные журналы:
Кроме того, панель инструментов Heroku позволяет нам получать к ним доступ с right-hand More > View Logs :
Heroku Procfile
PROCFILE можно использовать для настройки приложения конфигурирования или переопределения по умолчанию и команд. Например, при развертывании приложения с помощью плагина Heroku мы добавили информацию о портах в application.properties .
Это также может быть добавлено в Procfile. Мы бы добавили команды для запуска приложения, такие как:
Здесь мы добавили команду для запуска приложения с Java и добавили аргумент JVM для переопределения привязки порта Spring Boot по умолчанию.
Удаление приложения из Heroku
В какой-то момент вы можете удалить свое приложение из Heroku по любой причине. Это делается с помощью простой команды:
Мы можем запустить команду без флага --confirm , но в этом случае она предложит ввести имя приложения.
В качестве альтернативы, мы можем удалить приложение из настроек Heroku Dashboard:
Вывод
С ростом популярности облачных вычислений важно знать, как мы можем развертывать и управлять нашим приложением на облачной платформе.
Heroku - это платформа как сервис для развертывания, управления и масштабирования приложений. Он также обеспечивает бесплатное развертывание с бесплатными динамометрами. Это бесплатное развертывание может использоваться для любых демонстрационных или оценочных целей, но определенно не подходит для рабочих приложений реального времени.
Рано или поздно в разработке ботов вы столкнетесь с проблемой хостинга бота. Скорее всего, у вас нет своего собственного сервера, а платить за виртуальный не каждый хочет, да и настройка виртуального сервера может казаться чем-то непосильным для начинающих разработчиков. К счастью, есть много сервисов, предоставляющих хостинг приложений бесплатно. Одним из таких есть Heroku. Сегодня я расскажу, как легко и быстро развернуть простенького бота на данной платформе.
По умолчанию, Heroku предлагает до 5 приложений на аккаунт и дает 550 бесплатных дино-часов в месяц. Если же подключить к аккаунту банковскую карту, их к-во расширится до 1000. Подробнее о фри дино-часах можно почитать здесь.
Прежде всего, для использования Heroku, нужно авторизироваться. Если у вас нет аккаунта, создайте его, перейдя по этой ссылке. Затем нужно установить Heroku Toolbelt. Эта утилита на данный момент поддерживает основные ОС: Windows, macOS и Linux.
После установки, чтобы убедиться, что все установилось, откройте консоль и введите heroku :
Если все работает, логинимся, используя данные, введенные при регистрации:
Создание приложения
Сегодня мы будем деплоить бота, написанного во второй части. Для начала создадим наше приложение под названием momentumbots :
Имя momentumbots уже занято мной, так что придумайте свое 🙂
Если же не указывать название приложения, то будет сгенерировано рандомное название:
Ставим Вебхуки
Читайте также: