1 марта 2025
Тэги: devops, Docker, gradle, Spring Boot, руководство.
После того как вы создали своё первое приложение на Spring Boot, вы можете задаться вопросом: как развернуть его на сервере, чтобы оно работало в режиме 24/7 и было доступно в интернете? Для этих целей можно создать виртуальный сервер, установить туда нужную ОС, установить java и, возможно, развернуть базу данных типа Postgres. После этого надо собрать jar-файл (можно и локально), загрузить его по ssh и запустить как Unix-сервис. Подобные шаги я описывал в статье Настройка Ubuntu под хостинг JVM приложения. Однако это неудобно и затратно по времени.
Более правильный вариант – это настроить конвейер CI/CD, чтобы не вручную закачивать jar-файл, а запускать сборку автоматически при отправке новых изменений в github. Однако для этого нужно обладать знаниями devops, и, что более критично, хороший конвейер потребляет много ресурсов при сборке, ибо тоже работает на сервере. Порой даже больше, чем будет потреблять собираемое им приложение.
Отсюда следует вывод, что для небольших проектов нецелесообразно разворачивать полноценный конвейер. Но тогда как получить непрерывную сборку и интеграцию и при этом потратить минимум усилий, избегая ручной работы? Об этом и поговорим далее.
Предположим, вы сгенерили с помощью Spring Initializr заготовку gradle-проекта на Java или Kotlin, добавили необходимую вам бизнес-логику. В итоге ваше приложение умеет подниматься локально на порту 8080 и отвечает на запросы.
Тогда добавим в файл build.gradle.kts следующую секцию:
Это позволит нам получить фиксированное имя jar-файла после компиляции. По умолчанию оно содержит номер версии, что не совсем удобно.
Теперь создадим Dockerfile и поместим его в корень проекта.
Содержимое данного файла вы можете скопировать как есть, только заменив в конце строку «имя-приложения.jar». Оно должно совпадать с тем, что вы указали в файле build.gradle.kts. Данный пример рассчитан на сборку под Java 21 (самая последняя long-term support версия на данный момент).
Наличие Dockerfile позволяет выполнять деплой docker-контейнеров на разных хостингах независимо от технологий виртуализации, которые используются у этого хостера. Но мне, как программисту, хотелось бы развернуть проект прямо из репозитория, подобно тому, как это делается в heroku.
Эта технология называется Push-To-Deploy и она поддерживается в dockhost.ru. Вам достаточно запушить изменения в репозиторий, и всё остальное платформа сделает за вас: выполнит сборку проекта, создаст контейнер и подставит переменные окружения. При необходимости также можно привязать свой домен или сгенерить бесплатный. Https-сертификат при этом будет выпущен автоматически.
Итак, заходим в «Панель Управления» и создаём новый проект. Указываем для него какое-то понятное имя. Также при необходимости здесь можно указать другой часовой пояс (по умолчанию UTC).
Теперь перед подключением репозитория надо выставить все переменные окружения. В меню выбираем «Окружение» – «Переменные окружения». И там добавляем все переменные, которые используются в нашем проекте в application.yml. Чаще всего это параметры подключения к БД или приватные ключи доступа. При добавлении каждой переменной не забывайте делать её глобальной, отмечая соответствующий чекбокс.
После того как все необходимые переменные выставлены, выбираем пункт меню «Репозитории Git».
Здесь указываем произвольное имя для будущего контейнера, а также путь до вашего git-репозитория. Вы можете использовать любой репозиторий: github, gitlab, bitbucket, gitverse и т.п.
Если репозиторий приватный, нужно также указать данные для авторизации. Указываем логин от своей учётки и токен (не пароль!). Токен можно выпустить в самом репозитории.
Также dockhost позволяет настроить лимиты на потребляемые ресурсы, от которых напрямую зависит стоимость хостинга. Для небольшого проекта на Spring Boot достаточно минимального резервирования процессора в 5%, а вот памяти лучше выделить 512 MiB.
Нажимаем кнопку «Применить» и сразу после этого начнётся сборка образа и деплой контейнера. Впоследствии сборка будет запускаться автоматически при каждом изменении в ветке main.
Если все переменные окружения выставлены правильно, то через пару минут наше приложение будет полностью готово к работе. Процесс запуска также можно отслеживать через веб-интерфейс в логах контейнера. При этом пока выполняется сборка, старая версия приложения продолжает работать, обеспечивая непрерывность сервиса для пользователей.
Если вашему приложению не требуется публичная точка доступа (как telegram-боту в режиме long-polling), то этих шагов достаточно для деплоя.
Но как быть, если ваше приложения – это публичное API или полноценный веб-сайт? Такое приложение должно быть доступно извне. dockhost позволяет привязать ваш собственный домен или может выдать бесплатный домен третьего уровня.
Для начала у контейнера нужно открыть порт 8080. Именно на этом порту по умолчанию запускается приложение Spring Boot (можно переопределить в application.yml). В меню выберем пункт «Контейнеры», затем наш контейнер и выберем в контекстном меню «Редактировать». Там ищем секцию «Порты», нажимаем «Добавить порт» и пишем «8080/TCP».
Затем нужно прописать домен. В меню выбираем «Сетевые сервисы» – «Домены». Если у вас есть собственный домен, то при добавлении нужно выбрать «Внешний». Если хотите, чтобы dockhost сам назначил бесплатный домен третьего уровня – выбираем «Динамический».
Если используете собственный домен, вам также потребуется прописать на вашем сервере имён ip-адрес, который назначит dockhost. Как правило, подобные настройки выполняются с помощью панелей управления типа DNS Admin или ISP Manager.
Независимо от того, какой тип домена вы выберете, dockhost.ru автоматически выпустит для него сертификат Let's Encrypt. Это очень удобно, что «из коробки» вы сразу получаете https!
Далее создаём сетевой сервис, в котором нужно указать целевой контейнер и порт. Выбираем «Сетевые сервисы» – «Сервисы» и создаём новый:
Ну а теперь осталось связать сетевой сервис и домен. Делается это в пункте меню «Сетевые сервисы» – «Маршруты».
В любой момент вы можете посмотреть визуализацию связей между этими сущностями, выбрав в меню «Сетевые сервисы» – «Карта сети». Для корректной работы все компоненты должны быть последовательно связаны между собой от домена до контейнера.
Вот теперь наше приложение доступно по https из любой точки мира!
В этой статье мы рассмотрели как работает схема Push-to-Deploy на примере dockhost.ru. Вам достаточно добавить в проект на Spring Boot типовой Dockerfile, чтобы получить все преимущества полноценного CI/CD. Вам не нужно тратить много времени на его настройку и серверных ресурсов на его поддержку. И при этом вы полностью автоматизируете деплой вашего приложения.
Kotlin, Java, Spring, Spring Boot, Spring Data, SQL, PostgreSQL, Oracle, H2, Linux, Hibernate, Collections, Stream API, многопоточность, чат-боты, нейросети, файлы, devops, Docker, Nginx, Apache, maven, gradle, JUnit, YouTube, новости, руководство, ООП, алгоритмы, головоломки, rest, GraphQL, Excel, XML, json, yaml.