Selaa lähdekoodia

Setup de Celery con RabbitMQ y Django.

Tomas Ponce Gessi 3 vuotta sitten
vanhempi
commit
5ca1142dad

+ 17 - 0
.env.dev

@@ -0,0 +1,17 @@
+# For DJANGO APP:
+DB_NAME=programmed-reports
+DB_USER=user-preports
+DB_PASSWORD=pass-preports
+# For Postgres DB:
+POSTGRES_DB=programmed-reports
+POSTGRES_USER=user-preports
+POSTGRES_PASSWORD=pass-preports
+TZ=GMT+3
+# En local se deben conectar los containers a la misma red,
+# Idealmente en una red dedicada solo para microservicios
+# Reemplazar con la URL real en produccion
+CLIMA_URL=http://172.29.0.3:8080
+# Broker Syntax: amqp://user:password@host:port/vhost
+CELERY_BROKER_URL=amqp://guest:guest@rabbitmq:5672
+CELERY_RESULT_BACKEND=django-db
+CELERY_CACHE_BACKEND=django-cache

+ 1 - 1
app/api/migrations/0001_initial.py

@@ -1,4 +1,4 @@
-# Generated by Django 4.0.4 on 2022-09-20 19:13
+# Generated by Django 4.0.4 on 2022-09-23 17:24
 
 import api.validators
 from django.db import migrations, models

+ 6 - 0
app/api/tasks.py

@@ -0,0 +1,6 @@
+from preports.celery import app
+
+
+@app.task
+def send_due_reports():
+    return 1

+ 3 - 0
app/preports/__init__.py

@@ -0,0 +1,3 @@
+from .celery import app as celery_app
+
+__all__ = ['celery_app']

+ 14 - 0
app/preports/celery.py

@@ -0,0 +1,14 @@
+from celery import Celery
+import os
+
+os.environ.setdefault("DJANGO_SETTINGS_MODULE", "preports.settings")
+app = Celery('preports')
+app.config_from_object("django.conf:settings", namespace="CELERY")
+app.autodiscover_tasks()
+
+
+@app.on_after_finalize.connect
+def setup_periodical_tasks(sender, **kwargs):
+    from api.tasks import send_due_reports
+    sender.add_periodic_task(10.0, send_due_reports.s(),
+                             name="Send due Programmed Reports.")

+ 5 - 2
app/preports/settings.py

@@ -39,6 +39,7 @@ INSTALLED_APPS = [
     'django.contrib.messages',
     'django.contrib.staticfiles',
     'rest_framework',
+    'django_celery_results',
     'api'
 ]
 
@@ -76,7 +77,7 @@ WSGI_APPLICATION = 'preports.wsgi.application'
 # Database
 # https://docs.djangoproject.com/en/4.0/ref/settings/#databases
 
-DATABASES =  {
+DATABASES = {
     'default': {
         'NAME': os.getenv("DB_NAME"),
         'ENGINE': 'django.db.backends.postgresql',
@@ -127,4 +128,6 @@ STATIC_URL = 'static/'
 
 DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
 
-CLIMA_URL = os.getenv("CLIMA_URL")
+CLIMA_URL = os.getenv("CLIMA_URL")
+CELERY_BROKER_URL = os.getenv("CELERY_BROKER_URL")
+CELERY_RESULT_BACKEND = os.getenv("CELERY_RESULT_BACKEND")

+ 2 - 0
app/requirements.txt

@@ -13,3 +13,5 @@ requests==2.27.1
 sqlparse==0.4.2
 urllib3==1.26.9
 zipp==3.8.0
+celery==5.2.7
+django-celery-results==2.4.0

+ 39 - 13
docker-compose.yml

@@ -7,22 +7,48 @@ services:
       dockerfile: ./Dockerfile
     ports:
       - "8080:8000"
-    environment:
-      - DB_NAME=programmed-reports
-      - DB_USER=user-preports
-      - DB_PASSWORD=pass-preports
-        # En local se deben conectar los containers a la misma red,
-        # Idealmente en una red dedicada solo para microservicios
-        # Reemplazar con la URL real en produccion
-      - CLIMA_URL=http://172.29.0.3:8080
+    env_file:
+      - ./.env.dev
     volumes:
       - ./app:/app
+    depends_on:
+      - db
   db:
     image: postgres
-    environment:
-      - TZ=GMT+3
-      - POSTGRES_DB=programmed-reports
-      - POSTGRES_USER=user-preports
-      - POSTGRES_PASSWORD=pass-preports
+    env_file:
+      - ./.env.dev
     volumes:
       - ./data/postgres_data:/var/lib/postgresql/data/
+  rabbitmq:
+    image: rabbitmq:3-management
+    container_name: rabbitmq
+    ports:
+      - 5672:5672
+      - 15672:15672
+    volumes:
+      - ./data/rabbitmq/data/:/var/lib/rabbitmq/
+      - ./data/rabbitmq/log/:/var/log/rabbitmq
+  celery_worker:
+    container_name: celery_worker
+    build:
+      context: ./
+    command: celery -A preports.celery worker --loglevel=debug
+    volumes:
+      - ./app:/app
+    env_file:
+      - ./.env.dev
+    depends_on:
+      - db
+      - rabbitmq
+      - app
+  celery_beat:
+    container_name: celery_beat
+    build:
+      context: ./
+    command: celery -A preports.celery beat --loglevel=debug #--scheduler django_celery_beat.schedulers:DatabaseScheduler
+    volumes:
+      - ./app:/app
+    env_file:
+      - ./.env.dev
+    depends_on:
+      - celery_worker