Saltar al contenido principal

Django + Celery

Aprende cómo desplegar tu proyecto Django + Celery usando Sleakops.

Prerrequisitos

Empecemos

Para este ejemplo, vamos a usar este proyecto . Es un proyecto Django con Celery que ya tiene Docker configurado para funcionar. También vamos a configurar una base de datos Postgresql, bucket S3 y Rabbitmq necesarios para este proyecto.

Crear un proyecto

Para empezar, vamos a crear un nuevo proyecto. Para hacer esto, hacemos clic en el botón "Projects" en el panel izquierdo:

click-project-reference

Dentro del panel de Proyectos podrás ver todos los proyectos que tienes y gestionarlos desde aquí. Queremos crear uno nuevo así que hagamos clic en el botón "create" en la parte superior derecha:

click-create-project-reference

En la pantalla de creación de proyecto tenemos los siguientes campos:

ConfiguraciónDescripción
EnvironmentTenemos que seleccionar el ambiente creado previamente.
NodepoolDejaremos el predeterminado.
RepositoriesSeleccionaremos nuestro repositorio que queremos desplegar. En nuestro caso example-django-celery.
Project NamePodemos definir un nombre de proyecto. Para el ejemplo dejaremos el predeterminado.
BranchTiene que coincidir con el que tenemos en nuestro proyecto. En nuestro caso es "Main".
Dockerfile pathEs la ruta relativa al dockerfile en tu proyecto.

Una vez configurado todo eso, creamos el proyecto con el botón "Submit" en la parte inferior derecha:

create-project-reference

Con eso, el proyecto comienza a crearse. Mientras tanto vamos a las cargas de trabajo con el botón "Workloads" en el panel izquierdo:

click-workloads-reference

Crear un Servicio Web

Aquí lo que vamos a hacer es crear un servicio web, así que vamos a la sección de servicio web y creamos uno:

click-create-web-service-reference

En esta página vamos a completar el primer formulario con los siguientes campos:

ConfiguraciónDescripción
ProjectSeleccionamos el proyecto que creamos previamente, en nuestro caso "example-django-celery".
NameDefinimos un nombre para el servicio web.
CommandPor defecto esto tomará el valor que está en el dockerfile, en nuestro caso esto está bien.
PortLo mismo que el command.

Luego continuamos haciendo clic en el botón "Next" hasta el paso 3:

create-web-service-reference

En el paso 3 tenemos que editar el campo path y poner el endpoint de healthcheck que en nuestro caso es "/healthcheck/". Luego hacemos clic en el botón "Next" hasta que se cree el servicio web:

create-web-service-2-reference

Desplegar celery worker

Bueno, con esto podemos ver nuestro servicio web desplegándose. Ahora vamos a desplegar el celery. Para esto tenemos que ir a la sección workers dentro de la misma pantalla de workloads:

click-worker-reference

Y hacemos clic en el botón "Create" para crear uno nuevo:

click-create-worker-reference

En la pantalla de creación de workers tendremos que completar los siguientes campos:

ConfiguraciónDescripción
ProjectSeleccionar el proyecto creado previamente. En nuestro caso "example-django-celery".
NameDefinimos el nombre que le vamos a dar al worker. En nuestro caso "celery".
CommandAquí establecemos el comando para ejecutar celery, en nuestro caso es: bash celery -A core.celery_app worker -l INFO --concurrency 1 --max-tasks-per-child 1 --prefetch-multiplier 1 -n celery@%h --queues default,build,deployment,cluster,canvas,billing

Con estos campos completados haremos clic en el botón "Next" en la parte inferior derecha y luego "Submit" ya que no necesitamos editar nada más:

create-worker-reference

Con esto veremos nuestro celery publicado. Ahora tenemos que configurar los hooks. Para esto vamos a la sección hooks:

click-hook-reference

Crear un hook de migración

En la pantalla de creación de hook tendremos los siguientes campos:

