Skip to content

Jak uruchomić swój projekt Spring Boot w sieci na platformie Heroku?

Jesteś w trakcie rozwijania swojego projektu Spring Boot? Być może jest to jakiś mały hobbystyczny projekt, tworzony po godzinach. A może właśnie budujesz coś do swojego portfolio, co ma posłużyć jako przepustka do kariery w IT? Jakikolwiek cel by to nie był, w którymś momencie zaczniesz zastanawiać się, jak można swoim dziełem podzielić się ze światem i udostępnić go w sieci.

Najlepiej gdyby dało się to zrobić:
– łatwo,
– szybko,
– i przyjemnie.
A już idealnie, gdyby to jeszcze nic nie kosztowało. Brzmi mało realnie, ale okazuje się, istnieje platforma Heroku, która dla prostych aplikacji spełnia wszystkie z powyższych wymogów.

Dygresja na temat braku ukrytych kosztów

Jakim cudem Heroku jest w stanie oferować darmową platformę dla prostych aplikacji?

To, że w podstawowej wersji nie musimy za niego nic płacić, wynika z bardzo prostego faktu, że twoja aplikacja i zasoby serwera są uruchamiane tylko i wyłącznie w sytuacji kiedy ktoś tę stronę odwiedza. Jeżeli wejdziesz po jakiejś przerwie na swoją stronę, zauważysz, że ładuję się ona nieco dłużej niż zwykle. Dzieje się tak dlatego, że czas ten jest poświęcony na przygotowanie wirtualnej maszyny i start twojej aplikacji. Analogicznie do tego, z chwilą, gdy twoja aplikacja nie otrzymuje żadnych requestów z sieci, Heroku zwalnia te zasoby dla innych, a twoją aplikację ubija.
Wiedząc to na pewno nierozsądne, byłoby stawianie na darmowym Heroku bardziej newralgicznych aplikacji, dlatego ten punkt o zerowych kosztach jest nieco na wyrost i sprawdzi się tylko dla projektów hobbystycznych lub prostych dem. Drugim powodem jest mocne ograniczenie zasobów, na jakie pozwala ta najmniejsza opcja. O ile na proste aplikacje to w zupełności wystarczy, o tyle bardziej rozbudowanych projektów tam nie uruchomisz.

W tym artykule pokażę Ci krok po kroku, jak uruchomić swój własny projekt Spring Boot na platformie Heroku.

Wymagania

Projekt Java używający frameworka Spring Boot

Projekt taki z łatwością wygenerujesz tutaj https://start.spring.io/

Konto na GitHub do wersjonowania kodu

Jeżeli jeszcze nie używasz platformy GIT do trzymania na niej swojego kodu, to jak najszybciej warto to nadrobić. Nawet jeśli używasz alternatywnych rozwiązań, nadal warto rozważyć GitHuba, głównie za sprawą łatwości integracji np. ze wspomnianą w tym wpisie platformą Heroku. Adres to oczywiście https://github.com/

Konto na Heroku

Platforma hostingowa Heroku dostępna jest pod adresem https://www.heroku.com

Konfiguracja

Skonfigurowanie i uruchomienie projektu jest banalnie proste. Poniżej prezentuję, szybką instrukcję zwracając uwagę na kilka istotnych punktów.

Utwórz aplikację

Po zalogowaniu się na konto Heroku kliknij przycisk New i wybierz Create new app.

Wybierz nazwę swojej aplikacji, to co ważne, będzie też stanowiła fragment przydzielonego dla niej adresu DNS. Zmień region na europejski, chyba że akurat realizujesz ten projekt z doliny krzemowej 🙂

Skonfiguruj repozytorium

Kolejny krok, to konfiguracja repozytorium, z którego Heroku będzie dociągać najnowszy kod, budować go i wdrażać na swoich serwerach. To, co istotne, jeżeli robisz ten krok pierwszy raz, musisz zadbać o odpowiednie uprawnienia z poziomu GitHuba dla Heroku. Aby to zrobić, wystarczy, że klikniesz niebieski link Ensure Heroku Dashboard has team access.

Zadbaj o odpowiednie uprawnienia dla aplikacji Heroku na GitHubie

Zostaniesz wtedy przeniesiony do GitHuba, gdzie będziesz mógł dać uprawnienia dla całego repozytorium lub jednej ze swoich organizacji jeżeli tworzysz projekt z kilkoma osobami.

Powyżej przykład uprawnień dla aplikacji Heroku dashboard, która umożliwia na dostęp do kodu trzymanego na koncie oraz organizacji kodujmy. Takie uprawnienie nie zostało natomiast nadane dla organizacji Javafaktury.

Wdróż aplikację na serwer

Po wyszukiwania swojego repozytorium ekran zostanie rozszerzony o kolejne opcje. Z tego poziomu, wystarczy, że klikniesz przycisk Deploy branch, a twój kod zacznie być budowany i wdrażany na środowisko Heroku.

