Magazín KPI
Časopis Katedry počítačov a informatiky FEI TUKE
kpi

Heroku ako cloudová platforma pre beh Node.js aplikácie

Tento článok sa venuje cloudovej platforme Heroku a nasadeniu Node.js aplikácie s podporou softvérového ramca Express.js na túto platformu. Tak isto sa venuje inštalácii databázového systému a prepojení Node.js aplikácie s databázovým systémom pomocou premenných zapísaných v prostredí serveru (enviroment variables) v cloudovej platforme Heroku.

Úvod

Čo je to Heroku ?

Heroku je cloudová platforma ktorá podporuje niekoľko programovacích jazykov, ako napríklad Node.js, PHP, Ruby, Python, Java atď. Heroku sa sústredí na vertikálnu a horizontálnu škálovateľnosť vysoko dostupných aplikácií. Umožňuje spoločnostiam vyvíjať, monitorovať a sprostredkúvať moderné webové aplikácie bez toho, aby sa vývojári alebo spoločnosti museli zaoberať návrhom serverovej architektúry.

Naša aplikácia

Aplikácia o ktorej bude pojednávať tento článok je back-end aplikácia, ktorú bude reprezentovať webový server, ktorý bude komunikovať pomocou rozhrania API. Tento webový server bude poháňaný výkonným softvérovým rámcom Express.js. Aplikácia sa skladá z dvoch časti:

  1. Databázový systém (relačná databáza)
  2. Samotná aplikácia napísaná v jazyku JavaScript v softvérovom rámci Node.js

Databázový systém bude uchovávať dáta ktoré budú ukládané pomocou Node.js a API.

Z tohto rozdelenia vyplýva, že budeme potrebovať nainštalovať databázový systém, a webový server ktorý je napísaný v jazyku JavaScript. To znamená, že budeme potrebovať dve nezávislé entity, ktoré medzi sebou budú vzájomne komunikovať.

Vytvorenie prostredia aplikácie v platforme Heroku

Na to, aby sme boli schopní spustit našu aplikáciu na platforme Heroku, je potrebné si vytvoriť prostredie a nainštalovať databázový systém.

Vytvorenie aplikácie

Po registrácií vo webovom rozhraní platformy Heroku, budeme presmerovaní na Dashboard. Aplikáciu vytvoríme jednoduchým klikom do pravého horného rohu, ako je znázornené na obrázku pod týmto textom. Vytvorenie aplikácie v Heroku Vytvorenie aplikácie v Heroku

Po vytvorení aplikácie budeme presmerovaní do nastavení našej prvej aplikácie.

Inštalácia databázového systému

Ako sme ale v úvode spomínali, pôjde o aplikáciu ktorá bude uchovávať dáta, teda budeme potrebovať k tejto Heroku aplikácii ešte aj databázový systém.

Vytvorenie databázového systému v Heroku

Po nájdení vhodného databázového systému (u nás to je PostgreSQL) pripojíme databázový systém k aplikácii.

Pripojenie databazoveho systemu

V tomto kroku pre overenie skontrolujeme, či sa databázový systém správne napojil do našej aplikácie.

Pokiaľ sa nám v Dashboarde v sekcii “Installed Add-Ons” objavil náš databázový systém, sme pripravení.

Kontrola Databazy

Príprava Node.js aplikácie pre beh na platforme Heroku

Ako prvé, budeme potrebovať upraviť Node.js aplikáciu tak, aby bola schopná bežať na platforme Heroku.

Predstavme si teda ukážkovú štruktúru projektu, ktorá ešte nie je pripravená na beh v platforme Heroku.

|-- app/ // Zdrojové súbory Node.js aplikácie
|   |-- App.js
|   |-- config
|   |-- models
|   |-- routes
|   `-- tools
|-- index.js // Hlavný súbor aplikácie (spustiteľný súbor)
|-- node_modules // Open-source knižnice nainštalované platformou Node.js
|-- package.json
|-- yarn.lock // Informácie o verziách a knižniciach 

Pre beh Node.js aplikácie na platforme Heroku je potrebné pridať iba jeden jediný súbor. Tým súborom je súbor Procfile. Štruktúra našej aplikácia teda bude následne vyzerať takto:

|-- Procfile // ---------- Pridanie súboru Procfile
|-- app/ // Zdrojové súbory Node.js aplikácie
|   |-- App.js
|   |-- config
|   |-- models
|   |-- routes
|   `-- tools
|-- index.js // Hlavný súbor aplikácie (spustiteľný súbor)
|-- node_modules // Open-source knižnice nainštalované platformou Node.js
|-- package.json
|-- yarn.lock // Informácie o verziách a knižniciach 

Súbor Procfile obsahuje definície procesov ktoré majú byť spustiteľné. Budeme potrebovať definovať webový proces, ktorý bude spúšťať súbor index.js kde je naimportovaný back-end aplikácie. V súbore index.js sú teda aj definíce webového softvérového rámca Express.js.

const express = require('express')
const app = express()

app.get('/', (req, res) => res.send('Hello World!'))

app.listen(3000, () => console.log('Example app listening on port 3000!'))

Na fragmente kódu môžeme vidieť ukážku webového serveru Express.js

Obsah súboru Procfile teda vyzerá takto:

web: node ./index.js

V tomto súbore sme definovali iba jeden proces, týmto procesom je proces web. Tento proces má za úlohu spustiť webový server, ktorého definície sa nachádzajú v súbore index.js.

V tomto momente, po pridaní súboru Procfile je naša Node.js (Express.js) aplikácia pripravená na cloudovú platformu Heroku. Treba si však uvedomiť, že aplikáciu sme si rozdelili na dva celky, teda ešte nám ostáva nainštalovať databázový systém a pripraviť Node.js aplikáciu tak, aby vedela komunikovať s týmto databázovým systémom.

