Configurando tu propio GAE server

Una de las novedades de Google que más me ha llamado la atención en los últimos meses es GAE (Google App Engine), que permite utilizar la red de Google para desplegar nuestra aplicación web y ganar de forma transparente la habilidad de soportar millones de visitas diarias a la vez de tener la data replicada, resolviendo los dos problemas serios que enfrenta todo Startup de la industria de las Tecnología de la Información, escalabilidad y disponibilidad del servicio.

El principal problema actualmente con GAE, es que esta en fase beta y sólo se puede acceder a él por invitación, afortunadamente cuento con una de esas invitaciones, pero me puse a pensar en todos aquellos que desean probar el servicio y no tienen una cuenta actualmente. Por más que quisiera ser generoso, Google no permite más de tres proyectos en GAE actualmente, y no puedo borrar proyectos, así que hasta yo debo ser cuidadoso con mis tres oportunidades.

Entonces ¿qué podemos hacer,? pues bien, Google ofrece actualmente en el SDK del GAE un webserver muy simple que nos permite probar nuestra aplicación GAE en nuestra propia máquina, el problema es que por defecto el script dev_appserver.py sólo escucha en el localhost en el puerto 8080. Se me ocurrio sencillamente jugar un poco con las opciones de configuración y consegui que trabajara usando el IP público y el puerto 80, actualmente tengo ese tipo de solución corriendo en http://gae.volkanrivera.com

Es importante tener presente que no todas las funcionalidades de GAE estan soportadas por el dev_appserver.py la pérdida más importante es la posibilidad de logueo usando una cuenta de Google. Tenga en cuenta que éste tipo de solución que expongo aquí implica ciertos riesgos así que le recomiendo que lo haga sobre un servidor virtual que puede sencillamente apagar en caso de problemas (alguien hackeo el dev_appserver.py y lo esta usando para enviar spam).

Comencemos con la configuración, como usuario "root" instale estos paquetes:

# apt-get install g++ zip unzip less postfix proftpd pound

De ser necesario puede reconfigurar el postfix usando éste comando:

# dpkg-reconfigure postfix

Cuando sea preguntado sobre que tipo de instalación desea para el proftpd, selecciones "standalone".

Luego edite el archivo /etc/proftpd/proftpd.conf y agregue estas líneas:

TimesGMT                        off
DefaultRoot                     ~

Hagalo después de éstas línea:

# Port 21 is the standard FTP port.
Port                            21

Adicionalmente deshabilite el protocolo ipv6 en el /etc/proftpd/proftpd.conf de ésta forma:

UseIPv6                         off

Ahora edite el archivo del proxy inverso /etc/pound/pound.cfg y sólo deje estas líneas, tenga cuidado en reemplazar www.xxx.yyy.zzz por el IP público de su server:

User            "www-data"
Group           "www-data"
LogLevel        1
## check backend every X secs:
Alive           30

ListenHTTP
        Address www.xxx.yyy.zzz
        Port    80

        xHTTP           0

        Service
                BackEnd
                        Address 127.0.0.1
                        Port    8080
                End
        End
End

Luego edite el archivo /etc/default/pound y coloque el valor de la variable startup=1

Ahora instalemos el SDK, para ello debemos descargarlo e instalarlo como root de ésta forma:

# cd /usr/src
# wget http://googleappengine.googlecode.com/files/google_appengine_1.0.2.zip

# unzip google_appengine_1.0.2.zip
# mv
google_appengine /usr/local/gae

Ahora que tenemos instalado nuestro SDK debemos proceder a crear un usuario que deseamos usar para probar el GAE en nuestro caso usaremos el nombre de usuario gae, pero puede ser cualquiera.

# adduser gae

Finalmente cambiamos al usuario "gae" y continuamos el resto de la configuración como dicho usuario:

$ cd ~/
$ cp -R /usr/local/gae/demos/guestbook/ ./

Necesitamos crear dos scripts uno para arrancar el servidor GAE y otro para detenerlos aquí esta el script para arrancar el dev_appserver.py, puede llamarlo start_gae

#!/bin/bash

/usr/local/gae/dev_appserver.py
–enable_sendmail
$1
2>~/gae.log &

Aquí esta el script para detenerlo, puede llamarlo stop_gae:

#!/bin/bash

kill -9 `lsof -i :8080 | grep ^python | awk ‘{print $2}’`

Antes de arrancar el servidor GAE, necesitamos crear los siguientes archivos, lo haremos con el mismo usuario que correrá GAE usando estos comandos:

$touch /tmp/dev_appserver.datastore
$touch /tmp/dev_appserver.datastore.history

Si no tiene privilegios para crear esos archivos, pues sencillamente creelos como "root" y luego cambie el propietario con el comando chown.

Ahora ya estamos listos para iniciar el servidor GAE, que por el momento lo usaremos para correr la aplicación demo que viene dentro del SDK llamada guestbook, para ello como el usuario "gae" ejecutaremos éste comando:

$ ./start_gae guestbook/

De haber hecho todo de bien Ud. debería de obtener ésto con un netstat -tl:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 localhost:webcache      *:*                     LISTEN
tcp        0      0 *:ftp                   *:*                     LISTEN
tcp6       0      0 *:ssh                   *:*                     LISTEN
tcp6       0      0 *:smtp                  *:*                     LISTEN

Observe que "webcache" es el nombre del puerto 8080. Ahora como usuario "root" debemos de iniciar el proxy inverso, para ello usamos este comando:

# /etc/rc.d/pound start

Listo ahora podemos ver nuestro guessbook sencillamente apuntando al IP público o usando un nombre de dominio válido apuntado a dicha IP.

Usando el SDK de Google Apps Engine

El lunes pasado comentaba que me había llegado mi invitación para crear mi cuenta en Google Apps Engine (GAE), y tenía la duda sobre que aplicación desarrollar. He decidido en éste post hablar brevemente sobre como desarrollar una aplicación básica para GAE haciendo uso del SDK que ofrece Google de manera gratuita.

Si alguien planea usar GAE como plataforma para desarrollar una aplicación de producción, pues es bueno hacer ciertas aclaraciones para que nadie luego se sienta sorprendido, en lo personal creo que GAE es una gran iniciativa, pero ciertamente tiene sus inconveniente, aquí los más importantes:

  •  El único lenguaje de programación soportado actualmente es Python, se espera en un futuro ofrecer algunos otros.
  • No existe un motor de base de datos relacional, la única forma de almacenar información es en grande tablas que reciben el nombre de "datastore" (almacenes de datos), aunque Google ofrece la posibilidad de hacer queries en una sintaxis parecida a un SELECT de SQL, en realidad sólo ofrece eso, todas las escrituras o ediciones de datos deben ser hechas usando las funciones que provee Google para el datastore.
  • Las aplicaciones una vez que son levantadas a la red de Google no pueden ser borradas, así que cuidado con que es lo que subimos a GAE.
  •  Nuestra aplicación una vez desarrollada es automáticamente escalable, ya que GAE es el que se encarga de proveer la redundancia y distribución de la data a través de toda la red de Google, lo cuál es bueno poque reduce al mínimo la inversión en hardware, pero hay un inconveniente. Las aplicaciones desarrolladas para GAE, sólo correran en GAE. No hay forma de hacer un back up de la data y copiar los archivos de la aplicación para luego moverla un servidor web fuera de la red de Google, estamos ante una arquitectura cerrada.
  • Los datos que almacenemos en el datastore, estan en poseción de Google y por lo tanto Google puede indexarlos para que estén su motor de búsqueda. Así que cuidado con la información que se pone en el datastore, poque cualquiera podría tener acceso a ella.

Teniendo claro los puntos anteriores ya sabemos que podemos y que no podemos hacer con GAE, por lo tanto ya queda a nuestro criterio la naturaleza de la aplicación que desarrollemos. Comencemos ahora con éste breve tutorial que trata de explicar como instalar y correr una aplicación GAE mínima usando el SDK que puede ser descargado libremente desde la red de Google.

Lo primero que debemos hacer es descargar el SDK de GAE desde esta pagina web (en mi caso particular lo hare usando la versión Linux):

http://code.google.com/appengine/downloads.html

Los que tengan Linux or Mac pueden comenzar el proceso de instalación del SDK inmediatamente porque usualmente Python 2.5 ya está instalado, pero los usuarios de Windows deben de descargar e instalar Python desde aquí:

http://www.python.org/download/

Cuando se ha descargado el ZIP file de la versión Linux debemos tipear los siguientes comandos para instalarlo (asumiendo que usan Ubuntu):

$ unzip google_appengine_1.0.1.zip
$ sudo mv google_appengine /usr/local/appengine

Ya estamos listos para desarrollar nuestro primer ejemplo entonces. Para ello basta con que creemos un directorio llamado "holamundo", y luego entraremos a dicho directorio, para hacerlo usaremos los siguientes comandos:

$ cd ~
$ mkdir holamundo
$ cd holamundo

Ahora debemos de crear dos archivos uno llamado "holamundo.py" y otro llamado "app.yaml". El contenido de dichos archivos debe ser el siguiente:

holamundo.py:

print ‘Content-Type: text/html’
print »
print ‘hola mundo!!!’

app.yaml:

application: holamundo
version: 1
runtime: python
api_version: 1

handlers:
– url: /.*
  script: holamundo.py

Como es obvio el primer archivo holamundo.py es el programa que contiene nuestra aplicación y app.yaml le informa a GAE como procesar nuestra aplicación. holamundo.py no requiere mayor comentario pues es obvio por su sintaxis que lo único que hara la aplicación sera mostrar las palabras "hola mundo!!!" en el navegador, todo el trabajo de configuración se realiza en app.yaml, aquí una explicación detallada línea por línea:

application: holamundo
Como su nombre lo indica esta cláusula le da
nombre a nuestra aplicación
version: 1 Es la versión de nuestra aplicación, para nuestro
ejemplo esta es la primera versión que hacemos
de nuestro programa
runtime: python El lenguaje de programación que se usará para
ejecutar nuestra aplicación por el momento sólo
python esta disponible, pero se espera que otros
pronto.
api_version: 1 La versión del API que estamos usando, puesto
que esta es la primera verisón disponible, lo
indicamos en ésta claúsula pues depende de la
versión del API las funciones a las que tenemos
acceso, muchas funciones pueden añadirse o
eliminarse, con esta cláusula GAE sabe que
versión de API utilizar para ejecutar nuestra
aplicación.
handlers: Con ésta cláusula indicamos como debe GAE
de procesar los requerimientos POST/GET de
los clientes.
 – url: /.* Con ésta cláusula le decimos a GAE que debe hacer
con toda solicitud a nuestra aplicación ".*" es una
expresión regular que significa toda cadena de texto
de un caracter o más
 script: holamundo.py Cumplida la condición anterior, GAE ejecutará el
script "holamundo.py", que es nuestra aplicación.

Ahora que ya tenemos creados los dos archivos básicos que componen nuestra aplicación debemos de inciar el servidor web que viene en el SDK para poder probarla y ver que tal nos quedo, para ello debemos de ejecutar el siguiente comando (en Linux):

$ /usr/local/appengine/dev_appserver.py ~/holamundo

Es muy importante que tomemos en cuenta de que debemos dar la base del directorio y no el archivo de nuestra aplicación, luego de que demos el comando anterior el servidor de prueba local nos preguntará si deseamos de que busque los últimos updates, a lo que debemos responder que sí. Luego de eso debemos ver una serie de mensajes como éstos:

INFO     2008-05-08 17:18:27,431 appcfg.py] Checking for updates to the SDK.
INFO     2008-05-08 17:18:27,563 appcfg.py] The SDK is up to date.
WARNING  2008-05-08 17:18:27,563 datastore_file_stub.py] Could not read datastore data from /tmp/dev_appserver.datastore
WARNING  2008-05-08 17:18:27,563 datastore_file_stub.py] Could not read datastore data from /tmp/dev_appserver.datastore.history
INFO     2008-05-08 17:18:27,565 dev_appserver_main.py] Running application holamundo on port 8080: http://localhost:8080

Eso nos indicará que ya tenemos corriendo el webserver en el puerto 8080 que nos permitirá ver como luciría nuestra aplicación en GAE, para ver nuestra aplicación sólo debemos de abrir nuestro navegador y apuntar a: http://localhost:8080

Si todo esta bien debemos de ver una página como ésta:

Hola Mundo

Ahora que ya tenemos un SDK instalado, y sabemos lo básico sobre él, podemos comenzar a experimentar con las funciones incluídas en él.

Espero que éste mini-tutorial les haya sido de utilidad y espero sus comentarios.

Me llego mi invitación para Google Apps Engine

Estoy contento me ha llegado mi invitación para probar el último juguete introducido por Google, el hasta ahora poco popular Apps Engine, ya he hablado sobre el en un post anterior en éste blog el día de su lanzamiento. Cuando el proyecto fue hecho público se dieron 10,000 invitaciones, ese día no pude lograr un cupo, pero al parecer he sido considerado posteriormente y me han enviado mi invitación, ya he comenzado a darle un vistazo al SDK del Apps Engine, y aunque por el momento todo debe programarce en Python, la cosa no esta tan complicada, aunque valgan verdades las funciones ofrecidas en Apps Engine son mínimas, tanto que a pesar de que ya éste proyecto va para un mes apenas tendra un par de cientos de aplicaciones disponibles en la galería de proyectos, lo cuál puede considerarce decepcionante. Y hasta ha habido quien habiendo recibido la invitación no se le ocurrio mejor idea que hacer una aplicación para solicitar a Google que implemente PHP en el SDK para Apps Engine, dicho sea de paso ya firme la solicitud.

Éstos días he estado realmente ocupado, y no he podido más que leer el breve tutorial que explica como usar el SDK, pero por lo que he leído me parece que lo único que se ofrece es un soporte CGI básico, la mayor parte de la interacción debe ser implementada en JavaScript porque lo que se ofrce en Python básicamente son un sistema de template básico, funciones para autenticar contra una cuenta de Gmail, envio de e-mails, extracción de información de URLs y almacenamiento usando GQL (Google Query Language), una personalización de SQL para el datastore de que ofrece Google en Apps Engine.

De las aplicaciones que he podido ver, la única que me pareció bastante aceptable fue Twig, que pretende ser una alternativa a Twitter, aunque está todavía en una fase bastante alfa. Las demás no son más que experimentos, y muchas de ellas aunque aparecen en el directorio por alguna razón ya no estan activas, supongo que Google debe haberlas retirado por actividades relacionadas con el spam, aunque ésto es una suposición mia.

Hasta ahora no se que aplicación desarrollar, ya he visto varios blogs y forums en la galleria de Apps Engine, probablemente haga algo parecido, ya les estaré comentando por cuál proyecto me decidí y les pasaré el URL para que lo visiten y comenten sobre el mismo.

Hackontest, maratón de hacking.

¿Estaría Ud. dispuesto a participar en una maratón de programación de 24 horas en su proyecto OpenSource favorito?, pues les hablaré sobre Hackontest, el último proyecto de promoción del Open Source promovido por Google. El principal objetivo de los creadores de Hackontest, es mejorar los proyectos Open Source en base a las necesidades de los usuarios, y hacer público la manera cómo se desarrolla Open Source de una manera bastente entusiasta.

Durante la actual fase  de selección del proyecto Hackontest, los usuarios y desarrolladores de proyectos Open Source están enviando solicitudes de nuevas características, votando por las ya propuestas o comentándolas, todo muy web 2.0. El 1 de agosto de éste año, el jurado seleccionará los tres equipos más prometedores, cada uno de los cuales recibirá un viaje todo pagado a Suiza los días 24 y 25 de setiembre para participar en la competencia final ha realizarce en la ciudad de Zurich.

La competencia final sera dentro del Mission Eternity Sarcophagus (Sarcófago Misión Eternidad), desarrollado por eToy, y que es de 6 metros de largo, 2.4 metros de ancho, y 2.6 metros de alto. Donde los desarrolladores estaran por 24 horas trabajando sobre su proyecto Open Source, y su única comunicación con el mundo exterior será su comunidad virtual. Durante esas 24 horas los equipos en la final deberán implementas las características seleccionadas por el jurado, de todas la enviadas durante la fase de selección on-line. El equipo ganador recibirá un premio de U.S.$ 8,500.

Una interesante idea, y sobre todo que muestra que el Open Source no es un fenómeno de un puñado de desarrolladores, sino el esfuerzo conjunto de una comunidad que hace uso de los programas y que propone nuevas características, las implementa, prueba y añade al proyecto de forma orgánica.

Mapa de los datacenter de Google

Google es sin duda una de las empresas que más infraestructura web ha desplegado, hasta tal punto que cuando dejo de anunciar sus webservers como "Apache", pues en realidad es una versión modificada del mismo y comezó ha usar como identificación de los mismos "gws" (abreviatura para Google Web Server), la diferencia entre Apache e IIS bajo drásticamente.

Google es sin duda una de las compañías con más peso específico en Internet, quizá para darnos una idea de su tamaño podríamos mencionar que de acuerdo a los balances presentados por Google, en el año 2006 el gasto en datacenters fue de 1,900 millones de dólares y en el 2007 fue de 2,400 millones de dólares. Y el año pasado presentó el proyecto de 4 nuevos datacenter cada uno con un costo estimado de construcción (edificios + servidores) de $600 millones.

Sin embargo a pesar de su tamaño y notoriedad no está claro cuántos y cuáles son los datacenters de Google, pues además de la infraestructura propia, usualmente despliega servidores en datacenters comerciales. Pero en un artículo publicado ayer en el blog de Royal Pingdom, se informa de la existencia de 19 datacenters en USA, 12 en Europa, 1 en Rusia, 1 en Brasil y 3 en Asia. Ésto segun la investigación realizada por dicho blog, pues Google oficialmente no anuncia la ubicación de sus datacenter y usualmente esconde su ubicación geográfica, pues todos los registros de WHOIS de las IP’s asignadas a Google están apuntando a su oficina principal en Mountain View, California, aunque de hecho ésto no sea correcto.

Aquí les dejo un mapa de los 36 datacenter de Google identificados por el autor del blog que les comentaba anteriormente y que mantiene su nombre en el anonimato.

GoogleDatacenters