ConfiguraciónDescripción
ProjectSeleccionar el proyecto creado previamente. En nuestro caso "example-django-celery".
NameDefinimos el nombre que le vamos a dar al worker. En nuestro caso "migrations".
CommandAquí establecemos el comando para ejecutar celery, en nuestro caso es: bash python manage.py migrate --no-input

Con estos campos completados haremos clic en el botón "Next" en la parte inferior derecha y luego "Submit" ya que no necesitamos editar nada más:

create-hook-reference

Crear un hook de collect static

Ahora procedemos a crear otro hook que necesitamos para los estáticos:

click-create-collectstatic-hook-reference

En este formulario vamos a hacer lo mismo que el anterior pero modificando el comando. Hacemos clic en next hasta crear el hook (sin modificar nada más):

create-collectstatic-hook-reference

El comando que usamos es el siguiente:

python manage.py collectstatic --no-input

Crear una Base de Datos Postgresql

Una vez que hemos creado los hooks tenemos que ir a crear nuestra base de datos. Para hacer esto vamos a la sección "Dependencies":

click-dependencies-reference

Dentro de esta sección hacemos clic en el botón "Create" en la parte superior derecha y luego seleccionamos "Postgresql":

click-create-dependencies-reference
click-postgresql-reference

En el 1er formulario de creación de postgresql tendremos que seleccionar nuestro proyecto creado previamente y definir un nombre para él, luego hacemos clic en el botón "Next" en la parte inferior derecha:

create-postgresql-reference

En el 2do formulario vamos a tener muchos campos, los únicos que nos importan son los siguientes:

ConfiguraciónDescripción
Database Master UsernameAquí asignamos un nombre de usuario root a nuestra base de datos.
Database Master PasswordUna contraseña para este usuario root.

Una vez rellenados estos campos, estamos listos para continuar. Haga clic en el botón «Siguiente» situado en la parte inferior derecha para pasar al tercer formulario:

create-postgresql-2-reference

En este último formulario, vamos a ajustar las variables de entorno que tenemos en nuestro proyecto con respecto a la base de datos. Para ello, debemos cambiar las siguientes variables por las nuestras propias:

AntesDespues
*_POSTGRESQL_NAMEDB_NAME
*_POSTGRESQL_USERNAMEDB_USER
*_POSTGRESQL_PASSWORDDB_PASSWORD
*_POSTGRESQL_ADDRESSDB_HOST
*_POSTGRESQL_PORTDB_PORT

Debería verse similar a la imagen de abajo. A continuación, haga clic en el botón «Enviar» y se creará su base de datos:

create-postgresql-3-reference

Crear Bucket S3

En la misma página de dependencias tenemos que crear nuestro bucket s3, para ello vamos a ir al botón "Create" nuevamente:

click-create-s3-dependencies-reference

Y seleccionamos S3 Bucket:

click-create-s3-dependencies-2-reference

En el primer formulario tenemos que seleccionar nuestro proyecto creado previamente y definir un nombre para el bucket, tenemos que tomar en cuenta que el nombre del bucket es global así que tiene que ser único. Ahora hacemos clic en el botón "Next" y vamos al paso 3:

create-s3-dependencies-reference

Aquí vamos a ver algunas variables de entorno definidas para el bucket. Vamos a editar la que dice COLLECTSTATICEXAMPLEDJANGOCELERY_BUCKET_NAME y la vamos a llamar DJANGO_AWS_STORAGE_BUCKET_NAME. Con este simple cambio hacemos clic en el botón "Submit" en la parte inferior derecha para terminar de crear el bucket:

create-s3-dependencies-3-reference

Crear Rabbitmq

Ahora necesitamos una dependencia más. Nuestro Rabbitmq para encolar las tareas de celery, así que vamos a ello:

click-create-rabbitmq-dependencies-reference

Y seleccionamos Rabbitmq:

click-select-rabbitmq-reference

En el primer formulario tendremos que seleccionar nuestro proyecto y definir un nombre para él. Luego hacemos clic en el botón "Next" en la parte inferior derecha:

create-rabbitmq-reference

