Как разместить Spring-Boot-приложение на heroku.com. Пошаговая инструкция
Написали код, всё протестировали, и теперь у вас есть рабочее приложение на Spring? Не дайте ему запылиться на жёстком диске!



Константин Шибков
Преподаватель Skillbox. Пишет про Java, учит Go. Помнит рассвет PHP и как «грабить корованы».
Попробуем разместить приложение в облаке, подключим базу данных, и вашу работу сможет увидеть весь мир. Эта инструкция подойдёт для любого проекта, написанного на Java с использованием Spring Framework , включая Telegram-боты и различные веб-сервисы.
Содержание
1. Прежде чем начать работу
Чтобы опубликовать приложение, вам потребуются:
- аккаунт на облачной платформе Heroku — просто зарегистрируйтесь;
- репозиторий с вашим проектом Spring + Мaven . Это необходимо, чтобы проект находился в отдельном репозитории, в корне которого есть файл pom.xml . Подходят любые репозитории, включая приватные;
- банковская карта для активации Add-ons, таких как MySQL или PostgreSQL, — требуется даже для бесплатных тарифов.
Heroku запускает ваше приложение в лёгких изолированных контейнерах Linux, которые называются dynos. Платформа предлагает различные типы дино, оптимизированные для разных приложений. У всех бесплатных dynos есть ограничения, о которых нужно помнить:
- Add-on ClearDB допускает не более 3 600 запросов к базе данных в час.
- Всего 550–1000 бесплатных часов активности контейнеров в месяц. Да, это примерно 41 день работы, но время делится на все ваши приложения, созданные на аккаунте.
- Если бесплатные часы активности исчерпаны, приложение после тридцати минут бездействия «засыпает». Когда вы снова зайдёте по адресу «спящего» приложения, потребуется одна-две минуты, чтобы оно ответило.
- Максимум 512 МБ оперативной памяти на контейнер.
2. Создаём новое приложение
Зайдите в личный кабинет и в правом верхнем меню нажмите New → Create new app.

Введите имя вашего приложения — имя станет частью URL для доступа к нему, а затем нажмите Create app. Живущим в европейской части России рекомендую выбирать регион Европа — дата-центр с сервером приложений окажется ближе к вам, и время отклика будет меньше.

Например, созданное мной приложение с именем shibkov-java-skillbox будет в дальнейшем доступно по адресу https://shibkov-java-skillbox.herokuapp.com/.
Теперь, когда у нас есть приложение, самое время настроить окружение для работы с Heroku в операционной системе — установить консольную утилиту heroku. Это универсальный метод для работы с приложениями, их запуска и чтения логов.
3. Устанавливаем утилиту heroku-cli
Дистрибутивы, а также краткая инструкция для каждой операционной системы находятся по адресу https://devcenter.heroku.com/articles/heroku-cli. После завершения установки запустите свой любимый эмулятор терминала и выполните команду:

Но если что-то пошло не так и команда выдаёт ошибки, посмотрите раздел https://devcenter.heroku.com/articles/heroku-cli#troubleshooting — там есть решения для многих известных проблем.
4. Авторизуемся в сервисе Heroku с помощью клиентского приложения
Теперь самое время авторизоваться на heroku.com через консольную утилиту. Наберите в терминале:

Когда откроется браузер, потребуется ввести логин и пароль. А если вы уже были авторизованы в heroku.com, то останется только подтвердить действие и нажать Log in.

Затем можно просто вернуться в терминал — вы увидите, что успешно залогинились в консольном приложении.

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

5. Создаём Add-on для работы с MySQL/Postgres
Если ваше приложение использует файловую базу данных или не использует БД вообще, этот шаг вы можете пропустить.
На этом этапе потребуется ввести данные вашей банковской карты. Деньги не будут списаны, пока вы пользуетесь бесплатным тарифом и не превышаете лимиты. Этого более чем достаточно для демонстрации работы приложения и обучения, но для серьёзной работы придётся подписаться на один из платных тарифов Heroku.
Откройте список ваших приложений и зайдите в панель управления приложения, которое мы недавно создали. Затем перейдите в закладку Resources и в поле ввода Add-ons наберите mysql. Если планируете работать с движком MySQL, найдите в списке ClearDB MySQL, а если с Postgres — Heroku Postgres.

Бесплатный тариф здесь называется Ignite — Free. Выберите его. После подтверждения вас попросят ввести данные банковской карты.

