Esta es la tercera entrega de una serie sobre cómo aprovechar pydantic para proyectos basados en Django. La Parte 1 se centró en el uso de pydantic de sugerencias de tipo Python para optimizar la gestión de la configuración de Django; la parte 2 creó una aplicación sobre este concepto con Docker y conda para mostrar cómo alinear el desarrollo y la producción entornos.
La implementación del código fuente, y la reimplementación después de las actualizaciones, puede ser un proceso frustrante que lo deja con el corazón roto. Después de tantas malas relaciones con otras plataformas de implementación, me siento afortunado de haber encontrado una felicidad duradera con Django y Heroku. Quiero compartir los secretos de mi éxito a través de un ejemplo cuidadosamente seleccionado.
Queremos desplegar nuestro Django aplicación y asegúrese de que sea fácil y seguro de forma predeterminada. Heroku proporciona una relación sin estrés con nuestra plataforma de aplicaciones al combinar eficiencia y seguridad.
Ya hemos construido una muestra. hello-visitor
aplicación en parte 2 de esta serie de tutoriales de Django y pydantic y discutimos cómo nuestro entorno de desarrollo debe reflejar nuestra configuración de producción usando pydantic. Esta duplicación eliminó un riesgo appreciable de nuestro proyecto.
La tarea restante es hacer que nuestra aplicación esté disponible en la internet usando Heroku. Nota: Para completar este tutorial, debe registrarse para obtener una cuenta de plan Eco en Heroku.
Descripción normal de Heroku
Heroku es un Plataforma como servicio, y sirve aplicaciones. Esas aplicaciones, llamadas aplicaciones, combinan los requisitos de nuestro sistema y el código fuente. Para poner nuestra aplicación en Heroku, debemos crear un slug de Heroku, una imagen de la aplicación que combina nuestra configuración, complementos y más para crear una versión implementable. Las babosas de Heroku son comparable a las imágenes de Docker.
Heroku pasa por una canalización bien orquestada con estos pasos:
- Paso de construcción:
- Heroku inspecciona la fuente de nuestra aplicación y determina qué tecnologías se requieren.
- Heroku construye la imagen del sistema base requerida para nuestra aplicación utilizando un paquete de compilaciónque en este caso es heroku/pitón.
- La imagen resultante se llama babosa en Heroku.
- Paso de liberación:
- Heroku nos permite realizar trabajos previos a la implementación o realizar varias comprobaciones en nuestro sistema, configuraciones o datos.
- Las migraciones de bases de datos son comunes durante este paso.
- Paso de tiempo de ejecución:
- Heroku convierte nuestras imágenes en contenedores livianos llamados dynos y los conecta a nuestro servicios complementariospor ejemplo, una base de datos.
- Uno o más dynos constituyen la infraestructura de nuestro sistema, incluidos los requeridos enrutadores para habilitar la comunicación intra-dyno.
- Las solicitudes HTTP entrantes también caen dentro de las responsabilidades del enrutador, donde el tráfico se vincula a los dinamómetros del servidor internet apropiados.
- El escalamiento horizontal es easy porque Heroku permite el aprovisionamiento dinámico de dynos en función de la carga.
Ahora que entendemos cómo funciona Heroku y su terminología básica, mostraremos lo sencillo que es implementar nuestra aplicación de muestra.
Instalar la CLI de Heroku
Necesitamos la interfaz de línea de comandos de Heroku instalado en la zona. El uso de la instalación instantánea estándar lo simplifica: lo demostraremos en una máquina de desarrollo de Ubuntu. La documentación de Heroku proporciona pasos adicionales para instalar su conjunto de herramientas en otras plataformas.
sudo snap set up --classic heroku
# verify that it really works
heroku --version
Debemos configurar nuestras herramientas Heroku locales con nuestras credenciales a través de la paso de autenticación:
heroku login
Esto guardará nuestra dirección de correo electrónico y un token API en el ~/.netrc
archivo para uso futuro.
Crear aplicación Heroku
Con Heroku instalado, creando nuestra aplicación es el paso inicial hacia la implementación de nuestro código fuente. Esta aplicación no solo apunta a nuestro repositorio de código fuente, sino que también enumera qué complementos necesitamos.
Una nota crítica sobre la implementación de Heroku es que cada aplicación debe tener un nombre único para cada persona que usa Heroku. Por lo tanto, no podemos usar un solo nombre de ejemplo mientras seguimos estos pasos. Elija un nombre que lo haga feliz e inclúyalo en el bloque de instrucciones a lo largo de este tutorial. Nuestras capturas de pantalla mostrarán el nombre de la aplicación como hello-visitor
pero a medida que siga, su nombre elegido de forma exclusiva aparecerá en esas ubicaciones.
Usamos el comando de andamiaje básico de Heroku para crear nuestra aplicación:
heroku apps:create <UNIQUE-APP-NAME-HERE>
El complemento de PostgreSQL
Nuestra aplicación requiere una base de datos relacional para nuestro proyecto Django, como se menciona en parte 2 de nuestra serie. Configuramos los complementos necesarios a través de la interfaz del navegador Heroku con los siguientes pasos:
- Navegue a la pestaña Recursos en el panel de management de Heroku para configurar complementos.
- Pídele a Heroku que instale Postgres, específicamente heroku-postgresql.
- Elija el plan adicional Mini.
- Asocie este complemento con nuestra aplicación de nombre único.
- Haga clic en Enviar formulario de pedido.
Una vez postgresql ha sido aprovisionado y asociado con nuestra aplicación, podemos ver la cadena de conexión de nuestra base de datos en las variables de configuración de nuestra aplicación. Para demostrar esto, navegamos a Configuración y hacemos clic en Revelar Vars de configuración, donde vemos una variable DATABASE_URL
:
DATABASE_URL=postgres://{person}:{password}@{hostname}:{port}/{database-name}
Como se explica en las partes 1 y 2 de nuestra serie, el poder inherente a nuestra aplicación proviene del uso elegante de pydantico y Variables de entorno. Heroku hace que sus Config Vars estén disponibles en el entorno de la aplicación automáticamente, lo que significa que nuestro código no requiere ningún cambio para alojarlo en nuestro entorno de producción. No exploraremos cada configuración en detalle, pero dejaremos esto como un ejercicio para usted.
Configuración de nuestra canalización de aplicaciones
Cuando presentamos Heroku anteriormente, detallamos los pasos clave en su proceso que se necesitan para crear, configurar e implementar una aplicación. Cada uno de estos pasos tiene archivos asociados que contienen la configuración y los comandos apropiados.
Configurar el paso de compilación
Necesitamos decirle a Heroku qué pila de tecnología usar. Nuestra aplicación usa Python y un conjunto de dependencias requeridas, como se indica en es necessities.txt
archivo. Si queremos que nuestra aplicación use una versión reciente de Python (actualmente la versión predeterminada es la 3.10.4), Heroku no requiere que identifiquemos explícitamente qué versión de Python usar para el paso de compilación. Por lo tanto, omitiremos la configuración de compilación explícita por ahora.
Configurar el paso de liberación
El paso de lanzamiento de Heroku, realizado antes de la implementación, tiene un comando asociado especificado en nuestra aplicación hello-visitor/Procfile
. Seguimos las mejores prácticas al crear un comando de shell separado que enumera los comandos o scripts dependientes que queremos ejecutar. Heroku siempre leerá el hello-visitor/Procfile
archivo y ejecutar su contenido.
Todavía no tenemos un script al que hacer referencia en ese archivo, así que vamos a crear nuestro script de shell de lanzamiento, hello-visitor/heroku-release.sh
y solicite a Heroku que asegure nuestra implementación y realice migraciones de bases de datos automáticamente con el siguiente texto:
# file: hello-visitor/heroku-release.sh
cd src
python handle.py verify --deploy --fail-level WARNING
python handle.py migrate
Al igual que con cualquier script de shell creado por el usuario, debemos asegurarnos de que sea ejecutable. El siguiente comando hace que nuestro script sea ejecutable en distribuciones Unix:
chmod +x heroku-release.sh
Ahora que hemos escrito nuestro script de lanzamiento, lo agregamos a nuestra aplicación hello-visitor/Procfile
para que se ejecute durante el lanzamiento. Nosotros creamos el Procfile
y agrega el siguiente contenido:
# file: hello-visitor/Procfile
launch: ./heroku-release.sh
El paso de lanzamiento completamente configurado deja solo la definición del paso de implementación antes de que podamos realizar una implementación de prueba.
Configurar el paso de implementación
Configuraremos nuestra aplicación para iniciar un servidor internet con dos nodos trabajadores.
Como hicimos en nuestra sección de lanzamiento, seguiremos las mejores prácticas y crearemos un script de shell separado que contenga las operaciones de implementación. Llamaremos a este script de implementación heroku-web.sh
y créalo en el directorio raíz de nuestro proyecto con los siguientes contenidos:
# file: hello-visitor/heroku-web.sh
cd src
gunicorn hello_visitor.wsgi --workers 2 --log-file -
Nos aseguramos de que nuestro script sea ejecutable cambiando sus indicadores del sistema con el siguiente comando:
chmod +x heroku-web.sh
Ahora que hemos creado nuestro script de implementación ejecutable, actualizamos nuestra aplicación Procfile
para que el paso de implementación se ejecute en la fase adecuada:
# file: hello-visitor/Procfile
launch: ./heroku-release.sh
internet: ./heroku-web.sh
Nuestra aplicación Heroku tubería ahora está definido. El siguiente paso es preparar las variables de entorno utilizadas por nuestro código fuente porque esto sigue en orden la pantalla de definición de la aplicación Heroku. Sin estas variables de entorno, nuestra implementación fallará porque nuestro código fuente depende de ellas.
Variables de entorno
Django requiere una clave secreta, SECRET_KEY
, para operar correctamente. Esta clave se almacenará, junto con otras variables, en la colección de variables de entorno asociada de nuestra aplicación. Antes de configurar completamente nuestras variables de entorno, generemos nuestra clave secreta. Debemos asegurarnos de que no haya caracteres especiales en esta clave codificándola con base64 (y no con UTF-8). base64 no contiene caracteres no alfanuméricos (p. ej., +, @) que pueden generar resultados inesperados cuando los secretos se proporcionan como variables de entorno. Generar el SECRET_KEY
con el siguiente comando Unix:
openssl rand -base64 70
Con esta clave en la mano, ahora podemos configurar nuestras variables de entorno como Config Vars de Heroku.
Anteriormente, analizamos la cadena de conexión de la base de datos en el panel de administración de Config Vars. Ahora debemos navegar a este panel de administración para agregar variables y valores específicos:
Llave |
Valor |
---|---|
|
|
|
(Use el valor clave generado) |
|
|
|
|
En este punto, nuestra aplicación Heroku tiene todos los pasos de la canalización de implementación configurados y nuestras variables de entorno establecidas. El último paso de configuración apunta a Heroku a nuestro repositorio de código fuente.
Repositorio GitHub
Ahora le pedimos a Heroku que asociar nuestra aplicación con nuestro repositorio de GitHub con las siguientes instrucciones:
- Vaya a la pestaña Implementar en el panel de management de Heroku.
- Autenticar nuestra cuenta de Heroku con GitHub (solo se hace una vez).
- Vaya al panel de administración de nuestra aplicación Heroku.
- En el menú desplegable Método de implementación, seleccione GitHub. Heroku luego mostrará una lista de proyectos disponibles en nuestra cuenta de GitHub.
- Seleccionamos nuestro repositorio de GitHub.
- Heroku se conecta al repositorio de GitHub.
Después de eso, nuestro tablero debería verse así:
Ahora podemos implementar manualmente nuestra aplicación navegando a la sección de implementación handbook, seleccionando nuestro repositorio fundamental
sucursal y haciendo clic en el botón Implementar sucursal.
Si todo va bien, nuestra implementación se completará correctamente utilizando nuestros scripts de compilación y lanzamiento definidos e implementará el sitio internet.
Una prueba de funcionamiento
Podemos probar la aplicación implementada haciendo clic en el botón Abrir aplicación en la parte superior del panel de la aplicación Heroku.
La página internet mostrará el número de visitantes del sitio, que aumenta cada vez que actualiza la página.
Despliegues de aplicaciones Django más fluidos
En mi opinión, este despliegue no podría ser más sencillo. Los pasos de configuración no son engorrosos, y el paquete de compilación principal de Heroku, cuidadosamente acunado por la plataforma Heroku, hace casi todo el trabajo pesado. Mejor aún, el núcleo Paquete de compilación Heroku Python es de código abierto y muchas otras plataformas de aplicaciones lo utilizan. Entonces, el enfoque que ha aprendido en este tutorial es una habilidad altamente transferible.
Cuando combinamos la facilidad de implementación con la magia del entorno reflejado y la administración de configuraciones dinámicas, tenemos una implementación estable e independiente del entorno que funciona localmente y en la internet.
Al seguir este enfoque de administración de configuración de Django, termina con un solo settings.py
que se configura a sí mismo usando variables de entorno.
El Weblog de Ingeniería de Toptal extiende su agradecimiento a Esteban Davidson por revisar y realizar pruebas beta de los ejemplos de código presentados en este artículo.