Implementación de aplicaciones Django en Heroku desde GitHub

En este artículo, describiremos la implementación de una aplicación Django en una canalización de Heroku desde un repositorio de GitHub.

Introducción

Heroku es una popular Platform-as-a-Service (PaaS) que permite a los desarrolladores ejecutar e implementar aplicaciones aprovechando la infraestructura necesaria en términos de hardware y software.

Esto significa que no tenemos que invertir en el hardware y el software necesarios para exponer nuestras aplicaciones a los usuarios finales y esta libertad nos permite concentrarnos en nuestra lógica comercial en lugar de la implementación.

En esta publicación, describiremos cómo implementar una aplicación simple de Django en una canalización de Heroku. Se dirige a los desarrolladores de Python existentes y asume una comprensión básica de la configuración y ejecución de una aplicación Django.

Requisitos previos

Para esta publicación, necesitaremos:

Aplicación de demostración

Bootstrapping de la aplicación Django

Antes de implementar nuestra aplicación Django, debemos prepararla según los requisitos de Heroku. Comenzaremos creando un entorno virtual, activándolo e instalando los paquetes necesarios, y finalmente arrancando una aplicación simple de Django:

1
2
3
4
$ virtualenv --python=python3 env --no-site-packages
$ source env/bin/activate
$ pip install django gunicorn
$ django-admin startproject plaindjango

Si todo va bien, deberíamos tener la siguiente página de destino ejecutándose en nuestro servidor local:

django app bootstrap

En este punto, la estructura de carpetas de nuestro proyecto es:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ cd plaindjango && tree .
.
├── manage.py
└── plaindjango
    ├── __init__.py
    ├── asgi.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

1 directory, 6 files

Antes de implementar Heroku, necesitaremos hacer algunos cambios. Primero, necesitamos cambiar la configuración ALLOWED_HOSTS en nuestro plaindjango/settings.py a:

1
ALLOWED_HOSTS = ['*']

Esta configuración define los hosts o dominios que nuestra aplicación Django puede servir. Es una medida de seguridad contra Ataques de host de encabezado HTTP, pero como lo nuestro es una simple demostración proyecto, permitiremos todos los hosts agregando '*' en la lista.

El siguiente cambio que debemos hacer es especificar una carpeta para nuestros archivos estáticos a través de la configuración STATIC_ROOT:

1
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

Cuando Heroku implementa nuestra aplicación, ejecuta el comando django-admin collectstatic, que agrupa y guarda todos los archivos estáticos en la carpeta especificada. Esta carpeta estará en el directorio raíz de nuestro proyecto.

Preparación de la aplicación para la implementación

Con nuestra aplicación Django lista, Heroku requiere que incluyamos los siguientes archivos en la raíz de nuestro proyecto para que pueda estar listo para su implementación:

  1. tiempo de ejecución.txt

El propósito de este archivo es especificar la versión de Python que se usará para ejecutar nuestro proyecto. En nuestro caso, el archivo solo contendrá:

1
python-3.7.6
  1. Perfil

Este archivo especifica los comandos que se ejecutarán cuando el programa se esté iniciando.

Durante la configuración, instalamos gunicornio ('Green Unicorn'), que es un servidor Python puro WSGI (interfaz de puerta de enlace del servidor web) para UNIX.

Si bien Django se envía con su propio servidor WSGI, nuestro perfil le indicará a Heroku que use Gunicorn para atender nuestra aplicación. El contenido de este archivo será:

1
web: gunicorn plaindjango.wsgi:application --log-file -

Esta línea le dice a Heroku que el nuestro es un proceso o aplicación web que se iniciará usando gunicorn. Gunicorn usará el archivo WSGI de nuestro proyecto para iniciar nuestro servidor de aplicaciones.

  1. requisitos.txt

Finalmente, necesitamos el archivo requirements.txt que define los requisitos de nuestra aplicación Django. Esto lo podemos crear en nuestro entorno virtual ejecutando el siguiente comando:

1
$ pip freeze > requirements.txt

La estructura de carpetas final de nuestra aplicación Django que contiene los archivos adicionales ahora será:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
$ tree .
.
├── Procfile
├── manage.py
├── plaindjango
   ├── __init__.py
   ├── wsgi.py
   ├── settings.py
   ├── urls.py
   └── wsgi.py
├── requirements.txt
└── runtime.txt

1 directory, 9 files

Con estos archivos en su lugar, nuestra aplicación está lista para Heroku.

Implementación en Heroku a través de GitHub

Si bien Heroku ofrece su propia plataforma Git que podemos usar para nuestras implementaciones, no tiene tantas funciones como GitHub. Heroku también nos permite extraer nuestro código de GitHub e implementarlo.

Nuestro código está listo para su implementación, por lo que podemos continuar y crear un repositorio de GitHub y enviar nuestro código.

For reference, here is una aplicación Django de muestra en GitHub that is ready for deployment on Heroku.

Con nuestro trabajo listo en GitHub, diríjase a Heroku y cree una nueva canalización con el botón "Nuevo" en la parte superior derecha de nuestro tablero de Heroku.

