Desplegando apps en Meteor con Heroku y mLab
Tags: devops, meteor, heroku, mongodb
Published: 2020-02-12 20:05:23

> *Este post fue publicado originalmente en noviembre de 2016.*

A continuación veremos como desplegar nuestra aplicación Meteor en 6 sencillos pasos. Los servicios que usaremos para ello son:

**Heroku**, una plataforma como servicio (PaaS) que permite crear, ejecutar y escalar aplicaciones web, su medio principal para el despliegue es git.

**mLab**, una plataforma de base de datos como servicio (DBaaS) para alojar y gestionar bases de datos MongoDB, actualmente ofrece alojamiento en AWS, Azure y Google.

---

## 0. Requisitos para empezar

* Registrarnos en [mLab](https://mlab.com/).
* Registrarnos en [Heroku](https://www.heroku.com/).
* Instalar [Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli).

## 1. Crear la Base de datos

Creamos una base de datos Mongo con el proveedor y plan que más se adapte a nuestras necesidades.

> En el apartado Single-node el plan Sandbox es **gratuito** y ofrece 0.5Gb aunque no se aconseja para producción.

Asignamos un nombre a la base de datos, pulsamos en *Create new MongoDB deployment* y una vez creada entramos en ella.

Para terminar hacemos click en la pestaña *Users*, creamos un nuevo usuario y listo.

En la parte superior podemos ver nuestra *MongoDB URI*, que será la que usaremos más adelante y que tiene un aspecto parecido a lo siguiente:

```
mongodb://<dbuser>:<dbpassword>@ds<012345>.mlab.com:<12345>/<dbname>
```

## 2. Autenticarse con Heroku CLI

Desde la terminal nos identificamos con nuestras credenciales usando el siguiente comando:

```shell
$ heroku login
```

## 3. Crear la app en Heroku

Nos situamos en nuestro proyecto git y creamos la aplicación en Heroku indicando el nombre que deseamos.

> Además podemos definir el nombre con el que vamos a referirnos a nuestro repositorio remoto y la región donde queremos alojar nuestra aplicación (por defecto son **heroku** y **us** respectivamente).

```shell
$ cd <my-git-project>
$ heroku apps:create <app-name> --remote <remote-name> --region <us|eu>
```

## 4. Aplicar un buildpack

El buildpack preparará nuestra aplicación Meteor para ser ejecutada por Heroku.

> En este ejemplo vamos a utilizar el genial [meteor-buildpack-horse](https://github.com/AdmitHub/meteor-buildpack-horse).

```shell
$ heroku buildpacks:set https://github.com/AdmitHub/meteor-buildpack-horse.git
```

## 5. Configurar las variables de nuestra aplicación

```shell
# Variable para la URL
$ heroku config:set ROOT_URL="https://<app-name>.herokuapp.com"

# Variable para enlazar a nuestra Base de datos (MongoDB URI)
$ heroku config:set MONGO_URL="<mlab-uri>"

# Settings de Meteor (suponiendo que están en settings.json)
$ heroku config:set METEOR_SETTINGS="$(cat settings.json)"
```

## 6. Desplegar

Una vez tenemos todo configurado lo último que tenemos que hacer es un *git push* a la rama master de nuestro repositorio remoto en Heroku.

```shell
$ git push <remote-name> master
```

---

## Bonus

Para terminar os dejo algunas anotaciones que os pueden ser de utilidad…

### *Trabajar en equipo

Para que el resto del equipo de desarrollo pueda desplegar sus cambios tan solo tienen que añadir el repositorio remoto a su proyecto git usando:

```shell
$ heroku git:remote -a <app-name> -r <remote-name>
```

### *Mostrar el log

Si queremos ver el log de nuestra aplicación tan solo tenemos que ejecutar:

```shell
$ heroku logs
```

### *Integrar add-ons

Podemos agregar [herramientas y servicios](https://elements.heroku.com/addons) desde la terminal con el siguiente comando:

```shell
$ heroku addons:create <proveedor:plan>
```

### *Desplegar una rama distinta de master

Lo haremos de la misma manera que haríamos con git:

```shell
$ git push <remote-name> <local-branch>:master
```

### *Trabajar con varias instancias de Heroku

Si tenemos varios repositorios remotos de Heroku en un mismo proyecto para ejecutar algunos comandos tendremos que especificar la aplicación, por ejemplo:

```shell
# Development
$ heroku config:add METEOR_SETTINGS="$(cat settings-development.json)" --app <dev-app-name>

# Production
$ heroku config:add METEOR_SETTINGS="$(cat settings-production.json)" --app <prod-app-name>
```