From 9aa26662c7f1cce262e6f0b21295656d9dada6bf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Bedna=C5=99=C3=ADk?= <jan.bednarik@gmail.com>
Date: Mon, 4 Apr 2022 14:13:44 +0200
Subject: [PATCH] Celery setup improvements

---
 Dockerfile             | 1 -
 Makefile               | 4 ++++
 README.md              | 8 ++++++++
 majak/settings/base.py | 6 ++++--
 4 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/Dockerfile b/Dockerfile
index d33c43fc..08b4f2b3 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -29,7 +29,6 @@ ENV DJANGO_SETTINGS_MODULE "majak.settings.production"
 # fake values for required env variables used to run collectstatic during build
 RUN DJANGO_SECRET_KEY=x DATABASE_URL=postgres://x/x DJANGO_ALLOWED_HOSTS=x \
     OIDC_RP_CLIENT_ID=x OIDC_RP_CLIENT_SECRET=x OIDC_RP_REALM_URL=x \
-    CELERY_BROKER_URL=x CELERY_RESULT_BACKEND=x \
     python manage.py collectstatic
 
 EXPOSE 8000
diff --git a/Makefile b/Makefile
index ca0bade0..bd5c9df7 100644
--- a/Makefile
+++ b/Makefile
@@ -15,6 +15,7 @@ help:
 	@echo "Application:"
 	@echo "  run            Run the application on port ${PORT}"
 	@echo "  shell          Run Django shell"
+	@echo "  worker         Run Celery worker"
 	@echo ""
 	@echo "Database:"
 	@echo "  migrations     Generate migrations"
@@ -44,6 +45,9 @@ run: venv
 shell: venv
 	${VENV}/bin/python manage.py shell_plus
 
+worker: venv
+	${VENV}/bin/celery -A majak worker --pool solo -E -l INFO
+
 migrations: venv
 	${VENV}/bin/python manage.py makemigrations
 
diff --git a/README.md b/README.md
index 8a340ac5..8e1ae0be 100644
--- a/README.md
+++ b/README.md
@@ -100,6 +100,7 @@ Appka přidává management command `update_callendars`, který stahuje a updatu
 kalendáře. Je třeba ho pravidelně volat na pozadí (přes CRON).
 
 ### Celery (Import z Jekyllu)
+
 Import z Jekyll GitHub repozitářů pirátských webů je řešen asynchroně přes Celery.
 Celery využívá Redis, který může běžet např. lokálně, typicky 6379:
 V envu pak je pak potřeba mít nastavený Celery broker:
@@ -110,10 +111,15 @@ CELERY_RESULT_BACKEND=redis://localhost:6379/6
 ```
 
 Aby se celery tasky vykonávaly, je potřeba pustit celery v terminálu:
+
 ```
 celery -A majak worker
 ```
 
+Pokud není zadán `CELERY_BROKER_URL`, tak se automaticky nastaví
+`CELERY_TASK_ALWAYS_EAGER = True`, čímž se tasky vykonají synchronně přímo v
+procesu webserveru.
+
 ### Stránka 404
 
 Pokud je třeba vlastní 404 pro web, stačí do kořenové `xxxHomePage` webu
@@ -142,6 +148,8 @@ V produkci musí být navíc nastaveno:
 | --- | --- | --- |
 | `DJANGO_SECRET_KEY` | | tajný šifrovací klíč |
 | `DJANGO_ALLOWED_HOSTS` | | allowed hosts (více hodnot odděleno čárkami) |
+| `CELERY_BROKER_URL` | | URL pro Celery Broker |
+| `CELERY_RESULT_BACKEND` | | URL pro Celery Result Backend |
 
 Různé:
 
diff --git a/majak/settings/base.py b/majak/settings/base.py
index 14e6a7ac..8025d23f 100644
--- a/majak/settings/base.py
+++ b/majak/settings/base.py
@@ -192,8 +192,10 @@ CACHES["renditions"]["TIMEOUT"] = 60 * 60 * 24
 
 # CELERY
 # ------------------------------------------------------------------------------
-CELERY_BROKER_URL = env.str("CELERY_BROKER_URL")
-CELERY_RESULT_BACKEND = env.str("CELERY_RESULT_BACKEND")
+CELERY_BROKER_URL = env.str("CELERY_BROKER_URL", default="")
+if not CELERY_BROKER_URL:
+    CELERY_TASK_ALWAYS_EAGER = True
+CELERY_RESULT_BACKEND = env.str("CELERY_RESULT_BACKEND", default="")
 CELERY_ACCEPT_CONTENT = ["application/json"]
 CELERY_RESULT_SERIALIZER = "json"
 CELERY_TASK_SERIALIZER = "json"
-- 
GitLab