Tutorial: Comenzando con Openshift Online

En un post anterior hicimos un review completo de Openshift Online, la plataforma como servicio hospedada (hosted PaaS) de Red Hat que nos trae de manera gratuita una alternativa fuerte a opciones como Heroku o Google App Engine, pudiendo incluso competir (en varios casos) con un VPS o servidor dedicado. Como explicaba yo ayer, Openshift Online me gusta mucho porque nos trae lo mejor de 2 mundos: La nube administrada y los VPS.

El día de hoy haremos un tutorial completo sobre cómo iniciarse con OpenShift Online, para aquellos que se quedaron "picados" tras conocer sus bondades... Sin nada más que agregar al respecto, acompáñenme a continuación:

NOTA: Este tutorial se va a basar en Fedora Linux como sistema operativo base. Puedes seguirlo sin importar en cuál plataforma o distribución estés ya que las herramientas de Openshift son "platform agnostic" generalmente, pero si instalo un programa con el gestor de paquetes de fedora o hago algo específico de mi sistema, recuerda cambiar los comandos de manera acorde según tu distribución y/o plataforma.

1) Preparando el entorno

Necesitarás tener listo un entorno ruby/rubygems en tu computadora primero. Checa este tutorial para dicho fin. También necesitarás tener Git instalado y configurado, acá otro tutorial al respecto. Una vez que estos requerimientos se cumplan puedes proseguir.

2) Crea tu cuenta

Ahora necesitarás crear tu cuenta en Openshift Online, esto se hace acá.

3) Instalando herramientas (y configuración)

Una vez creada tu cuenta, ya podrás instalar y configurar las herramientas necesarias para trabajar con Openshift:

# sudo gem install rhc
$ rhc setup

El segundo comando te pedirá hacer algunas confirmaciones y después te pedirá hacer login:

Login to openshift.redhat.com: user@example.com
Password: password

Luego se te pedirá generar un token en tu directorio personal. Si accedes (recomendado), se generará y cuando éste expire se te pedirá tu contraseña de nuevo para hacer login desde la consola en Openshift Online:

OpenShift can create and store a token on disk which allows to you to access the server without using your password. The key is stored in your home directory and should be kept secret. You can delete the key at any time by running 'rhc logout.

Generate a token now? (yes|no) yes

Generating an authorization token for this client ... lasts about 1 day

Más tarde el asistente revisará si tienes claves ssh en tu directorio personal y de ser así, te pedirá elegir una para subir a openshift. De no encontrar lo que busca generará una nueva y te preguntará si quieres subirla como tu clave ssh predeterminada. Generalmente yo en este paso opto por el no (debido a que mantengo mis claves ssh en otro directorio) y subo la indicada más tarde, pero si a ti no te molesta tenerlas en ~/.ssh como es habitual accede al prompt por defecto y listo:

No SSH keys were found. We will generate a pair of keys for you.

Created: ~/.ssh/id_rsa.pub

Your public ssh key must be uploaded to the OpenShift server to access code.

Upload now? (yes|no) yes

Since you do not have any keys associated with your OpenShift account, your new key will be uploaded as the 'default' key

Uploading key 'default' from ~/.ssh/id_rsa.pub... done

Si quieres subir una clave SSH propia que se encuentre en otro directorio, dile que no al prompt por default, termina los demás pasos en el asistente y al finalizar, utiliza el comando:

rhc sshkey add -i key-name -k pubKey-path

Recuerda que de hacer esto, cada que inicies sesión debes añadir dicha clave al agente SSH con:

ssh-add privKey-path

Para poder trabajar con la consola de Openshift... (Aunque también puedes hacer un script que corra al inicio de sesión para automatizar esto).

Más tarde se te pedirá ingresar un subdominio personalizado para tus aplicaciones:

Checking for a domain ... none

Your domain is unique to your account and is the suffix of the public URLs we assign to your applications. You may configure your domain here or leave it blank and use 'rhc domain create' to create a domain later. You will not be able to create applications without first creating a domain.

Please enter a domain (letters and numbers only) ||: mydomain

Your domain name 'mydomain' has been successfully created

Una vez que terminas el asistente, ya puedes crear aplicaciones en tu cuenta.

4) Creando nuestra primera app

Hacemos login en Openshift Online y damos click en "Create your first application now", esto nos llevará a una página con los tipos de aplicaciones que podemos crear:



Debido a que Openshift nos hizo instalar un entorno de desarrollo ruby, no veo porqué no hacer una ruby app como muestra para comenzar. Seleccionamos Ruby 2.0.0 en la lista de arriba y tendremos que configurar nuestra aplicación a continuación. Les recomiendo permitir que escale con el tráfico para aprovechar al máximo los recursos gratuitos disponibles y tener load balancing y high availability habilitados por defecto:


Después de crear mi aplicación (quizá tome unos minutos), tendré la siguiente pantalla delante de mi:


