Servicio de chat con Node.js y despliegue en Heroku

Realizando el despliegue

Al abrir de nuevo el proyecto veréis que se activa la tercera opción para "Controlar código fuente" y se añaden tropocientosmil ficheros al repositorio, eso es porque las dependendencias de Node almacenadas en la carpeta node_modules también se han añadido. No queremos eso, vamos a crear un fichero .gitignore para decirle que la ignore:

.gitignore

node_modules/

Veréis como el directorio se pone gris, eso es que ya lo está ignorando.

Ahora desde el propio editor, en la parte superior vamos a añadir un mensaje explicando los cambios, esto que se conoce como un hacer un "Commit", cuando lo tengamos confirmamos en el botón de arriba.

Finalmente hacemos clic en los tres puntitos y seleccionamos la opción Publicar en rama.

Como solo tenemos el la rama maestro en Heroku configurada se publicarán ahí los cambios directamente, si tuviéramos más ramas nos pediría seleccionar una específica.

Podemos intentar acceder a la URL del proyecto y en su puerto 3000 a ver si funciona:

https://intense-ocean-94826.herokuapp.com:3000 

Al publicar estos cambios automáticamente se realizará el despliegue, pero lamentabelmente esto no funcionará a la primera.

Podemos consultar un registro del servidor en la terminal:

heroku logs -a intense-ocean-94826 -n 50

En este caso en particular indagando encontraremos esta línea:

Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch

Básicamente nos dice que falló la asignación al puerto 3000, ¿sabéis poqué? Cuando hemos definido el Procfile hemos indicado que el servicio es del tipo web, eso le obliga a Heroku a ejecutarlo en el puerto 80. Sin embargo la solución no es tan fácil como cambiar el puerto al 80 y ya está.

Heroku internamente asigna un puerto dinámico al servicio web y lo mapea automáticamente al 80 del servidor.

Ese puerto dinámico es el que tenemos que recuperar del proceso y asignarlo, podemos hacerlo así:

// Asignar el puerto que Heroku maneja y si no existe el 3000 manualmente
var server = http.listen(process.env.PORT || 3000, () => {
  console.log("Servidor listo en http://127.0.0.1:" + server.address().port);
});

Ahora hacemos un commit, confirmamos y publicamos los cambios.

Si todo ha ido bien deberíamos ser capaces de acceder desde la URL normal, que mapea el puerto 80 automáticamente, a nuestro chat web:

https://intense-ocean-94826.herokuapp.com

Recordad que podéis consultar los registros con heroku logs en cualquier momento para saber si hay algún problema.

Con esto llegamos al final de este interesante proyecto, espero que el curso os haya parecido interesante y hayáis aprendido algo nuevo, os traeré más contenido sobre Node muy pronto, mientras tanto nos vemos por la academia.