En el siguiente formulario tenemos varios campos pero los únicos que nos importan para este ejemplo son el username y password, podemos definir lo que queramos. Para este ejemplo elegí admin como username y para la contraseña la generé aleatoriamente con el botón de dado. Luego hacemos clic en el botón "Next" para ir al siguiente formulario:

create-rabbitmq-2-reference

En este último formulario tenemos que cambiar el nombre de la variable que termina en *_BROKER_AUTH_URL a CELERY_BROKER_URL (como se muestra en la imagen). Luego hacemos clic en el botón "Submit" en la parte inferior derecha para terminar de crear rabbitmq:

create-rabbitmq-3-reference

Crear tus variables de entorno

Una vez que las dependencias están desplegadas tenemos que configurar nuestras variables de entorno. Vamos a ir a la sección Vargroups:

click-vargroups-reference

Aquí verás todas tus variables de entorno que creaste agrupadas en grupos, por ejemplo deberías haber creado una con los datos para la base de datos (que es la que ves en la imagen). Ahora vamos a crear otra para nuestras variables de entorno de django, para esto hacemos clic en el botón "Create" en la parte superior derecha:

click-create-vargroups-reference

En este formulario tenemos los siguientes campos:

  • Project: seleccionamos el proyecto que creamos previamente.
  • Workload: Seleccionamos "global" que hace referencia a ser usado por todos nuestros workloads.
  • Name: Definimos un nombre para este grupo de variables.
  • Type: Si queremos cargarlo por archivo o por variable.
  • Vars: Aquí habilitamos el textmode y copiamos las siguientes variables de entorno:
CELERY_RESULT_BACKEND=django-db
DJANGO_ADMIN_URL=admin/
DJANGO_DEBUG=False
DJANGO_SECRET_KEY=secret_key
DJANGO_SETTINGS_MODULE=core.settings.production
DJANGO_STATIC_STORAGE=storages.backends.s3boto3.S3StaticStorage
DB_ENGINE=django.db.backends.postgresql_psycopg2
ENVIRONMENT=production
LOGS_LEVEL=INFO
PYTHONPATH=.

Estas variables de entorno son requeridas para nuestro proyecto de ejemplo. Finalmente hacemos clic en el botón "Submit" en la parte inferior derecha para crear el grupo de variables.

create-vargroup-reference

Despliegues

Como último paso vamos a ver nuestro proyecto desplegado, para esto vamos a la sección "Deployments" del panel izquierdo:

click-deployments-reference

Aquí vamos a ver todos los despliegues que hacemos. En nuestro caso es el primero y podemos ver que se ha creado correctamente, en caso de que veas algún error si haces clic en "error" puedes ver una descripción del mismo. Si no vemos ningún error entonces significa que el proyecto ya está desplegado, podríamos comenzar a usarlo desde la url que nos proporcionó el servicio web.

deployments-reference

Esto concluye nuestro proceso de despliegue de proyecto. Te dejamos un paso opcional que es configurar el ci con github.

Opcional

CI con Github

Cada vez que hagas un cambio en tu código y quieras desplegarlo tendrás que hacer un build y un deploy, esto eventualmente se vuelve tedioso. Por eso para evitar esto tenemos que implementar ci en github.

Para esto vamos a ir a "Projects" en el panel izquierdo:

click-project-2-reference

Ubiquemos nuestro proyecto y hagamos clic en el engranaje para acceder a la configuración del proyecto:

click-settings-project-reference

En la configuración del proyecto ubicamos el que dice "Git pipelines" y hacemos clic en él:

click-git-pipelines-reference

Aquí vamos a encontrar lo que necesitamos para hacer esto. Básicamente necesitamos configurar un archivo en la raíz de nuestro proyecto .github/workflows/ llamado ci_sleakops_demo.yml y en ese archivo vamos a pegar el contenido que aparece en esta página.

git-pipelines-reference

Esto necesita tener una variable de entorno SLEAKOPS_KEY, si no la tienes tienes que ir al enlace que aparece ahí Settings -> CLI, obtenerla y guardarla como una variable de entorno.

Con esto configurado y desplegado cada vez que hagas un push a tu rama "main" se lanzará automáticamente una nueva versión de tu aplicación.