1

Instalar un proyecto Django en Heroku

Hace tiempo, tuve la necesidad de subir un proyecto hecho con Django a Heroku, fue toda una experiencia, ya que estoy más acostumbrado a los entorno VPS, y no tanto a que ya está todo planeado para que lo haga de una forma muy específica, pero si lo que queremos es deshacernos del dolor de cabeza que es administrar un servidor, heroku es la opcion; solo que se los advierto, no es barato!

Si no están familiarizados con Heroku, este es simplemente una plataforma muy robusta para publicar de forma fácil y rápida nuestros proyecto, ya sea Django, Flask, Rails, Node.js, etc. Mejor conocido como un PaaS, Platform as a Service; Heroku cuenta con diferente Add-ons que pueden ayudarnos a escalar nuestros proyectos, y en caso de querer incrementar el poder de procesamiento del servidor, basta con un simple click en el panel de control para lograrlo, todo esto a un precio similar a 35 dlls mensuales por instancia, como dije no es precisamente barato, pero si su proyecto es muy grande y cuenta con mucho tráfico, lo vale.

Pre-requisitos

  • Antes que nada es necesario estar registrados en Heroku con una cuenta de developer, en caso de no tenerla, este es el link de registro.

  • También tenemos que instalar la aplicación de Heroku para ponernos conectar con nuestras instancias desde la terminal haciendo un “heroku login”.

  • En este tutorial usaremos Postgresql como base de datos, en caso no de tenerlo instalado, le recomiendo que lo haga.

  • Y asumo que esta de mas decir que trabajaremos todo dentro de un entorno virtual local.

Heroku con django

Manos a la obra!, suponiendo que ya tenemos un proyecto con Django desarrollado, pensémoslo como algo simple, un blog personal por ejemplo, llamado djangoblog, si quisiéramos publicar este blog en heroku, primero tendremos que hacer algunos ajustes a nuestro proyecto, ajustes que probablemente no estuvieran contemplados antes en caso de no haber planeado con tiempo que terminaríamos usando heroku como servidor.

Obviamente trabajando con un entorno virtual de python, vamos a crear un archivo requerements.txt en caso de no tenerlo, dicho archivo debe encontrarse en la raíz del proyecto, junto al archivo manage.py, ya que es aquí donde Heroku lo buscará al instalar el proyecto. Dentro de requirements.txt lo que haremos es especificar qué paquetes de python necesitaremos, pero es de suma importancia que también especifiquemos la versión que usamos de cada paquete, esto nos evitará futuros problemas de compatibilidad.

Django==1.7
dj-database-url==0.3.0
dj-static==0.0.6
gunicorn==19.1.1
psycopg2==2.5.1
static==0.4
wsgiref==0.1.2

Estos paquetes son como mínimo lo que necesitamos para correr un proyecto con pocas dependencias, en caso de requerir mas librerias, solo hay que agregarlas.

Ahora algo importante, heroku requiere otro archivo mas de configuración en la raíz del proyecto, me refiero a crear un archivo llamado Procfile, en este archivo especificamos como debe Heroku ejecutar la instancia de nuestro proyecto. Un ejemplo del contenido del archivo sería el siguiente:

web: gunicorn djangoblog.wsgi --log-file -

Todo lo que tengo que decir de este ejemplo, es que estamos diciéndole a Heroku que queremos arrancar una instancia web, y dejar que gunicorn ejecute nuestra aplicación dentro de la instancia, Heroku se encargara del resto, es así de fácil.

Django Settings

Claro que lo anterior ejecutará nuestro proyecto en Heroku, pero esto no garantiza que el proyecto correrá sin problemas, de hecho lo que pasará es que una excepción será disparada, ya que aun nos falta lo mas importante, configurar Django para que trabaje bien con Heroku.

# obtener la configuración de la base de dato a partir de la variable $DATABASE_URL
import dj_database_url

DATABASES['default'] =  dj_database_url.config()
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

# Permitir todos los nombres de dominio
ALLOWED_HOSTS = ['*']

# Configuramos la ruta de los archivos estáticoss
import os
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
STATIC_ROOT = 'staticfiles'
STATIC_URL = '/static/'

STATICFILES_DIRS = (
   os.path.join(BASE_DIR, 'static'),
)

Nos aseguramos de que dentro de nuestro archivo settings.py se encuentren las anteriores configuracion tal cual las muestra el ejemplo, ya que aquí le indicamos a Django como obtener la configuracion de la base de datos, y que hacer con los archivos estaticos dentro de Heroku.

