Kotlin, Spring Boot a Heroku – Heroku (4/4)

Predošlá časť - Databáza

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.

Screenshot Heroku new tlacidlo
New Tlačidlo

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á.

Screenshot vytváranie aplikácie v Heroku
Vytváranie aplikácie v Heroku

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ť.

Ako deployovať do Heroku
Ako deployovať do Heroku

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.

Heroku Open App tlačidlo
Heroku Open App tlačidlo
Screenshot POST request na Heroku
POST request na Heroku

Databáza v Heroku

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:

Screenshot resources tabu
Resources tab

Využijeme Add-ons search bar na vyhľadanie Heroku Postgres:

Vyhľadanie postgres-u
Vyhľadaj Heroku Postgres

Vyberme Heroku Postgres. Plan name chceme Hobby Dev – Free a môžme kliknúť na provision:

Screenshot - zvol plan
Zvoľ plán

Hotovo, máme vytvorenú databázu.

Ako sa pripojím na 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.

Screenshot - settings tab
Settings tab

Čo to vlastne sú tieto „environment variables“?

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ť.

DB settings

Údaje k našej databáze nájdeme v Heroku -> Resources a kliknutím na našu databázu. Následne Settings -> View Credentials.

Screenshot - overview databázy v Heroku
Overview databázy v Heroku
Screenshot - Nastavenia databázy v Heroku
Nastavenia databázy v Heroku
Screenshot - Database credentials v Heroku
Database credentials v Heroku

Naše environment variables

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

Pokračujeme

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!

Troubleshooting

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.

Predošlá časť - Databáza


Pridaj komentár

Vaša e-mailová adresa nebude zverejnená.