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:
- Databázový systém (relačná databáza)
- 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.
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.
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.
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í.
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
.
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.
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!