Когда введёте информацию о банковской карте, снова перейдите в Add-ons и создайте базу данных ClearDB — в окне выбора тарифа нажмите Provision. После этого в вашем списке Add-ons появится эта новая БД. Теперь самое время попробовать подключиться к ней и задать структуру.
6. Настраиваем подключение к базе данных
Откройте настройки Settings вашего приложения:

В разделе Config Vars нажмите кнопку Reveal Config Vars — откроется список переменных конфигурации.

Сейчас нас интересует переменная CLEARDB_DATABASE_URL, в которой содержится строка-ссылка для доступа к БД с указанием логина, пароля и других параметров подключения.
Рассмотрим подробнее эту строку и её составляющие:
mysql://b04d2ddd4273f2:63623d8c@eu-cdbr-west 02. cleardb.net/heroku_b72e9b34372c084? reconnect=true
Здесь в строке уже есть протокол, имя пользователя, пароль и хост, где находится наша база данных. Параметры упакованы в эту строковую переменную по схеме:
[protocol://][user[: [password]]@]host[: port][/schema][? attribute1=value1.]
Подробнее о том, как это работает, можно почитать в разделе «Подключение к серверу с помощью строк типа URI или пар „ключ-значение“» официальной документации по MySQL 8.0.
Чтобы наше приложение и БД работали в кодировке UTF, необходимо после знака вопроса добавить в строку подключения (через амперсанд) следующие параметры: useUnicode=true, characterEncoding=utf-8, reconnect=true.
В итоге должно получиться следующее:
mysql://b04d2ddd4273f2:63623d8c@eu-cdbr-west-02.cleardb.net/heroku_b72e9b34372c084? useUnicode=true& characterEncoding=utf-8& reconnect=true
Теперь, когда разобрались с форматом, можно открыть ваш любимый клиент для работы с MySQL и создать новое подключение, используя данные из строки CLEARDB_DATABASE_URL.
Неплохой выбор утилиты для работы с БЗ — community-версия DBeaver. Она совершенно бесплатна и есть для всех ОС.

На этом этапе и далее запускайте утилиту с параметром reconnect=true, как показано на скриншоте. Чтобы проверить, правильно ли настроен драйвер, просто нажмите Test Connection. Вы должны получить примерно такое сообщение в модальном окне.

В том случае, если ваше приложение не должно самостоятельно создавать структуру БД, придётся это сделать вручную. Также не забудьте перенести в БД на Heroku дамп тестовых данных. После этих операций база готова, мы можем использовать её для дальнейшей работы.
7. Настраиваем Java-Spring-приложение
Теперь добавим в наше Java-Spring-приложение настройки, необходимые для его отправки и запуска в контейнере Heroku.
Все дальнейшие действия будут показаны на примере операционной системы Windows. На других ОС всё очень похоже, потому что мы везде используем консольную утилиту heroku cli.
Для примера я взял одну из дипломных работ студентов курса «Профессия Java-разработчик». Ваши файлы с параметрами могут немного отличаться, но все остальные настройки будет примерно такими же.
Клонируйте ваш репозиторий и/или откройте проект в IDE — на скриншотах примера показана работа с IntelliJ IDEA Community 2020. Проект должен находиться в корне репозитория.
Первое, что нужно сделать, — добавить в файл конфигурации application.properties наши настройки параметров базы данных и номер порта веб-сервера, по которому приложение будет доступно в браузере. Если его не указать, Heroku назначит порт при запуске проекта самостоятельно.
Как развернуть spring прлоижение на сервер?
Дорбого времени суток, изучаю спринг, хочу попробвать игрушечные мини сайтик (чисто для себя и учебных целей, чтобы не только на локальном сервере через intelliJIDEA запускать, а еще уметь вот так вот, сразу на хост) залить на сервер/хостинг. Как это сделать? Что для этого надо?
Я погуглил, нагуглил, что надо покупать хостинг VPS (что очень дорого для обычных тестов лабы1 лабы2) и там через apache уже ставить. Есть ли еще способы, менее затратные?
- Вопрос задан более трёх лет назад
- 1298 просмотров
Комментировать
Решения вопроса 0
Ответы на вопрос 3
Попробуйте heroku. Там есть инструкция для maven и gradle
Платформа берет ваш исходный код из репозитория и разворачивает на своих серверах. За поиграться платить не придется
Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать

Hetzner cloud, vscale, reg.ru, все они с почасовой оплатой
Ответ написан более трёх лет назад
Настройка Ubuntu под хостинг JVM приложения
Если Вам интересно, как настроить сервер для хостинга JVM приложения, то предлагаю вашему вниманию следующую инструкцию. Предположим, вы только что получили доступ к чистому VPS серверу, на котором крутится Ubuntu и вы хотите на нём развернуть полноценное JVM приложение, основанное на Spring. Для полноты картины мы настроим также локальный postgres и доступ извне по http.
Прежде всего обновляем индекс менеджера пакетов apt. У вас должно быть достаточно прав для выполнения sudo, а также ваш сервер должен иметь доступ в Интернет.
sudo apt update
Установка и настройка Java
Для работы нашего jvm-приложения сначала требуется установить виртуальную машину Java. Ставим последнюю LTS (long-term support – длительная поддержка) версию. На данный момент это Java 17.
# если планируем компилировать на сервере, то ставим JDK
sudo apt-get install openjdk- 17 -jdk
# если будем запускать уже скомпилированное приложение, то JRE
sudo apt-get install openjdk- 17 -jre
# затем проверяем, что по умолчанию установилась нужная версия
java -version
JDK – это Java Development Kit, т.е. версия Java для разработчиков. Включает в себя компилятор. JRE – это Java Runtime Environment, т.е. среда исполнения. Причём JDK включает в себя JRE. На сервере чаще всего достаточно поставить именно JRE.
Опционально можно вручную настроить переменную окружения JAVA_HOME в файле /etc/environment. Добавляем в конце файла на новой строке:
JAVA_HOME= «/usr/bin/java»
Установка и настройка postgres
sudo apt install postgres
# заходим в систему под пользователем postgres
sudo -i -u postgres
# создаём базу данных с нужным именем
createdb имя_базы
# создаём пользователя для этой БД
createuser имя_пользователя —interactive
При создании пользователя вам будет задан только один вопрос. Создать его как суперпользователя? То есть наделить его всей полнотой полномочий для работы с БД. Выбираем yes.
Что касается имени пользователя и базы, то называйте их как-то похожим образом. Например, mydb и mydb_user.
Теперь заходим в сам postgres, выполнив команду psql. По сути psql – это консольный вариант клиента БД, который позволяет выполнять любые sql команды при наличии прав.
Установим для только что созданного пользователя хороший пароль (не забывайте точку с запятой в конце):
alter user имя_пользователя with encrypted password ‘pa$$w0rd’ ;
Кстати, генератор паролей доступен на данном сайте в разделе «Утилиты».
Выходим из psql командой \q.
Теперь в конце файла /etc/postgresql/номер_версии/main/pg_hba.conf добавляем:
host база пользователь all password
Не забудьте заменить на свои имена базы и пользователя. Так мы указываем, что авторизация данного пользователя происходит именно по паролю, который мы задали выше.
Теперь если нам требуется подключаться к данной БД снаружи, а не только из самого приложения, работающего на этом же хосте, находим в файле /etc/postgresql/номер_версии/main/postgresql.conf
следующую закомментированную строку и раскомментируем её:
# listen_addresses = ‘*’;
Так мы разрешаем подключаться к БД снаружи с любого ip-адреса. При необходимости вы можете задать специальную маску, ограничив до нужной подсети.
Чтобы все изменения вступили в силу, перезапускаем postgres:
sudo service postgresql restart
Запускаем приложение как linux-сервис
Для начала нам нужно, чтобы имя jar-файла, которое получается в результате компиляции нашего Spring-приложения, не менялось от версии к версии. Задать его в явном виде в gradle можно так:
// файл build.gradle.kts
tasks bootJar archiveFileName.set( «ИМЯ.jar» )
>
>
Если вы используете maven, то используйте следующую настройку:
Предположим, у нас уже есть скомпилированное jvm-приложение, которое умеет слушать порт 8080. Чтобы это приложение всё время работало на сервере и автоматически запускалось при старте сервера, нужно зарегистрировать его как linux-сервис.
Для этого с помощью scp копируем jar-файл (если их несколько, копируем тот, который больше) на сервер. Например, в папку /var/имя_приложения/имя_приложения.jar
Затем в папке /etc/systemd/system/ создаём файл имя_приложения.service со следующим содержимым:
[Unit]
Description=описание
After=syslog.target
[Service]
User=имя_пользователя
Environment= «КЛЮЧ=ЗНАЧЕНИЕ»
Environment= «LOGGING_FILE_PATH=/var/log/имя_приложения/»
Environment= «TZ=Europe/Moscow»
ExecStart=/usr/bin/java -jar /var/имя_приложения/имя_приложения.jar
Тут в параметре User указывайте, под каким пользователем системы следует запускать сервис. Разумеется, у него должны быть права на это.
В параметрах Environment вы можете задавать различные переменные окружения в формате «ключ=значение». В данном примере уже задан часовой пояс (TZ) и путь до папки с логами (LOGGING_FILE_PATH). Именно здесь вы можете указать профиль приложения test или prod.
В ExecStart указыватся команда для запуска приложения. Здесь просто подставьте ваши значения.
Сохраняем файл, после чего активируем сервис и запускаем его:
# активация
sudo systemctl enable имя_сервиса.service
# первичный запуск
sudo service имя_сервиса start
Теперь наш сервис будет запускаться автоматически даже при перезагрузке сервера.
Если будете менять какие-то настройки в service-файле, не забывайте выполнять команду systemctl daemon-reload, чтобы изменения вступали в силу.
Настройка Nginx
Поскольку наш сервис слушает порт 8080, вы уже можете обращаться к нему снаружи, указав имя хоста или ip-адрес и порт 8080. Но как сделать так, чтобы порт не нужно было указывать в явном виде? В этом нам поможет Nginx, который будет проксировать все запросы с дефолтного порта 80 на порт нашего приложения 8080.
# ставим Nginx
sudo apt install nginx
Теперь открываем конфигурацию /etc/nginx/nginx.conf и находим там секцию http. Внутри неё нужно разместить секцию server:
http <
…
server <
listen 80;
server_name домен;
listen 80 указывает, что мы хотим слушать порт 80. Секция «location /» говорит о том, что все запросы с корня url мы перенаправляем на localhost на порт 8080 (параметр proxy_pass).
# проверяем, что не ошиблись в синтаксисе конфигурации
sudo nginx -t
# перечитываем конфиг
sudo nginx -s reload
# удаляем дефолтную страницу-заглушку — она нам больше не нужна
sudo rm /etc/nginx/sites-enabled/default
Теперь в урле при обращении к нашему сервису порт указывать не нужно.
Настройка брандмауэера
Напоследок было бы неплохо настроить хоть какую-то защиту нашего сервера. Воспользуемся стандартным брандмауэром UFW (Uncomplicated Firewall). По умолчанию он разрешает все подключения изнутри наружу и запрещает все подключения снаружи к серверу. Установка и настройка его предельно проста.
# установка
sudo apt install ufw
# Важно! Разрешаем ssh-подключения!
sudo ufw allow ssh
Команда вида «ufw allow протокол» позволяет разрешить подключения на определённый порт извне. Прежде всего, не забудьте разрешить ssh-подключение. Если вы забудете это сделать, то после активации ufw вы потеряете доступ к серверу.
Разрешим ещё несколько протоколов:
# разрешаем http и https протоколы (порты 80 и 443)
sudo ufw allow http
sudo ufw allow https
# разрешаем postgres на порту 5432
sudo ufw allow postgres
# включаем брандмауэр
sudo ufw enable
После активации брандмауэра все запрещённые порты окажутся недоступны!
Заключение
Мы рассмотрели вопросы установки Java и postgres на сервер с Ubuntu. Также научились запускать наше Spring-приложение как linux-сервис. После этого научились пробрасывать запросы с порта 80 на порт нашего приложения с помощью Nginx. И, напоследок, рассмотрели вопросы ограничения доступа с помощью брандмауэра UFW.
Если вы обнаружите неточности или у вас есть дополнения – пишите их в комментах.
Spring Boot – развертывание Tomcat
Используя приложение Spring Boot, мы можем создать файл war для развертывания на веб-сервере. В этой главе вы узнаете, как создать файл WAR и развернуть приложение Spring Boot на веб-сервере Tomcat.
Spring Boot Servlet Initializer
Традиционный способ развертывания – заставить класс Spring Boot Application @SpringBootApplication расширить класс SpringBootServletInitializer . Файл класса Spring Boot Servlet Initializer позволяет настроить приложение при его запуске с помощью контейнера сервлетов.
Код для файла класса Spring Boot Application для развертывания файла JAR приведен ниже –
package com.tutorialspoint.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DemoApplication public static void main(String[] args) SpringApplication.run(DemoApplication.class, args); > >
Нам нужно расширить класс SpringBootServletInitializer для поддержки развертывания WAR-файла. Код файла класса Spring Boot Application приведен ниже –
package com.tutorialspoint.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.support.SpringBootServletInitializer; @SpringBootApplication public class DemoApplication extends SpringBootServletInitializer @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) return application.sources(DemoApplication.class); > public static void main(String[] args) SpringApplication.run(DemoApplication.class, args); > >
Настройка основного класса
В Spring Boot нам нужно упомянуть основной класс, который должен запускаться в файле сборки. Для этого вы можете использовать следующие фрагменты кода –
Для Maven добавьте начальный класс в свойствах pom.xml, как показано ниже –
com.tutorialspoint.demo.DemoApplication
Для Gradle добавьте имя основного класса в build.gradle, как показано ниже –
mainClassName="com.tutorialspoint.demo.DemoApplication"
Обновите упаковку JAR в WAR
Мы должны обновить упаковочный JAR-файл в WAR, используя следующие фрагменты кода:
Для Maven добавьте упаковку как WAR в pom.xml, как показано ниже –
Для Gradle добавьте плагин приложения и плагин war в build.gradle, как показано ниже –
apply plugin: ‘war’ apply plugin: ‘application’
Теперь давайте напишем простую конечную точку отдыха, чтобы вернуть строку «Hello World from Tomcat». Чтобы написать конечную точку отдыха, нам нужно добавить в наш файл сборки зависимость веб-стартера Spring Boot.
Для Maven добавьте стартовую зависимость Spring Boot в pom.xml, используя код, как показано ниже –
org.springframework.boot spring-boot-starter-web
Для Gradle добавьте начальную зависимость Spring Boot в build.gradle, используя код, как показано ниже –
dependencies
Теперь напишите простой файл конечной точки отдыха в файле класса Spring Boot Application, используя код, показанный ниже:
package com.tutorialspoint.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.support.SpringBootServletInitializer; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @RestController public class DemoApplication extends SpringBootServletInitializer < @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) < return application.sources(DemoApplication.class); >public static void main(String[] args) < SpringApplication.run(DemoApplication.class, args); >@RequestMapping(value = "/") public String hello() < return "Hello World from Tomcat"; >>
Упаковка вашего приложения
Теперь создайте файл WAR для развертывания на сервере Tomcat, используя команды Maven и Gradle для упаковки вашего приложения, как указано ниже:
Для Maven используйте команду mvn package для упаковки вашего приложения. Затем будет создан WAR-файл, и вы сможете найти его в целевом каталоге, как показано на скриншотах ниже:


Для Gradle используйте команду gradle clean build для упаковки вашего приложения. Затем ваш WAR-файл будет создан, и вы сможете найти его в каталоге build / libs . Обратите внимание на скриншоты, приведенные здесь для лучшего понимания –


Развернуть в Tomcat
Теперь запустите сервер Tomcat и разверните файл WAR в каталоге webapps . Посмотрите на скриншоты, показанные здесь, для лучшего понимания –


После успешного развертывания, нажмите на URL в вашем веб-браузере http: // localhost: 8080 / demo-0.0.1-SNAPSHOT / и обратите внимание, что результат будет выглядеть так, как показано на скриншоте ниже –

Полный код для этой цели приведен ниже.
4.0.0 com.tutorialspoint demo 0.0.1-SNAPSHOT war demo Demo project for Spring Boot org.springframework.boot spring-boot-starter-parent 1.5.8.RELEASE UTF-8 UTF-8 1.8 com.tutorialspoint.demo.DemoApplication org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-maven-plugin
build.gradle
buildscript < ext < springBootVersion = '1.5.8.RELEASE' >repositories < mavenCentral() >dependencies < classpath("org.springframework.boot:spring-boot-gradle-plugin:$") > > apply plugin: ‘java’ apply plugin: ‘eclipse’ apply plugin: ‘org.springframework.boot’ apply plugin: ‘war’ apply plugin: ‘application’ group = ‘com.tutorialspoint’ version = ‘0.0.1-SNAPSHOT’ sourceCompatibility = 1.8 mainClassName = «com.tutorialspoint.demo.DemoApplication» repositories < mavenCentral() >dependencies
Код основного файла класса приложения Spring Boot приведен ниже –