Úprava Node.js Aplikácie pre komunikáciu s databázovým systémom

Je konvenciou, že informácie (meno, heslo, url) o pripojení do databázy sa v aplikáciach držia v konfiguračných súboroch. Tieto informácie o pripojení sú často krát natvrdo vpísané do obsahu týchto konfiguračných súborov. Naša aplikácia by ale v prípade natvrdo vpísaných informácií o databázovom pripojení nemohla fungovať, pretože platforma Heroku dynamicky mení tieto informácie za pomoci premenných zapísaných v prostredí serveru (počítača). Tieto premenné sa nazývajú po anglicky environment variables.

Enviroment Variables

Túto skutočnosť môžeme vidieť aj na obrázku z Dashboardu našej Heroku Aplikácie.

Musíme teda upraviť naše konfiguračné súbory tak, aby naša aplikácia vedela komunikovať s databázovým systémom pomocou týchto premenných z prostredia serveru.

Súbor config.js:


const path = require('path');

const env = process.env;
const production = env.NODE_ENV === 'production';

module.exports = {
    port: env.PORT || 3000,
    db: env.DATABASE_URL || null, // Vytiahnutie reťazca s informáciami o pripojení s Enviroment Variables 
    modelsPath: path.normalize(`${__dirname}/../models/`),
    routesPath: path.normalize(`${__dirname}/../routes/`)
};


Ako môžme na fragmente kódu vidieť, pre získanie informácií o pripojení do databázového systému získame z premennej prostredia. Túto premennú prostredia za nás vytvára samo Heroku po pripojení databázového systému do aplikácie.

Nasadenie Node.js aplikácie

V bodoch vyššie sme si teda vysvetlili, ako je potrebné upraviť Node.js aplikáciu, aby bola schopná bežať na cloudovej platforme Heroku.

V tomto bode si ukážeme, ako túto aplikáciu nasadiť (po anglicky deploy) do prostredia Heroku.

Definujeme si nový vzdialený repozitár vo verzovacom systéme Git, ktorý bude smerovať do našej Heroku aplikácie:

git remote add production https://git.heroku.com/my-first-example-app.git

Týmto príkazom definujeme repozitár production. URL nášho repozitára nájdeme v Dashboarde platformy Heroku v záložke Settings.

Deploy

Pre nasadenie aplikácie do platformy Heroku použijeme príkaz:

git push production master

Pokiaľ sme všetko urobili správne, v termináli by sa nám mal zobraziť takýto výstup:

----- Node.js app detected
----- Creating runtime environment
       
       NPM_CONFIG_LOGLEVEL=error
       NODE_VERBOSE=false
       NODE_ENV=production
       NODE_MODULES_CACHE=true
----- Installing binaries
       engines.node (package.json):  ~7.6.0
       engines.npm (package.json):   ~4.1.0
       engines.yarn (package.json):  unspecified (use default)
       
       Resolving node version ~7.6.0...
       Downloading and installing node 7.6.0...
       Bootstrapping npm ~4.1.0 (replacing 4.1.2)...
       npm 4.1.2 installed
       Resolving yarn version 1.x...
       Downloading and installing yarn (1.6.0)...
       Installed yarn 1.6.0
----- Restoring cache
       Loading 2 from cacheDirectories (default):
       - node_modules
       - bower_components (not cached - skipping)
----- Building dependencies
       Installing node modules (yarn.lock)
       yarn install v1.6.0
       warning You are using Node "7.6.0" which is not supported and may encounter bugs or unexpected behavior. Yarn supports the following semver range: "^4.8.0 || ^5.7.0 || ^6.2.2 || >=8.0.0"
       [1/4] Resolving packages...
       success Already up-to-date.
       Done in 0.32s.
----- Caching build
       Clearing previous node cache
       Saving 2 cacheDirectories (default):
       - node_modules
       - bower_components (nothing to cache)
----- Pruning devDependencies
       yarn install v1.6.0
       warning You are using Node "7.6.0" which is not supported and may encounter bugs or unexpected behavior. Yarn supports the following semver range: "^4.8.0 || ^5.7.0 || ^6.2.2 || >=8.0.0"
       [1/4] Resolving packages...
       [2/4] Fetching packages...
       [3/4] Linking dependencies...
       [4/4] Building fresh packages...
       warning Ignored scripts due to flag.
       Done in 4.33s.
----- Build succeeded!
----- Discovering process types
       Procfile declares types -> web
----- Compressing...
       Done: 22.4M
----- Launching...
       Released v20
       https://ats-diploma.herokuapp.com/ deployed to Heroku

Ako môžeme vidieť na výstupe, Heroku zdetekovalo, že sa jedná o aplikáciu Node.js (na základe existencie súboru package.json v našom koreňovom adresári), nainštalovalo všetky potrebné závislosti (zo súboru package.json) a vypublikovalo našu aplikáciu pod subodoménou. Subdoména nesie názov aplikácie.

Záver

V tomto článku sme sa v jednoduchých krokoch dozvedeli, ako nasadzovať webové aplikácie napísane v softvérovom rámci Node.js na cloudovú platformu Heroku. Tak isto sme sa dozvedeli, ako nainštalovať databázový systém a ako databázový systém jednoducho prepojiť s Node.js aplikáciou pomocou premenných v prostredí serveru. Vďaka cloudovej platforme Heroku môžeme vyvíjať škálovateľné a vysoko dostupné aplikácie bez návrhu serverovej architektúry, ktorú za nás rieši Heroku.

Happy Coding!

Linkovať