Procedo a clonar la aplicación a mi equipo con el comando que me listan y al hacer cd al nuevo directorio en la consola, puedo ver que tengo una app "esqueleto" lista para empezar a trabajar:


Si abro el README.md (en este caso con el comando cat) veré que me apunta a la documentación para empezar a trabajar con el "cartucho ruby" en Openshift...

Regreso a mi dashboard online y ahora ya puedo dar click en "Continue to the application overview page" para añadir una base de datos.

5) Base de datos y cartuchos

En la ventana de overview de aplicación, podemos ver que nos dan la opción de añadir una base de datos o ver qué otros "cartuchos" podemos agregar. Los cartuchos son "piezas" para tu aplicación (base de datos, cron, jenkins, etc.) que puedes necesitar para ir armando tu app:


En este caso sólo añadiré MongoDB 2.4 (que es la única versión de esta DB que soportan de momento oficialmente) para mi aplicación de ejemplo:


y tras añadirla, tendré un mensaje de confirmación con una URI, un usuario, una contraseña y un nombre de DB para usar MongoDB en mi aplicación de manera segura:


6) Deployment

En este punto ya puedo empezar a armar mi aplicación de manera local y subir los cambios mediante Git. Supongamos que en este caso quiero trabajar con bundler y unas cuántas ruby gems... Sigo este tutorial para integrar Bundler en mi aplicación Ruby y añado mis gemas al Gemfile... En este caso voy a hacer unos scripts rápidamente para probar la integración con MongoDB de mi app:

NOTA: Para hacer esto, puedo checar las variables de entorno que Openshift tiene para MongoDB por acá (así funciona para la mayoría de cartuchos) de manera que no tenga que preocuparme por meter los datos de manera "hard coded".


Ya que modifiqué un poco el código necesito subirlo a Openshift; Esto es tan sencillo como hacer:

$ git add .
$ git commit -m "mongoid test"
$ git push

7) Manejo por consola

Una vez arriba el código, necesito probarlo. Para acceder a la consola de Openshift, basta con hacer uso de la liga ssh que ellos me proveen, (asegurándome de haber agregado mi clave ssh como se requiere):


Una vez accedo, puedo probar el código que subí con:

$ cd app-root/repo
$ ruby main.rb

Pero oh snap! Hay un bug fatal (referencia 1, referencia 2, referencia 3) que me impide usar MongoDB como yo quiero en este caso dentro de Openshift v2 al parecer:


Bueno, entonces tendré que...

8) Eliminar un cartucho

MongoDB no funcionó, así que la eliminaré y mejor utilizaré SQLite3 (que ya viene por defecto activ@ en OpenShift); Para eliminar un cartucho, corremos el comando:

rhc cartridge remove -a {appName} -c {cartridgeName}

Este comando nos pedirá confirmación y procederá a eliminar el cartucho de nuestra aplicación.

9) Marketplace


Antes de mostrar el código modificado, hay una cosa más que debemos revisar: El marketplace. Openshift tiene este marketplace al que puedes acceder para dotar a tus aplicaciones de servicios extras. ¿Necesitas envío de correos? Puedes activar Sendgrid Free para tener 25,000 correos gratuitos cada mes o pagar por cualquiera de sus mejores planes:


Todos estos goodies se pueden activar con un solo click desde el mismo marketplace, sin mayor problema. Cabe destacar que si es de tu interés, puedes crear add-ons y subirlos al marketplace para que otros puedan hacer uso de ellos.

10) Port forwarding

Si quiero trabajar de manera local en el entorno de producción (ya habiéndolo subido a Openshift) lo que puedo hacer es correr el siguiente comando:

rhc port-forward -a {appName}

Que se encargará de redireccionar puertos locales a los puertos de la aplicación de Openshift en modo de producción:


En este caso si visito el puerto local asignado a httpd, debería ver la index.html pública de mi app en vivo.

Finalizando...

Ahora sólo me queda cambiar el código de mi app y subirlo de nuevo para hacer uso de SQLite en lugar de MongoDB como prometí. He aquí el cambio:


Cabe destacar que elminé mongoid.yml y Gemfile.lock, después corrí:

$ bundle install

Accedí por ssh a la consola de mi aplicación y dentro de la misma ejecuté:

$ cd app-root/repo
$ bundle install
$ ruby main.rb

Lo que me entregó el siguiente resultado:


Mismo que indica que todo funciona a la perfección.

Extras

Las aplicaciones en el plan Free cuentan con algo que se llama "idling", So básicamente si tu app no recibe requests en 24 horas, ésta se "pausa" un momento hasta que otra request llega. Si quieres evitar esto, puedes hacer upgrade al plan bronze (que igual es gratis pero requiere tus datos de billing ya que te permite consumir recursos pagados), o bien crear un scrapBot con algo como CasperJS para simular hits en tu aplicación de manera continua. Hacer upgrade al plan bronze en un país no oficialmente soportado requiere que te pongas en contacto con Openshift para expresar tu interés personal y así poder hacer dicho cambio.

Algunos enlaces relevantes: