¿Qué es Heroku?

Heroku es una Plataforma de aplicaciones en la nube, no posee servidores propios, sino que los contrata de la nube EC2 de Amazon.

A diferencia de los servidores EC2 de Amazon, es Heroku el que decide y gestiona el sistema operativo (Debian) y  sus servidores.

Heroku nos permite habilitar nuevas funcionalidades para nuestras aplicaciones en forma de addons, así como escalar nuestra aplicación de una forma bastante sencilla.

La cuenta básica en Heroku es gratuita. Cada aplicación que se cree dispone de una base PostgrasSQL de 5MB, y 750 horas dyno por mes.

 

Primeros pasos en Heroku

Primero debemos crearnos una cuenta en Heroku, para eso podemos seguir los pasos del siguiente articulo.

1 ) Heroku sign-up
Creamos una cuenta en Heroku

2 ) Instalamos toolbelt
Instalamos el cliente de Heroku, existen versiones para Mac OS X, Windows y Debian/Ubuntu

La instalación de toolbelt incluye estas tres aplicaciones

Heroku client – Herramienta Cliente para la creación y la administración de las aplicaciones de Heroku
Foreman – Nos permite ejecutar las aplicaciones localmente
Git – Control de versiones

3 ) Nos logueamos con nuestro cliente

  1. $ heroku login

Nos logueamos usando la dirección de mail y el password que utilizamos para crear nuestra cuenta en el sitio de Heroku

4 ) Creamos un directorio donde vamos a trabajar con nuestra nueva aplicación.

  1. $ mkdir heroku_app && cd heroku_app

5 ) Creamos un entorno virtual para trabajar con nuestra app, y lo activamos

  1. $ virtualenv –no-site-packages env
  2.  
  3. New python executable in ./bin/python
  4. Installing setuptools…………done.
  5. Installing pip……………done.
  1. $ source env/bin/activate

6 ) Instalamos el paquete de Django en nuestro entorno virtual

  1. $ pip install Django
  2.  
  3. Downloading/unpacking Django
  4. Downloading Django-1.4.tar.gz (7.6Mb): 7.6Mb downloaded
  5. Running setup.py egg_info for package Django
  6.  
  7. Installing collected packages: Django
  8. Running setup.py install for Django
  9. changing mode of build/scripts-2.7/django-admin.py from 644 to 755
  10.  
  11. changing mode of ~/Proyectos/heroku-project/bin/django-admin.py to 755
  12. Successfully installed Django
  13. Cleaning up…

7 ) Instalamos el paquete psycopg para tener acceso a Postgres desde Python

  1. $ pip install psycopg2
  2.  
  3. Downloading/unpacking psycopg2
  4. Downloading psycopg2-2.4.5.tar.gz (719Kb): 719Kb downloaded
  5. Running setup.py egg_info for package psycopg2
  6. .
  7. .
  8. .
  9. Successfully installed psycopg2
  10. Cleaning up…

8 ) Instalamos gunicorn. gunicorn es un servidor HTTP desarrollado en Python, simple de integrar y listo para producción.

  1. $ pip install gunicorn
  2.  
  3. Downloading/unpacking gunicorn
  4. Downloading gunicorn-0.14.2.tar.gz (203Kb): 203Kb downloaded
  5. Running setup.py egg_info for package gunicorn
  6.  
  7. .
  8. .
  9. .
  10.  
  11. Successfully installed gunicorn
  12. Cleaning up…

9 ) Guardamos el listado de paquetes locales en el archivo requirements.txt, de esta forma le vamos a indicar a Heroku cuales son los paquetes que tiene que instalar en nuestra instancia.

  1. $ pip freeze > requirements.txt

10 ) verificamos si el archivo de requerimientos se genero correctamente. deberíamos ver una salida similar a la siguiente.

  1. $ cat requirements.txt
  2.  
  3. Django==1.4
  4. gunicorn==0.14.2
  5. psycopg2==2.4.5
  6. wsgiref==0.1.2

11 ) Iniciamos nuestro proyecto en django

  1. $ django-admin.py startproject django_project .

