Pred tým než vôbec pôjdeme riešit Heroku je potrebné vytvoriť v root-e nášho projektu súbor system.properties
s obsahom: java.runtime.version=11
čím Heroku povieme, že používame Java verziu 11. Inak by sa nám appka na Heroku nespustila.
Deployment do Heroku je pomerne jednoduchý. Musíme si iba vytvoriť novú appku v Heroku a to je skoro všetko. Poďme na to. Naviguj sa tutaj (Heroku dashboard). Ak nemáš účet, tak ťa to asi vyzve na login/registráciu. Zaregistruj sa/prihlás sa, ja počkám.
Po prihlásení by si sa už mal/a vediet dostať na svoj Heroku dashboard. Na pravo je také fiaolové tlačidlo s nápisom “New“. Na to klikneme a vyberieme Create new app.
Vyplníme – región si nastavme na Európu, aj keď je to momentálne pomerne jedno. Klikneme na “Create app” a hotovo. Appka v Heroku vytvorená.
Ako tam teraz dostaneme našu krásnu aplikáciu? Naštastie až veľmi jednoducho. Po vytvorení appky by ťa Heroku malo odnavigovať na dashboard tvojej novej aplikácie. Nájdi sekciu Deploy using Heroku Git. Nasleduj inštrukcie v tejto sekcii a malo by sa ti podariť aplikáciu deploynúť – ja ich tu zbytočne nebudem opakovať.
Iba v skratke: Stihaneš si Heroku CLI. Pomocou CLI (v termináli) zavoláš príkaz heroku login
, Heroku ti otvorí browser, prihlásiš sa do Heroku, Heroku CLI ti vygeneruje SSH kľúč a tým pádom budeš môcť pristupovať k tvojej appke cez CLI. Mega.
Z tvojho projektu spravíš git repozitár – git init
. Potom Heroku povieš, že “Hej Heroku, nastav mi prosím ťa git tak, aby s tebou vedel komunikovať” a.k.a. heroku git:remote -a passwords-gk2
. Teraz musíme commitnúť všetky naše zmeny do git-u:
git add -A
git commit -am "add initial project setup"
git push heroku master
Bežne asi pushujes do gitu cez git push origin master
. “Origin” je však iba označenie repozitára, do ktorého pushujeme. Môže to byť kľudne aj “hababubla”, ak si tak git nastavíš. A Heroku nám teraz git nastavilo tak, že nám vytvorilo označenie “heroku”. Preto môžeme takýmto jednoduchým spôsobom pushnúť našu appku do Heroku, čím sa tvoja aplikáca automaticky reštartne a spustí s novým kódom.
Ďalšia super vec je, že nemusíme ani nikde hovoriť, že ide o Spring Boot API v Kotline. Heroku rozpozná (asi podľa prítomneho build.gradle súboru, alebo nejak inak), že sa jedná o Gradle, Spring Boot Kotlin (JVM) aplikáciu a tým pádom aplikáciu jednoducho spustí jak pán (alebo paní?).
Nó a hotovo. Tvoja appka je deploynutá. Hore v dashboarde tvojej appky nájdeš button “Open app”. Keď naň klikneš, tak ťa Heroku odnaviguje na tvoju deploynutú aplikáciu. Možno sa ti zobrazí chyba. Skús sa ale navigovať na naše dva endpointy a malo by ti to ísť. Skús endpointy otestovať aj z Postman-a.
Doteraz sme využívali lokálnu databázu, ktorá sa ukladala do súboru. Na našom reálnom serveri si takéto niečo ale neprosíme. Chceme mať normálnu databázu, ktorá je dostupná odkiaľkoľvek (hlavne z nášho serveru).
Najprv si takúto databázu musíme vytvoriť. Poďme do Heroku. Prejdeme do našej appky a navigujeme sa do Resources tabu:
Využijeme Add-ons search bar na vyhľadanie Heroku Postgres:
Vyberme Heroku Postgres. Plan name chceme Hobby Dev – Free a môžme kliknúť na provision:
Hotovo, máme vytvorenú databázu.
Keďže v našom deploymente už nebudeme používať H2 databázu, ale PostgreSQL, tak musíme do nášho Spring Boot projektu pridať novú dependency:
implementation("org.postgresql:postgresql")
H2 dependency si tam však stále nechajme kvôli lokálnemu spúštaniu.
Ďalšia a posledná vec, ktorú v našej appke treba zmeniť je konfigurácia. Tá konfigurácia z application.properties
. Tu sa ale hneď naskytá problém. Lokálne chcem stále aplikáciu testovať s H2 databázou. Nechcem sa pripájať na moju “produkčnú” databázu. Preto súbor application.properties
necháme tak a bude slúžiť iba na naše lokálne spúštanie. Nastavenia pre Heroku zmeníme pomocou environmentu priamo v Heroku.
Environment variables nájdeme v Settings tabe v Config Vars sekcii. Keď klikneme na Reveal Config Vars, tak sa nám tieto premenné odhalia.
Tajné veci, ako napr. heslo k našej databáze, kvôli bezpečnosti nechceme ukladať priamo v kóde resp. v našom repozitári. Je to zbytočne nebezpečné. K repozitáru majú totiž prístup všetci naši developeri/všetky naše developerky.
Preto sa takéto veci zvyknú ukladať čo najbližšie k bežiacej aplikácii, ale stále mimo nej. Na toto slúžia environment variables. Väčšina cloudových služieb (ako aj Heroku) má možnosť zadefinovať environment variables priamo v ich službe. Pred tým, než si ich nasetupujeme sa poďme pozrieť na nastavenia našej databázy – tie totiž pri vypĺňaní environemnt variables budeme potrebovať.
Údaje k našej databáze nájdeme v Heroku -> Resources a kliknutím na našu databázu. Následne Settings -> View Credentials.
Heroku nám medzi env variables automaticky pridalo DATABASE_URL
environment variable. Tú nepotrebujeme, ale nedá sa zmazať, tak to tam jednoducho nechajme. Potrebujeme vytvoriť nasledovné environment variables:
SPRING_DATASOURCE_DRIVERCLASSNAME=org.postgresql.Driver
SPRING_JPA_PROPERTIES_HIBERNATE_DIALECT=org.hibernate.dialect.PostgreSQLDialect
SPRING_JPA_HIBERNATE_DDL-AUTO=update
SPRING_JPA_HIBERNATE_SHOW-SQL=true
SPRING_DATASOURCE_URL=jdbc:postgresql://[HOST_Z_DB_SETTINGS]/[DATABASE_Z_DB_SETTINGS]
SPRING_DATASOURCE_USERNAME=[USER_Z_DB_SETTINGS]
SPRING_DATASOURCE_PASSWORD=[PASSWORD_Z_DB_SETTINGS]
SPRING_DATASOURCE_INITIALIZATION-MODE=always
SPRING_DATASOURCE_INITIALIZE=true
SPRING_DATASOURCE_CONTINUE-ON-ERROR=true
Ak sme appku ešte nedeployli po zmene build.gradle, tak to teraz urobíme:
git commit -m "add postgres dependency"
git push heroku master
V Heroku môžeme kliknúť na Open App a malo by nás odnavigovať na náš server. Ak za URL pridáme /passwords
, tak by sme opäť mali dostať prázdny JSON. Skúsime pridať nový password ako pred tým – cez Postman-a zavoláme POST request na /passwords
.
To, že naozaj používame postgres databázu a nie H2 si vieme overiť pomocou Heroku CLI. V nastaveniach databázy v Database Credentials je posledný riadok Heroku CLI. Pomocou tohto príkazu sa vieš pripojiť na databázu z terminálu. U mňa to bolo napr.:
heroku pg:psql postgresql-trapezoidal-87162 --app passwords-gk
Keď ťa pripojí, tak vieš zavolať PostgreSQL príkaz:
\dt
Prikaz zobrazí dostupné tabuľky. A snáď uvidíš, že Spring tú našu Passwords
tabuľku naozaj vytvoril. Nasledne vieš zavolať:
select * form passwords;
A malo by ti vypísať existujúce hesla.
Top. Done. Máme deploynutú appku v Heroku aj s databázou. Gratulujem!
Ak máš nejaké problémy, tak pomocou Heroku CLI si vieš pozrieť logy na servery:
heroku logs --tail
Prípadne ak si nevieš rady, alebo si v tutoriáli našiel/našla chybu, tak nám napíš na našom Slack-u a snáď ti budeme vedieť pomôcť 😉
Kód z tejto časti tutoriálu nájdeš na našom GitHub-e.