From 60f5dd7b516b03d4fa8df610d428538404991648 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20NICOLE?= Date: Tue, 21 May 2024 20:51:28 +0000 Subject: [PATCH] Support Redis Unix sockets (#16227) * Fixes #15962: support Redis Unix sockets * Clean up language & remove obsolete note --------- Co-authored-by: Jeremy Stretch --- docs/configuration/required-parameters.md | 20 +++++++++++++++----- netbox/netbox/settings.py | 9 ++++++++- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/docs/configuration/required-parameters.md b/docs/configuration/required-parameters.md index bda36599525..90eb8c0cfcb 100644 --- a/docs/configuration/required-parameters.md +++ b/docs/configuration/required-parameters.md @@ -94,15 +94,25 @@ REDIS = { } ``` -!!! note - If you are upgrading from a NetBox release older than v2.7.0, please note that the Redis connection configuration - settings have changed. Manual modification to bring the `REDIS` section inline with the above specification is - necessary - !!! warning It is highly recommended to keep the task and cache databases separate. Using the same database number on the same Redis instance for both may result in queued background tasks being lost during cache flushing events. +### UNIX Socket Support + +Redis may alternatively be configured by specifying a complete URL instead of individual components. This approach supports the use of a UNIX socket connection. For example: + +```python +REDIS = { + 'tasks': { + 'URL': 'unix:///run/redis-netbox/redis.sock?db=0' + }, + 'caching': { + 'URL': 'unix:///run/redis-netbox/redis.sock?db=1' + }, +} +``` + ### Using Redis Sentinel If you are using [Redis Sentinel](https://redis.io/topics/sentinel) for high-availability purposes, there is minimal diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 9be6ac68651..fdae4e2c5bb 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -242,6 +242,7 @@ def _setting(name, default=None): TASKS_REDIS = REDIS['tasks'] TASKS_REDIS_HOST = TASKS_REDIS.get('HOST', 'localhost') TASKS_REDIS_PORT = TASKS_REDIS.get('PORT', 6379) +TASKS_REDIS_URL = TASKS_REDIS.get('URL') TASKS_REDIS_SENTINELS = TASKS_REDIS.get('SENTINELS', []) TASKS_REDIS_USING_SENTINEL = all([ isinstance(TASKS_REDIS_SENTINELS, (list, tuple)), @@ -270,7 +271,7 @@ def _setting(name, default=None): CACHING_REDIS_PROTO = 'rediss' if REDIS['caching'].get('SSL', False) else 'redis' CACHING_REDIS_SKIP_TLS_VERIFY = REDIS['caching'].get('INSECURE_SKIP_TLS_VERIFY', False) CACHING_REDIS_CA_CERT_PATH = REDIS['caching'].get('CA_CERT_PATH', False) -CACHING_REDIS_URL = f'{CACHING_REDIS_PROTO}://{CACHING_REDIS_USERNAME_HOST}:{CACHING_REDIS_PORT}/{CACHING_REDIS_DATABASE}' +CACHING_REDIS_URL = REDIS['caching'].get('URL', f'{CACHING_REDIS_PROTO}://{CACHING_REDIS_USERNAME_HOST}:{CACHING_REDIS_PORT}/{CACHING_REDIS_DATABASE}') # Configure Django's default cache to use Redis CACHES = { @@ -678,6 +679,12 @@ def _setting(name, default=None): 'socket_connect_timeout': TASKS_REDIS_SENTINEL_TIMEOUT }, } +elif TASKS_REDIS_URL: + RQ_PARAMS = { + 'URL': TASKS_REDIS_URL, + 'SSL': TASKS_REDIS_SSL, + 'SSL_CERT_REQS': None if TASKS_REDIS_SKIP_TLS_VERIFY else 'required', + } else: RQ_PARAMS = { 'HOST': TASKS_REDIS_HOST,