From 8808c0155cd4cef6e3c2bc788145a0cf1affac32 Mon Sep 17 00:00:00 2001 From: Gagan Deep Date: Mon, 2 Jun 2025 22:38:18 +0530 Subject: [PATCH 1/5] [feature] Added environment variables for Redis configuration #463 Closes #463 --- docs/user/settings.rst | 38 ++++++++++++++++++++++++++++++ images/common/openwisp/settings.py | 27 ++++++++++++++------- images/common/services.py | 7 ++++++ 3 files changed, 64 insertions(+), 8 deletions(-) diff --git a/docs/user/settings.rst b/docs/user/settings.rst index 9c20368c..a667c20b 100644 --- a/docs/user/settings.rst +++ b/docs/user/settings.rst @@ -460,6 +460,30 @@ framework. - **Valid Values:** ``True``, ``False``. - **Default:** ``False``. +``REDIS_CACHE_URL`` +~~~~~~~~~~~~~~~~~~~ + +- **Explanation:** Redis database URL for Django cache. +- **Valid Values:** STRING. +- **Default:** + ``redis://:@:/0``. + +``CHANNEL_REDIS_URL`` +~~~~~~~~~~~~~~~~~~~~~ + +- **Explanation:** Redis database URL for Django channel's layer. +- **Valid Values:** STRING. +- **Default:** + ``redis://:@:/1``. + +``CELERY_BROKER_URL`` +~~~~~~~~~~~~~~~~~~~~~ + +- **Explanation:** Redis database URL for celery broker. +- **Valid Values:** STRING. +- **Default:** + ``redis://:@:/2``. + DJANGO_LOG_LEVEL ~~~~~~~~~~~~~~~~ @@ -1044,6 +1068,13 @@ Misc Services - **Valid Values:** INTEGER. - **Default:** ``6379``. +``REDIS_USER`` +~~~~~~~~~~~~~~ + +- **Explanation:** Redis username, optional. +- **Valid Values:** STRING. +- **Default:** ``""`` (empty string). + ``REDIS_PASS`` ~~~~~~~~~~~~~~ @@ -1051,6 +1082,13 @@ Misc Services - **Valid Values:** STRING. - **Default:** ``None``. +``REDIS_USE_TLS`` +~~~~~~~~~~~~~~~~~ + +- **Explanation:** Whether to use TLS for redis connection. +- **Valid Values:** ``True``, ``False``. +- **Default:** ``False``. + ``DASHBOARD_APP_SERVICE`` ~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/images/common/openwisp/settings.py b/images/common/openwisp/settings.py index 0260bde1..42b7beea 100644 --- a/images/common/openwisp/settings.py +++ b/images/common/openwisp/settings.py @@ -2,6 +2,7 @@ import logging import os import sys +from urllib.parse import quote import tldextract from openwisp.utils import ( @@ -138,17 +139,27 @@ REDIS_HOST = os.environ["REDIS_HOST"] REDIS_PORT = os.environ.get("REDIS_PORT", 6379) +REDIS_USER = os.environ.get("REDIS_USER") REDIS_PASS = os.environ.get("REDIS_PASS") +REDIS_SCHEME = ( + "rediss" if env_bool(os.environ.get("REDIS_USE_TLS", "False")) else "redis" +) -if not REDIS_PASS: - CHANNEL_REDIS_HOST = f"redis://{REDIS_HOST}:{REDIS_PORT}/1" -else: - CHANNEL_REDIS_HOST = f"redis://:{REDIS_PASS}@{REDIS_HOST}:{REDIS_PORT}/1" +# Build base Redis URL -if not REDIS_PASS: - CELERY_BROKER_URL = f"redis://{REDIS_HOST}:{REDIS_PORT}/2" +if REDIS_USER and REDIS_PASS: + credentials = f"{quote(REDIS_USER)}:{quote(REDIS_PASS)}@" +elif REDIS_PASS: + # Password only + credentials = f":{quote(REDIS_PASS)}@" else: - CELERY_BROKER_URL = f"redis://:{REDIS_PASS}@{REDIS_HOST}:{REDIS_PORT}/2" + credentials = "" +REDIS_BASE_URL = f"{REDIS_SCHEME}://{credentials}{REDIS_HOST}:{REDIS_PORT}" + +REDIS_CACHE_URL = os.environ.get("REDIS_CACHE_URL", f"{REDIS_BASE_URL}/0") +CHANNEL_REDIS_HOST = os.environ.get("CHANNEL_REDIS_URL", f"{REDIS_BASE_URL}/1") +CELERY_BROKER_URL = os.environ.get("CELERY_BROKER_URL", f"{REDIS_BASE_URL}/2") + CELERY_TASK_ACKS_LATE = True CELERY_WORKER_PREFETCH_MULTIPLIER = 1 CELERY_BROKER_TRANSPORT_OPTIONS = {"max_retries": 10} @@ -203,7 +214,7 @@ CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", - "LOCATION": f"redis://{REDIS_HOST}:{REDIS_PORT}/0", + "LOCATION": REDIS_CACHE_URL, "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", }, diff --git a/images/common/services.py b/images/common/services.py index 8569e7bd..ce962bbd 100644 --- a/images/common/services.py +++ b/images/common/services.py @@ -47,12 +47,19 @@ def dashboard_status(): def redis_status(): kwargs = {} + redis_user = os.environ.get("REDIS_USER") redis_pass = os.environ.get("REDIS_PASS") redis_port = os.environ.get("REDIS_PORT", 6379) + redis_use_tls = os.environ.get("REDIS_USE_TLS", "False").lower() == "true" + + if redis_user: + kwargs["username"] = redis_user if redis_pass: kwargs["password"] = redis_pass if redis_port: kwargs["port"] = redis_port + if redis_use_tls: + kwargs["ssl"] = redis_use_tls rs = redis.Redis(os.environ["REDIS_HOST"], **kwargs) try: rs.ping() From a515c07888f3f315d1625e00bfeca23e813769cd Mon Sep 17 00:00:00 2001 From: Federico Capoano Date: Tue, 3 Jun 2025 16:49:50 -0300 Subject: [PATCH 2/5] [docs] Update docs/user/settings.rst --- docs/user/settings.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/user/settings.rst b/docs/user/settings.rst index a667c20b..b99d160d 100644 --- a/docs/user/settings.rst +++ b/docs/user/settings.rst @@ -463,7 +463,7 @@ framework. ``REDIS_CACHE_URL`` ~~~~~~~~~~~~~~~~~~~ -- **Explanation:** Redis database URL for Django cache. +- **Explanation:** Allows freely redefining the Redis database URL for the Django cache. - **Valid Values:** STRING. - **Default:** ``redis://:@:/0``. From 91622b55d39556bb1d6d0b00a1ed1207aa73ede7 Mon Sep 17 00:00:00 2001 From: Federico Capoano Date: Tue, 3 Jun 2025 16:49:59 -0300 Subject: [PATCH 3/5] [docs] Update docs/user/settings.rst --- docs/user/settings.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/user/settings.rst b/docs/user/settings.rst index b99d160d..6edf270d 100644 --- a/docs/user/settings.rst +++ b/docs/user/settings.rst @@ -471,7 +471,7 @@ framework. ``CHANNEL_REDIS_URL`` ~~~~~~~~~~~~~~~~~~~~~ -- **Explanation:** Redis database URL for Django channel's layer. +- **Explanation:** Allows freely redefining the Redis database URL for Django Channels' layer. - **Valid Values:** STRING. - **Default:** ``redis://:@:/1``. From 55fc5cce67d9429f3c8407fe8803573395aca2f8 Mon Sep 17 00:00:00 2001 From: Federico Capoano Date: Tue, 3 Jun 2025 16:50:08 -0300 Subject: [PATCH 4/5] [docs] Update docs/user/settings.rst --- docs/user/settings.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/user/settings.rst b/docs/user/settings.rst index 6edf270d..8e57f194 100644 --- a/docs/user/settings.rst +++ b/docs/user/settings.rst @@ -479,7 +479,7 @@ framework. ``CELERY_BROKER_URL`` ~~~~~~~~~~~~~~~~~~~~~ -- **Explanation:** Redis database URL for celery broker. +- **Explanation:** Allows freely redefining the Redis database URL for the Celery broker. - **Valid Values:** STRING. - **Default:** ``redis://:@:/2``. From 19864492e4960f2258ab20cc3008ad118f0adbc7 Mon Sep 17 00:00:00 2001 From: Federico Capoano Date: Tue, 3 Jun 2025 19:39:55 -0300 Subject: [PATCH 5/5] [qa] QA format settings.rst --- docs/user/settings.rst | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/user/settings.rst b/docs/user/settings.rst index 8e57f194..da816f0e 100644 --- a/docs/user/settings.rst +++ b/docs/user/settings.rst @@ -463,7 +463,8 @@ framework. ``REDIS_CACHE_URL`` ~~~~~~~~~~~~~~~~~~~ -- **Explanation:** Allows freely redefining the Redis database URL for the Django cache. +- **Explanation:** Allows freely redefining the Redis database URL for the + Django cache. - **Valid Values:** STRING. - **Default:** ``redis://:@:/0``. @@ -471,7 +472,8 @@ framework. ``CHANNEL_REDIS_URL`` ~~~~~~~~~~~~~~~~~~~~~ -- **Explanation:** Allows freely redefining the Redis database URL for Django Channels' layer. +- **Explanation:** Allows freely redefining the Redis database URL for + Django Channels' layer. - **Valid Values:** STRING. - **Default:** ``redis://:@:/1``. @@ -479,7 +481,8 @@ framework. ``CELERY_BROKER_URL`` ~~~~~~~~~~~~~~~~~~~~~ -- **Explanation:** Allows freely redefining the Redis database URL for the Celery broker. +- **Explanation:** Allows freely redefining the Redis database URL for the + Celery broker. - **Valid Values:** STRING. - **Default:** ``redis://:@:/2``.