12 ) En el archivo de settings de nuestro proyecto, habilitamos el administrador de django, y la aplicación gunicorn.

  1. $ nano django_project/settings.py
  2.  
  3. INSTALLED_APPS = (
  4.     ‘django.contrib.auth’,
  5.     ‘django.contrib.contenttypes’,
  6.     ‘django.contrib.sessions’,
  7.     ‘django.contrib.sites’,
  8.     ‘django.contrib.messages’,
  9.     ‘django.contrib.staticfiles’,
  10.     # Uncomment the next line to enable the admin:
  11.     ‘django.contrib.admin’,
  12.     # Uncomment the next line to enable admin documentation:
  13.     # ‘django.contrib.admindocs’,
  14.     ‘gunicorn’,
  15. )

13 ) Recopilamos los archivos estáticos que usen las aplicaciones de django que tenemos habilitadas.
Esto es util para este ejemplo, en un entorno de producción convendría configurar algún CDN

  1. $ python manage.py collectstatic
  2.  
  3. You have requested to collect static files at the destination
  4. location as specified in your settings.
  5.  
  6. This will overwrite existing files!
  7. Are you sure you want to do this?
  8.  
  9. Type ‘yes’ to continue, or ‘no’ to cancel: yes
  10. .
  11. .
  12. .
  13. 72 static files copied.

14 ) Editamos nuestro archivo url.py para incluir los patrones de url correspondiente al administrador de django,
a nuestra vista Home y la url para los archivos estáticos.

  1. $ nano django_project/urls.py
  2.  
  3. from django.conf.urls import patterns, include, url
  4. from django.contrib import admin
  5. admin.autodiscover()
  6.  
  7. # importamos settings
  8. from django_project import settings
  9.  
  10. urlpatterns = patterns(,
  11.     url(r‘^static/(?P.*)$’, ‘django.views.static.serve’, {‘document_root’: settings.STATIC_ROOT}),
  12.     url(r‘^$’, ‘django_project.views.home’, name=‘home’),
  13.     url(r‘^admin/’, include(admin.site.urls)),
  14. )

15 ) Generamos una vista muy simple para nuestra home

  1. $ nano django_project/views.py
  2.  
  3. from django.http import HttpResponse
  4.  
  5. def home(request):
  6.     return HttpResponse("Bienvenidos a heroku_app – <a href="/admin/">acceso admin</a>")

16 ) Definimos cuales son los directorios/archivos que nuestro repositorio en git tiene que ignorar.
Para eso incluimos en el archivo .gitignore el directorio donde se encuentran los archivos relacionados a nuestro entorno virtual
y los archivo compilados de Python

  1. $ nano .gitignore
  2.  
  3. env/
  4. *.pyc

17 ) Creamos el archivos de procesos para que heroku ejecute el comando que lanza el proceso web de nuestro proyecto.

  1. $ nano Procfile
  2.  
  3. web: gunicorn django_project.wsgi -b 0.0.0.0:$PORT

18 ) Inicializamos el repositorio git, incluimos los archivos de nuestro proyecto y realizamos el commit inicial.

  1. $ git init
  2. $ git add .
  3. $ git commit -m "Initial Commit"

19 ) Creamos nuestra app en Heroku, en el stack cedar 

  1. $ heroku create –stack cedar

20 ) Hacemos un push de nuestro codigo al branch master del repositorio de nuestra aplicación

  1. $ git push heroku master

21 ) Ejecutamos en nuestra instancia de Heroku el comando para sincronizar nuestra base de datos de django

  1. $ heroku run python manage.py syncdb

como es la primer sincronización, y tenemos habilitada la aplicación ‘admin’, este proceso nos va a permitir definir un usuario administrador en django.

22 ) y finalmente podemos acceder a nuestro proyecto en django ejecutandose en una instancia de Heroku.

  1. $ heroku open

23 ) Podemos verificar el estado de los procesos de la instancia con el siguiente comando

  1. $ heroku ps

y acceder al log de la instancia

  1. $ heroku logs

Cualquier comentario o sugerencia es bienvenido! Gracias