Polecam Ci zaznaczyć włączenie automatycznych deploymentów, wtedy dla każdego commita do mastera, twój kod będzie automatycznie przebudowywany i wdrażany na serwer, bez potrzeby ręcznej ingerencji. Jest to bardzo wygodne ułatwienia i namiastka bardzo krótkiego Continous Deployment. Jedynym ryzykiem, o jakim powinieneś pamiętać, że wdrażane będzie wszystko bez względu na stan twojej aplikacji. Jeżeli zdarzy Ci wyprodukować jakieś błędy w kodzie lub co gorsza, projekt przestanie się uruchamiać z jakiegoś powodu, taka wersja zostanie wdrożona i zastąpi ostatnią stabilną aplikację. Nad technikami radzenia sobie z tym, jeszcze kiedyś porozmawiamy na łamach tego bloga.

Jeżeli wszystko poszło zgodnie z planem, już za chwilę powinien pojawić się przycisk kierujący do twojej aplikacji. W moim przypadku jest to projekt prostej aplikacji, która wybiera imię dla dziecka, bazując na danych statystycznych, wyborów dokonywanych przez polskich rodziców.

https://baby-name-picker.herokuapp.com/

Polecam, rzucić okiem na rzadkie wybory Polaków na liście tej aplikacji https://baby-name-picker.herokuapp.com/all
Niektórym imionom nie można zarzucić braku oryginalności 🙂

PS. Jeżeli interesuje Cię to konkretne źródło danych, polecam odwiedzić serwis https://dane.gov.pl/pl, gdzie znajdziesz więcej polskich zbiorów. Kto wie, może któryś z nich stanie się dla Ciebie inspiracją na twoją kolejną aplikację.

Najpopularniejsze pułapki

Może się okazać, że z jakiegoś powodu, twoja aplikacja nie chce się wdrożyć lub poprawnie uruchomić. Poniżej kilka z popularniejszych problemów, na jakie możesz trafić.

Odpowiednia struktura lub dodatkowa konfiguracja

Aby powyższa instrukcja zadziałała, twoje repozytorium powinno posiadać jeden projekt w repozytorium wrzucony luzem, beż żadnych dodatkowych katalogów. Tak jak tutaj https://github.com/towczare/HerokuDemo (to inny przykład aplikacji, którą używałem podczas szkoleń)

Jeżeli, z jakiegoś powodu nie jesteś w stanie spełnić tego wymogu np.:

  • Posiadasz projekt wielomodułowy, gdzie jest więcej artefaktów wynikowych,
  • lub z jakiegoś powodu, chcesz posiadać inną strukturę katalogową.

W takim przypadku niezbędny będzie zmienna środowiskowa PATH_TO_JAR wskazująca, gdzie Heroku powinien spodziewać się wyprodukowanego jara, którego powinien wdrożyć po z budowaniu aplikacji. Opcje te są dostępne w sekcji zmiennych w zakładce Settings. Poniżej przykład powyższej wdrażanej aplikacji:

Inna wersja Javy

Heroku nadal domyślnie buduje projekty dla Javy w wersji 8. Aby wymusić na nim inną wersję, np. 11 należy w głównym katalogu umieścić plik system.properties z zastępującym wpisem:

java.runtime.version=11

Gdzie szukać przyczyny błedów?

Oczywiście w logach. Dostęp do logów w Heroku jest bardzo prosty, również w ramach oferowanej platformy. Pod przyciskiem View logs w rozwijanej zakładce More.

Co z bazą?

Ten artykuł, nie porusza przykładu aplikacji, która posiada bazę danych. Taki przykład posiadam na swoim repozytorium i jeżeli będzie chęć, postaram się przygotować osobny wpis, lub rozszerzyć obecny o taką cześć. Dla niecierpliwych polecam sekcję README w https://github.com/towczare/HerokuDemo. Zawarłem w nim instrukcję jak to zrobić.

Czy nie łatwiej jest z poziomu CLI?

Opisany przeze mnie sposób nie jest jedynym sposobem, w jaki można uruchomić swój projekt na platformie Heroku. Jest też możliwość zrobienia tego z poziomu konsoli przy użyciu udostępnionego interface’u konsoli. Jeżeli jesteś ciekawy jak opcje wdrożeń, wyglądają z poziomu konsoli, zachęcam Cię do zerknięcia na oficjalne strony dokumentacji https://devcenter.heroku.com/categories/command-line

Podsumowanie

Mam nadzieję, że po tym wpisie orientujesz się już jak wdrażać aplikację Spring Boot na platformę Heroku. Jest to banalnie proste a przy tym przydatne w dzisiejszych czasach. Jeżeli stawiasz swoje pierwsze kroki, warto, abyś wykorzystał tę wiedzę np. podczas wysyłania CV do firm. Live demo zawsze robi dobre wrażenie, na osobach rekrutujących.