
# Publicar en Heroku
## Introduction

[Heroku](https://www.heroku.com) es una [plataforma en la nube](https://en.wikipedia.org/wiki/Cloud_computing) que permite a las empresas crear, entregar, monitorear y escalar aplicaciones sin tener una gran conocimiento sobre [DevOps](https://en.wikipedia.org/wiki/DevOps). Es la forma más rápida de implementar una aplicación y hacerla accesible para todos.
Una de las mejores cosas de Heroku es que le permite concentrarse en la construcción de su aplicación, mientras ellos se ocupan de la infraestructura. Facilita la implementación de nuestras aplicaciones. **Tan simple como enviarlo a un repositorio remoto de git**.
Vamos a cubrir el proceso que seguiremos para implementar un sitio web en Heroku.
Puedes utilizar un proyecto que ya realizaste para subirlo de ejemplo.
## Pre-requisitos
### Registrarte
Lo primero que necesitamos para implementar una aplicación en Heroku es una cuenta. [Registrarse](https://signup.heroku.com/?c=70130000001x9jEAAQ) en Heroku indicando los campos en la página:

Heroku le enviará un correo electrónico a su cuenta con un enlace de confirmación que activará su cuenta después de configurar su contraseña. Una vez que haya iniciado sesión, verá el panel de Heroku:

### Crear aplicación
Una vez que hayamos iniciado sesión en Heroku, tendremos que crear una aplicación Node.js para poder implementarla. Para hacer eso, tenemos que presionar el botón "Crear nueva aplicación" en el tablero.
Complete el formulario con la información correcta para crear su primera aplicación:

Una vez que hayamos terminado con eso, tendremos que descargar e instalar el [Heroku CLI](https://devcenter.heroku.com/articles/heroku-command-line) para poder desplegar nuestra aplicación como si fuera un repositorio.
### Heroku CLI
La [CLI de Heroku](https://devcenter.heroku.com/articles/heroku-cli) (o la interfaz de línea de comandos de Heroku) es una herramienta para crear y administrar aplicaciones de Heroku desde la línea de comandos de varios sistemas operativos.
Siguiendo la información de DevCenter, puede encontrar cómo instalar la CLI según su sistema operativo.
#### OS X
Descargar y correr el [OS X Installer](https://cli-assets.heroku.com/branches/stable/heroku-osx.pkg)
#### Windows
Descargar y correr el Windows Installer [32 bits](https://cli-assets.heroku.com/branches/stable/heroku-windows-386.exe) or [64 bits](https://cli-assets.heroku.com/branches/stable/heroku-windows-amd64.exe).
#### Linux Debian/Ubuntu
Ejecute los siguientes comandos para agregar el repositorio de Heroku apt e instalar la CLI:
```bash
$ sudo apt-get install software-properties-common # debian only
$ sudo add-apt-repository "deb https://cli-assets.heroku.com/branches/stable/apt ./"
$ curl -L https://cli-assets.heroku.com/apt/release.key | sudo apt-key add -
$ sudo apt-get update
$ sudo apt-get install heroku
```
#### Empezando
La primera vez que ejecute la CLI de Heroku, deberá ingresar sus credenciales de Heroku. Puede evitar esto iniciando sesión en heroku a través de su terminal. Ejecute el siguiente comando en la terminal:
```bash
$ heroku login
Enter your Heroku credentials
Email: it@ironhack.com
Password (typing will be hidden):
Authentication successful.
```
Ahora has iniciado sesión, por lo que no tiene que volver a indicar sus credenciales. ¡Estamos listos para implementar nuestro proyecto en Heroku!
## Antes de implementar
Antes de implementar nuestra aplicación, tenemos que considerar lo siguiente: ahora, usamos `npm start` para ejecutar el servidor. Esto lanza el comando `nodemon ./bin/www`. Hemos instalado nodemon en el entorno de desarrollo, por lo que cuando heroku ejecuta `npm start`, la aplicación se bloqueará.
Podríamos cambiar `nodemon` por `node`, pero luego, en desarrollo, deberíamos reiniciar el servidor con cada cambio. Otra posible solución es hacer lo siguiente:
```javascript
// ...
"scripts": {
"start": "node ./bin/www",
"start-dev": "nodemon ./bin/www"
},
// ...
```
Ahora, si estamos trabajando en nuestro entorno de desarrollo, lanzaremos la aplicación ejecutando `npm run start-dev`. Por otro lado, Heroku lanzará `npm start`, por lo que nuestra aplicación funcionará en ambos entornos.
## Subir a Heroku
Hagamos un resumen rápido. Hemos creado un proyecto, hemos creado una cuenta en Heroku, hemos creado una aplicación en nuestro Dashboard, hemos descargado e instalado la CLI de Heroku, y ahora vamos a implementar la aplicación.
Al comienzo de la lección, dijimos que implementar una aplicación en Heroku es como enviar nuestro proyecto a un repositorio remoto. Si volvemos a nuestro panel de Heroku, encontraremos lo siguiente:

Tenemos que configurar nuestro repositorio remoto, y lo hacemos ejecutando el siguiente comando:
```bash
$ heroku git:remote -a ih-first-deploy
```
Si revisamos nuestros repositorios remotos, deberíamos tener algo como lo siguiente:
```bash
$ git remote -v
heroku https://git.heroku.com/NOMBRE-DEL-REPO.git (fetch)
heroku https://git.heroku.com/NOMBRE-DEL-REPO.git (push)
origin https://github.com/ironhack/NOMBRE-DEL-REPO.git (fetch)
origin https://github.com/ironhack/NOMBRE-DEL-REPO.git (push)
```
¡Estamos listos! Implementemos nuestra primera aplicación en Heroku ejecutando el siguiente comando:
```bash
$ git push heroku master
```
Algo nuevo sucederá. En primer lugar, verá el resultado normal de `git push`, que indica que todos los objetos se han cargado. Luego, heroku lanzará un comando que desplegará nuestra aplicación en el repositorio que hemos creado.
En la pestaña `Overview` de nuestro Panel de control, podremos ver el resumen de la última implementación que acabamos de hacer:

Genial, veamos lo que tenemos corriendo:
```bash
$ heroku open
```
Esto lanzará nuestra aplicación en el navegador predeterminado que hemos configurado en la computadora. Si todo va bien, veremos nuestra aplicación.
Si hubo algún error, el resultado será el siguiente:

Podemos consultar los *logs* de heroku con el comando `$ heroku logs`.
:::danger
**No debe publicar ninguna clave, configuración del servidor, clave AWS ... Lo que sea que incluya información personal, información de facturación, configuración de la base de datos no se puede publicar en Github ni Heroku.**
:::
Podemos resolver este problema utilizando **Variables de entorno**.
## Recursos extra
- [Managing Environment Variables in Node.js](https://medium.com/@rafaelvidaurre/managing-environment-variables-in-node-js-2cb45a55195f#.gqj4n6fal)
- [Heroku](http://heroku.com)