Implementación de aplicaciones Django en Heroku desde GitHub

    Introducción

    Heroku es una plataforma como servicio (PaaS) popular que permite a los desarrolladores ejecutar e implementar aplicaciones aprovechando la infraestructura requerida en términos de hardware y software.

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

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

    Prerrequisitos

    Para esta publicación, necesitaremos:

    • Un nivel libre Cuenta de Heroku,
    • Python 3+ y Virtualenv instalados
    • Git instalado y una cuenta de GitHub.

    Aplicación de demostración

    Bootstrapping de la aplicación Django

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

    $ 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:

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

    $ cd plaindjango && tree .
    .
    ├── manage.py
    └── plaindjango
        ├── __init__.py
        ├── asgi.py
        ├── settings.py
        ├── urls.py
        └── wsgi.py
    
    1 directory, 6 files
    

    Antes de implementar en Heroku, necesitaremos realizar algunos cambios. Primero, necesitamos cambiar el ALLOWED_HOSTS en nuestro plaindjango/settings.py a:

    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 dado que el nuestro es un proyecto de demostración simple, permitiremos que todos los hosts agreguen '*' en la lista.

    El siguiente cambio que debemos hacer es especificar una carpeta para nuestros archivos estáticos a través del STATIC_ROOT ajuste:

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

    Cuando Heroku está implementando 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:

    • runtime.txt

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

    python-3.7.6
    
    • Procfile

    Este archivo especifica los comandos que se ejecutarán cuando se inicie el programa.

    Mientras configuramos, instalamos Gunicorn (‘Green Unicorn’) que es un servidor WSGI (Web Server Gateway Interface) puro de Python para UNIX.

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

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

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

    • requirements.txt

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

    $ pip freeze > requirements.txt
    

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

    $ 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.

    Implementar en Heroku a través de GitHub

    Si bien Heroku ofrece su propia plataforma Git que podemos usar para nuestras implementaciones, no es tan rica en 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 seguir adelante y crear un repositorio de GitHub y empuja nuestro código.

    Para referencia, aquí está una aplicación de muestra de Django en GitHub que está listo para su implementación en Heroku.

    Con nuestro trabajo listo en GitHub, vayamos a Heroku y creemos una nueva canalización usando el botón “Nuevo” en la parte superior derecha de nuestro panel de Heroku.

    Proporcionamos el nombre de nuestra canalización y el repositorio de GitHub al que conectarse:

    Una canalización 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, preparación y desarrollo al mismo tiempo, todo desde GitHub.

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

    Por ejemplo, el código de nuestra rama “maestra” se implementará en el entorno de producción, la rama “staging” en nuestro entorno de ensayo y la rama “dev” en nuestro entorno de desarrollo.

    Esto nos da visibilidad sobre nuestro proyecto en 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 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:

    La canalización tiene dos etapas por defecto y una sección para habilitar aplicaciones de revisión. Dado que todo nuestro código reside actualmente en la rama “maestra”, sigamos adelante e implementemos la rama haciendo clic en “Agregar aplicación” en la etapa de producción:

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

    Esto resulta en:

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

    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 viendo los registros y una vez que la aplicación esté implementada, recibiremos un enlace a nuestra aplicación en ejecución:

    Al final de los registros, hay un enlace a nuestra aplicación en ejecución. Cuando accedemos al enlace, somos recibidos por nuestra página de destino de Django:

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

    Comenzaremos creando una rama “provisional” en GitHub a través de la terminal:

    $ 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 “provisional” a la rama “maestra”.

    Se puede ver la solicitud de extracción aquí en GitHub, y este es el resultado de nuestra canalización de Heroku:

    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:

    Nuestra solicitud de extracción se implementó con éxito 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 ha implementado 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 Dockerized en Heroku en el documentación oficial. Heroku también proporciona una plataforma Git que se puede utilizar para implementar aplicaciones junto con su herramienta CLI.

    Con la integración a 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 plugins a través de un mercado.

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

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

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

    .

    Etiquetas:

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *