Nodejs, express y Heroku

Este post va dedicado a todos los que aun no han probado servicios para alojar aplicaciones, como Heroku, y a los que quieren comenzar con nodejs en producción.

Cuando quieres levantar una aplicación tienes que considerar varios factores: programación, diseño, configuración del servidor, entre otras cosas.

Puedes asumir toda esa carga o buscar apoyo en servicios ya existentes y enfocarte en lo central: desarrollar tu aplicación.

En este post mostraré como crear una aplicación sencilla con nodejs que retorne un mensaje y como dejarla alojada en Heroku.

pre requisitos

  • nodejs y su gestionador de paquetes npm.
  • Crear una cuenta en Heroku
  • Instalar la gema heroku: gem install heroku
  • Tener algún conocimiento de git.

Si no quieres dedicar mucho tiempo a instalaciones o modificar tu sistema para este ejemplo, puedes usar un entorno de desarrollo en la nube, como nitrous.

Comenzando con nodejs

Primero crearemos un archivo llamado package.json, el cual almacenara información de tu aplicación, para facilitar la creación del mismo podemos usar el comando

npm init

npm preguntara algunas cosas como nombre de la aplicación, descripción, licencia, etc.

Sobre nodejs utilizaremos express

npm install express --save

El argumento --save dejará registrado el paquete instalado como una dependencia, de esta forma, si compartes la aplicación, para instalar las dependencias bastará con usar el comando npm install.

Al ser una aplicación simple que retorna un mensaje, basta con un pequeño script

// index.js
var express = require('express');
var app = express();

app.set('port', (process.env.PORT || 8080))

app.get('/', function(req, res){
  res.json({ mensaje: 'Un ejemplo de nodejs, express y Heroku'});
});

app.listen(app.get('port'));

Como un detalle preferí que el mensaje fuera retornado en JSON.

Verificamos que todo funcione como esperamos lanzando nuestra app

node index.js

Deberíamos poder ver el resultado en

http://localhost:8080

Si todo funciona bien hacemos un commit con nuestros archivos

git add index.js package.json
git commit -m "primer commit"

Subiendo todo a Heroku

Teniendo instalada la gema de Heroku, es necesario logearnos con nuestras credenciales

heroku login

Al subir la aplicación, Heroku debe poder determinar como iniciarla, esto se específica creando el archivo Procfile con la siguiente linea

web: node index.js

Y lo agregamos al repositorio

git add Procfile
git commit -m "Procfile agregado"

Sólo nos queda crear la app en heroku

heroku create

Lo cual mostrará la url donde estará alojada nuestra app y agregará el remoto heroku al repositorio local.

Ahora podemos subir los cambios a Heroku

git push heroku master

Cada vez que hagamos push a la rama master de Heroku, nuestros cambios serán publicados.

Más detalles se pueden encontrar en el sitio de Getting started de Heroku.

Un buen tutorial para continuar es Build a RESTful API Using Node and Express 4.

Referencias

Empaquetando y distribuyendo código python con pex

Un archivo .pex es un comprimido (zip) que nos permite ejecutar código python contenido en él, ofreciendo una alternativa para la distribución aplicaciones y dependencias. Más detalles en What are pex files.

En realidad, almacenar y ejecutar código python en un archivo comprimido no es algo nuevo, pero el paquete pex nos puede simplificar la tarea.

Instalar pex

Lo primero, instalar pex

pip install pex

El primer .pex para distribuir librerías

Supongamos que necesito utilizar en varias maquinas un script llamado hello.py

#!/usr/bin/python
# -*- coding: utf-8 -*-
import requests

def main():
    print "hello with {}".format(requests.__name__)

if __name__ == '__main__':
    main()

El cual depende de la librería requests.

Si intento la ejecución y no tengo la librería instalada

$ python hello.py
Traceback (most recent call last):
  File "hello.py", line 3, in <module>
    import requests
ImportError: No module named requests

Obtengo ImportError.

Construiremos un .pex que contenga lo necesario para ejecutar el hello.py

pex -v -r request -o request.pex

El cual podemos utilizar con

$ ./requests.pex hello.py
hello with requests

Lo anterior se realizo sin la necesidad de instalar la librería, solo quedó almacenada en el archivo requests.pex, el cual puede ser enviado y reutilizado en otras máquinas.

Todo lo necesario en un .pex

En el ejemplo anterior se almaceno la librería a utilizar en el archivo .pex, ahora me interesa incluir el script en el archivo de distribución.

Para lo cual es necesario organizar nuestro código como un paquete de python, similar a uno de pip.

simple/
├── setup.py
└── simple
    └── __init__.py

Con un archivo simple/setup.py

#!/usr/bin/python
# -*- coding: utf-8 -*-
from setuptools import setup

setup(
    name='simple',
    version='0.0.1',
    packages=['simple']
)

Y el script simple/simple/__init__.py

#!/usr/bin/python
# -*- coding: utf-8 -*-
import requests

def main():
    print "hello with {}".format(requests.__name__)

Para construir el pex que contiene la librería requests y el script

pex -v -r requests --no-wheel -s simple -e simple:main -o hello_requests.pex

El cual se puede usar con

$ ./hello_requests.pex
hello with requests

El pex construido se puede distribuir y utilizar en otras maquinas sin necesidad de instalar las dependencias, ya que están auto contenidas en el archivo.

Referencias