El archivo wsgi.py tambien debe modificarse para quedar tal cual este ejemplo:

from django.core.wsgi import get_wsgi_application
from dj_static import Cling

application = Cling(get_wsgi_application())

Con esto tenemos el proyecto Django configurado correctamente para correr dentro de Heroku sin problemas.

Configurando GIT para trabajar con Heroku

Heroku solo permite que los proyectos sean instalados en el por medio de GIT, asi que si no tenemos aun git iniciado en nuestro proyecto, iniciarlo es sumamente facil, sigamos esta serie de comandos:

git init
git add .
git commit -m "primer commit"

Creamos un archivo llamado .gitignore en caso de no tenerlo ya, y agregamos las reglas para los archivos que no queremos tener en el repositorio, por ejemplo:

venv
*.pyc
staticfiles

Instalando el proyecto en Heroku

Una vez logeados a heroku por medio del comando:

heroku login

Sigue crear un enlace al repositorio que Heroku nos brinda para subir nuestros cambios y enviarlos al servidor:

heroku create

El comando create hace dos cosas, la primera es crearnos en nuestra cuenta de heroku una aplicación nueva donde se instalara nuestro proyecto, lo segundo es agregar a nuestra configuración local de git un nuevo enlace remoto para poder conectarnos a heroku y enviarle nuestros cambios por medio de git. Para comprobar esto basta con hacer un push al repositorio en heroku:

git push heroku master

Esto automáticamente instalará la aplicación dentro de la instancia que tenemos asignada para ella en Heroku, podemos darnos cuenta por el output que nos arroja en la consola:

Counting objects: 11, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (9/9), done.
Writing objects: 100% (11/11), 4.01 KiB, done.
Total 11 (delta 0), reused 0 (delta 0)
-----> Python app detected
-----> No runtime.txt provided; assuming python-2.7.6.
-----> Preparing Python runtime (python-2.7.6)
-----> Installing Distribute (0.6.36)
-----> Installing Pip (1.3.1)
-----> Installing dependencies using Pip (1.3.1)
      Downloading/unpacking Django==1.5 (from -r requirements.txt (line 1))
      ...
      Successfully installed Django psycopg2 gunicorn dj-database-url dj-static static
      Cleaning up...
-----> Collecting static files

      0 static files copied.

-----> Discovering process types
      Procfile declares types -> web

-----> Compiled slug size is 29.5MB
-----> Launching... done, v6
      http://simple-spring-9999.herokuapp.com deployed to Heroku

To git@heroku.com:simple-spring-9999.git
* [new branch]      master -> master

Probando que nuestra aplicación esta corriendo

Ya solo queda comprobar que lo hicimos bien, y la única forma de hacerlo es abriendo el navegador y viendo correr nuestra aplicación. Heroku nos brinda de una url personalizada para cada aplicación que exista en el, con ella podremos hacer las primeras pruebas.

Para asegurarnos de que tenemos corriendo una instancia web para nuestra aplicación, debemos iniciarla con un comando más de Heroku.

heroku ps:scale web=1

Para ver cuantas instancias tenemos corriendo en Heroku:

heroku ps

Recuerden que Heroku nos cobra por cada instancia que ejecutamos, únicamente nos regala la primera para hacer pruebas, asi que de momento no se preocupen por solo tener una instancia corriendo, para conocer más detalles de los precios de Heroku consulta su lista de precios.

Y bueno, a lo que vamos, para abrir el navegador con en el link a nuestra aplicación usamos:

heroku open

Y con esto conoceremos la ruta que Heroku nos brinda de momento para probar nuestra aplicación.

En caso de querer ver los logs de la instancia:

heroku logs

E incluso tenemos la posibilidad de enviarle comandos de consola a Heroku usando

heroku run <comando>

por ejemplo

heroku run python manage.py syncdb

Con lo que podrias mandar sincronizar nuestra base de datos.

Claro que para un proyecto muy elaborado habrá que invertirle tiempo a configurar más cosas, y probablemente nos causara un par de dolores de cabeza inesperados, pero todo es parte del proceso de aprendizaje por el que todos tenemos que pasar. Si quieren saber mas detalles tecnicos de Heroku, consulten la documentación oficial en donde nos brindan con un buen número de tutoriales en ingles.

Jesus Anaya - Programador de python y django con un gusto obsesivo por las series de television.

Comentarios

  1. avatar
    Diego dijo

    Hola tengo una duda sobrecrear un archivo en el git eso como se hace ???

Pública un comentario