====== Desplegament d'apps NodeJS en Heroku ======
Heroku és un sistema de [[https://en.wikipedia.org/wiki/Platform_as_a_service|PaaS (Platform as a Service)]] que ens permet posar en producció aplicacions sense necessitat de muntar tot un servidor complert, amb el manteniment que comportaria. Per tant, ens facilita molt el desplegament d'aplicacions als developers i ens estalvia feina de manteniment.
{{ https://upload.wikimedia.org/wikipedia/commons/e/ec/Heroku_logo.svg?200 }}{{ nodejs-express.png?200 }}
Referències:
* [[NodeJS Express]] per introduir-te a desenvolupar amb NodeJS.
* Tutorial oficial bàsic [[https://devcenter.heroku.com/articles/getting-started-with-nodejs|Heroku amb NodeJS]].
{{tag> #FpInfor #Daw #DawMp07 #DawMp08Uf2 #DawMp08Uf02 #Dam #DamMp06 #DamMp06Uf4 #DamMp06Uf04 nodejs express javascript }}
\\
===== Crear app en local =====
Podem crear app nova o bé clonar alguna app que tinguem a un repositori:
==== Opció 1: Crear app de zero ====
Per crear una aplicació de zero amb node:
$ mkdir node1
$ cd node1
$ npm init
$ npm install ejs express
$ git init
==== Opció 2: Clonant una app ====
Podem clonar un projecte que tinguem a Github:
$ git clone https://github.com/myuser/projecte.git
==== Adaptar el port de la app ====
Si mirem el [[https://github.com/heroku/node-js-getting-started/blob/main/index.js|codi de la app NodeJS d'exemple]] del tutorial oficial de Heroku veurem que el PORT que estableix el treu de les variable d'entorn (accedeix via ''process.env.PORT''):
const PORT = process.env.PORT || 5000
Si no troba cap variable d'entorn, agafa el port 5000, això facilita treballar en local per desenvolupament.
Assegura't que el teu codi té aquesta línia i que no té el port fix, sinó que, com a l'exemple, l'agafa de la variable d'entorn.
==== Posant en producció ====
Creem una app a Heroku. Oju que el nom que posis a la app és què després permetrà accedir públicament a nom_de_la_meva_app.herokuapp.com :
$ heroku create
Ara hauries de crear els teus arxius de NodeJS, en partiular:
- index.js amb el codi
- carpeta ''views'' i les plantilles que necessitis
- arxiu ''.gitignore'' amb, com a mínim, la carpeta ''node_modules/''
Perquè funcioni el desplegament a Heroku cal tenir un ''Procfile''. Al tutorial oficial arrenca la app amb "npm start", però si la nostra app l'arrenquem amb ''node index.js'', aquest és el codi que haurem de ficar-hi, precedit de ''web:'' per indicar que és el procés de la web pública:
$ echo "web: node index.js" > Procfile
Un cop enllestit, pots pujar el codi i posar-lo en producció amb
$ git add .
$ git commit -am "primer commit"
$ git push heroku master
$ heroku open
Comprova que no hi ha cap error amb
$ heroku logs --tail
Si no arrenca correctament, assegura't que tens un //script// d'arrencada a l'arxiu ''package.json'' que arrenca correctament la teva aplicació i que a la seccio ''main'' tens tb el mateix //script//:
{
"name": "node1",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "node index.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
...
}
No és imprescindible que l'arxiu principal sigui ''index.js'', pots customitzar-ho aquí.
===== Ampliant funcionalitat a Heroku (BD) =====
Ara l'objectiu serà pujar la nostra aplicació de la **API login** en un entorn de producció.
* Comprova que funciona correctament en local
* Segueix el procediment anterior per pujar la teva app a Heroku.
* Testeja que funciona correctament.
* Testeja la part de API amb ''curl''.
* [[https://devcenter.heroku.com/articles/getting-started-with-nodejs#provision-a-database|Afegeix una base de dades a Heroku]] (ha de ser PostgreSQL perquè sigui gratuïta). Crea una taula d'usuaris i contrasenyes.
* Modifica la teva aplicació NodeJS per tal que accedeixi als usuaris de la taula enlloc del diccionari //hardcoded// que havíem implementat en un principi.
===== .env variables d'entorn en producció =====
És molt recomanable, imprescindible millor dit, posar les variables d'entorn (com usuaris i contrasenyes de serveis externs de DB, per exemple) en un arxiu ''.env'' que NO hem de carregar al repositori de codi (usuari i contrasenya son paràmetres de producció i per seguretat no han d'anar al repo).
Inclou ''.env'' a l'arxiu ''.gitignore''.
Per carregar les variables del .env , utilitza el [[https://www.npmjs.com/package/dotenv|paquet 'dotenv' de npm]].
==== .env i Heroku ====
Però clar, si no està inclòs al repo de GIT, com pugem les dades de config a Heroku?
El truc és utilitzar les [[https://devcenter.heroku.com/articles/config-vars|config vars de Heroku]] enlloc de l'arxiu ''.env''.
Per veure les variables
$ heroku config
Per ajustar-ne alguna:
$ heroku config:set DBUSER=admin