Proporcionamos el nombre de nuestra canalización y el repositorio de GitHub para conectarse a:

creating a django pipeline

Una tubería representa un grupo de aplicaciones de Heroku que comparten la misma base de código. En un pipeline, podemos definir diferentes etapas en un flujo de trabajo de entrega continua.

Esto significa que, a través de Heroku, podemos implementar nuestro código en nuestros entornos de producción, ensayo y desarrollo al mismo tiempo, todo desde GitHub.

Cuando usamos GitHub como la fuente de nuestra aplicación, podemos configurar canalizaciones de Heroku para implementar código desde diferentes sucursales a diferentes entornos.

Por ejemplo, el código en nuestra rama "master" se implementará en el entorno de producción, la rama "staging" en nuestro entorno de prueba y la rama "dev" en nuestro entorno de desarrollo.

Esto nos da visibilidad sobre nuestro proyecto a través de múltiples etapas mejorando nuestra entrega.

Las canalizaciones de Heroku tienen una función llamada "Revisar aplicaciones" que nos permite implementar Pull Requests como aplicaciones independientes. Con esto habilitado, podemos verificar el trabajo en las solicitudes de extracción sin tener que extraer los cambios localmente y probarlos.

El oleoducto Heroku

Esta es la vista de nuestra canalización creada recientemente para nuestra aplicación en GitHub:

pipeline landing page

La canalización tiene dos etapas de forma predeterminada y una sección para habilitar las aplicaciones de revisión. Dado que todo nuestro código reside actualmente en la rama "maestra", avancemos e implementemos la rama haciendo clic en "Agregar aplicación" en la etapa de producción:

creating the production app

Heroku nos permite agregar aplicaciones existentes a una canalización o crear una nueva. Dado que se trata de una nueva canalización, crearemos una nueva aplicación llamada plaindjango-production que será nuestro entorno de producción.

Esto resulta en:

ready production app

Nuestra aplicación de producción se ha creado pero nuestro código aún no se está ejecutando. El siguiente paso es elegir la rama desde la que se desplegará el código a nuestro entorno de producción:

choose branch

Una vez que hagamos clic en "Implementar", Heroku extraerá nuestro código de la rama "maestra" y lo implementará. Podemos ver el progreso de la implementación al ver los registros y una vez que se implemente la aplicación, recibiremos un enlace a nuestra aplicación en ejecución:

successful logs

Al final de los registros, hay un enlace a nuestra aplicación en ejecución. Cuando accedemos al enlace, nos da la bienvenida nuestra landing page de Django:

production deployment

Implementamos con éxito nuestra aplicación Django de producción en Heroku a través de GitHub. Para crear una aplicación para nuestro entorno de prueba, se siguen los mismos pasos que para el entorno maestro.

Comenzaremos creando una rama "staging" en GitHub a través de la terminal:

1
$ git checkout -b staging && git push origin staging

Finalmente, se agrega una aplicación al proyecto y se crea una solicitud de extracción desde la rama "staging" a la rama "master".

La solicitud de extracción se puede ver aquí en GitHub, y este es el resultado en nuestro pipeline de Heroku:

pull request deployed

Podemos ver que se ha creado una nueva aplicación para nuestra solicitud de extracción y cuando la abrimos, podemos ver los cambios que la solicitud de extracción introduce en nuestro proyecto:

pull request changes live

Nuestra solicitud de extracción se implementó correctamente y podemos revisarla antes de fusionar los cambios en el maestro. Con las implementaciones automáticas activadas, Heroku implementará nuestros cambios una vez que fusionemos la solicitud de extracción en la rama maestra y los cambios se activarán automáticamente.

Conclusión

Nuestra aplicación Django se implementó en Heroku desde GitHub mediante una canalización. Si bien esta no es la única forma de implementar una aplicación Django en Heroku, es la más adecuada para un proyecto colaborativo.

Las aplicaciones en contenedores se pueden implementar en Heroku creando imágenes de Docker y publicándolas en Dockerhub o en el propio registro de contenedores de Heroku. Puede encontrar más información sobre la implementación de aplicaciones dockerizadas en Heroku en la [documentación oficial] (https://devcenter.heroku.com/categories/deploying-with-docker). Heroku también proporciona una plataforma Git que se puede usar para implementar aplicaciones junto con su herramienta CLI.

Con la integración con git y la funcionalidad de GitHub para permitir la implementación de aplicaciones en contenedores, Heroku es una plataforma capaz de manejar sus necesidades de desarrollo. La plataforma también proporciona complementos a través de un mercado.

Estos complementos son servicios o piezas de infraestructura que se pueden utilizar para mejorar nuestras aplicaciones. Dichos complementos nos permiten integrar nuestra aplicación a bases de datos y almacenes de datos, incluidos PostgreSQL, MySQL y Redis.

Se puede lograr más con las aplicaciones Django en Heroku, y esta publicación tenía como objetivo presentar una vista simple de cómo implementar una aplicación Django en la plataforma de una manera que se adapte a nuestro flujo de trabajo diario.

El proyecto Django listo para Heroku se puede encontrar aquí en GitHub, así como la solicitud de extracción abierta que también se implementó.