Implement Unix-Sockets for Redis #3486

Closed
opened 2025-12-29 18:29:27 +01:00 by adam · 2 comments
Owner

Originally created by @est-it on GitHub (Mar 18, 2020).

Environment

  • Python version: 3.7.3
  • NetBox version: 2.7.10

Proposed Functionality

Implement unix-socket support for Redis cache and webhook

Use Case

When Redis is installed on the same Server as netbox, then the possible usage of unix sockets for redis would be nice. When using unix sockets, there is no need for localhost loopback with the whole IP-Stack. The usage with unix sockets can improve the performance too (even if it doesn't matter).

Database Changes

No DB-Changes needed. Just some small changes in settings.py and configuration.py

External Dependencies

Just a possible example:

Changes in configuration.py:

REDIS = {
    'webhooks': {
        'HOST': '/var/run/redis/redis-server.sock',
        'PORT': 0,
        # Comment out `HOST` and `PORT` lines and uncomment the following if using Redis Sentinel       
        # 'SENTINELS': [('mysentinel.redis.example.com', 6379)],
        # 'SENTINEL_SERVICE': 'netbox',
        'PASSWORD': '',
        'DATABASE': 0,
        'DEFAULT_TIMEOUT': 300,
        'SSL': False,
        'USE_SOCKET': True,
    },
    'caching': {
        'HOST': '/var/run/redis/redis-server.sock',
        'PORT': 0,
        # Comment out `HOST` and `PORT` lines and uncomment the following if using Redis Sentinel       
        # 'SENTINELS': [('mysentinel.redis.example.com', 6379)],
        # 'SENTINEL_SERVICE': 'netbox',
        'PASSWORD': '',
        'DATABASE': 1,
        'DEFAULT_TIMEOUT': 300,
        'SSL': False,
        'USE_SOCKET': True,
    }
}

Changes in settings.py:

#
# Redis
#

if 'webhooks' not in REDIS:
    raise ImproperlyConfigured(
        "REDIS section in configuration.py is missing webhooks subsection."
    )
if 'caching' not in REDIS:
    raise ImproperlyConfigured(
        "REDIS section in configuration.py is missing caching subsection."
    )

WEBHOOKS_REDIS = REDIS.get('webhooks', {})
WEBHOOKS_REDIS_HOST = WEBHOOKS_REDIS.get('HOST', 'localhost')
WEBHOOKS_REDIS_PORT = WEBHOOKS_REDIS.get('PORT', 6379)
WEBHOOKS_REDIS_SENTINELS = WEBHOOKS_REDIS.get('SENTINELS', [])
WEBHOOKS_REDIS_USING_SENTINEL = all([
    isinstance(WEBHOOKS_REDIS_SENTINELS, (list, tuple)),
    len(WEBHOOKS_REDIS_SENTINELS) > 0
])
WEBHOOKS_REDIS_SENTINEL_SERVICE = WEBHOOKS_REDIS.get('SENTINEL_SERVICE', 'default')
WEBHOOKS_REDIS_PASSWORD = WEBHOOKS_REDIS.get('PASSWORD', '')
WEBHOOKS_REDIS_DATABASE = WEBHOOKS_REDIS.get('DATABASE', 0)
WEBHOOKS_REDIS_DEFAULT_TIMEOUT = WEBHOOKS_REDIS.get('DEFAULT_TIMEOUT', 300)
WEBHOOKS_REDIS_SSL = WEBHOOKS_REDIS.get('SSL', False)
WEBHOOKS_REDIS_SOCKET = WEBHOOKS_REDIS.get('USE_SOCKET', False)


CACHING_REDIS = REDIS.get('caching', {})
CACHING_REDIS_HOST = CACHING_REDIS.get('HOST', 'localhost')
CACHING_REDIS_PORT = CACHING_REDIS.get('PORT', 6379)
CACHING_REDIS_SENTINELS = CACHING_REDIS.get('SENTINELS', [])
CACHING_REDIS_USING_SENTINEL = all([
    isinstance(CACHING_REDIS_SENTINELS, (list, tuple)),
    len(CACHING_REDIS_SENTINELS) > 0
])
CACHING_REDIS_SENTINEL_SERVICE = CACHING_REDIS.get('SENTINEL_SERVICE', 'default')
CACHING_REDIS_PASSWORD = CACHING_REDIS.get('PASSWORD', '')
CACHING_REDIS_DATABASE = CACHING_REDIS.get('DATABASE', 0)
CACHING_REDIS_DEFAULT_TIMEOUT = CACHING_REDIS.get('DEFAULT_TIMEOUT', 300)
CACHING_REDIS_SSL = CACHING_REDIS.get('SSL', False)
CACHING_REDIS_SOCKET = CACHING_REDIS.get('USE_SOCKET', False)

#
# Caching
#
if CACHING_REDIS_USING_SENTINEL:
    CACHEOPS_SENTINEL = {
        'locations': CACHING_REDIS_SENTINELS,
        'service_name': CACHING_REDIS_SENTINEL_SERVICE,
        'db': CACHING_REDIS_DATABASE,
    }
else:
    if CACHING_REDIS_SOCKET:
        REDIS_CACHE_CON_STRING = 'unix://'
    elif CACHING_REDIS_SSL:
        REDIS_CACHE_CON_STRING = 'rediss://'
    else:
        REDIS_CACHE_CON_STRING = 'redis://'

    if CACHING_REDIS_PASSWORD:
        REDIS_CACHE_CON_STRING = '{}:{}@'.format(REDIS_CACHE_CON_STRING, CACHING_REDIS_PASSWORD)

    if CACHING_REDIS_SOCKET:
        REDIS_CACHE_CON_STRING = '{}{}?db={}'.format(
            REDIS_CACHE_CON_STRING,
            CACHING_REDIS_HOST,
            CACHING_REDIS_DATABASE
        )
    else:
        REDIS_CACHE_CON_STRING = '{}{}:{}/{}'.format(
            REDIS_CACHE_CON_STRING,
            CACHING_REDIS_HOST,
            CACHING_REDIS_PORT,
            CACHING_REDIS_DATABASE
        )
    CACHEOPS_REDIS = REDIS_CACHE_CON_STRING

#
# Django RQ (Webhooks backend)
#

RQ_QUEUES = {
    'default': {
        'HOST': WEBHOOKS_REDIS_HOST,
        'PORT': WEBHOOKS_REDIS_PORT,
        'DB': WEBHOOKS_REDIS_DATABASE,
        'PASSWORD': WEBHOOKS_REDIS_PASSWORD,
        'DEFAULT_TIMEOUT': WEBHOOKS_REDIS_DEFAULT_TIMEOUT,
        'SSL': WEBHOOKS_REDIS_SSL,
    } if not WEBHOOKS_REDIS_SOCKET and WEBHOOKS_REDIS_USING_SENTINEL else {
        'UNIX_SOCKET_PATH': WEBHOOKS_REDIS_HOST,
        'DB': WEBHOOKS_REDIS_DATABASE,
        'PASSWORD': WEBHOOKS_REDIS_PASSWORD,
        'DEFAULT_TIMEOUT': WEBHOOKS_REDIS_DEFAULT_TIMEOUT,
        'SSL': WEBHOOKS_REDIS_SSL,
    } if not WEBHOOKS_REDIS_USING_SENTINEL else {
        'SENTINELS': WEBHOOKS_REDIS_SENTINELS,
        'MASTER_NAME': WEBHOOKS_REDIS_SENTINEL_SERVICE,
        'DB': WEBHOOKS_REDIS_DATABASE,
        'PASSWORD': WEBHOOKS_REDIS_PASSWORD,
        'SOCKET_TIMEOUT': None,
        'CONNECTION_KWARGS': {
            'socket_connect_timeout': WEBHOOKS_REDIS_DEFAULT_TIMEOUT
        },
    }
}
Originally created by @est-it on GitHub (Mar 18, 2020). ### Environment * Python version: 3.7.3 * NetBox version: 2.7.10 ### Proposed Functionality Implement unix-socket support for Redis cache and webhook ### Use Case When Redis is installed on the same Server as netbox, then the possible usage of unix sockets for redis would be nice. When using unix sockets, there is no need for localhost loopback with the whole IP-Stack. The usage with unix sockets can improve the performance too (even if it doesn't matter). ### Database Changes No DB-Changes needed. Just some small changes in settings.py and configuration.py ### External Dependencies Just a possible example: Changes in configuration.py: ```python REDIS = { 'webhooks': { 'HOST': '/var/run/redis/redis-server.sock', 'PORT': 0, # Comment out `HOST` and `PORT` lines and uncomment the following if using Redis Sentinel # 'SENTINELS': [('mysentinel.redis.example.com', 6379)], # 'SENTINEL_SERVICE': 'netbox', 'PASSWORD': '', 'DATABASE': 0, 'DEFAULT_TIMEOUT': 300, 'SSL': False, 'USE_SOCKET': True, }, 'caching': { 'HOST': '/var/run/redis/redis-server.sock', 'PORT': 0, # Comment out `HOST` and `PORT` lines and uncomment the following if using Redis Sentinel # 'SENTINELS': [('mysentinel.redis.example.com', 6379)], # 'SENTINEL_SERVICE': 'netbox', 'PASSWORD': '', 'DATABASE': 1, 'DEFAULT_TIMEOUT': 300, 'SSL': False, 'USE_SOCKET': True, } } ``` Changes in settings.py: ```python # # Redis # if 'webhooks' not in REDIS: raise ImproperlyConfigured( "REDIS section in configuration.py is missing webhooks subsection." ) if 'caching' not in REDIS: raise ImproperlyConfigured( "REDIS section in configuration.py is missing caching subsection." ) WEBHOOKS_REDIS = REDIS.get('webhooks', {}) WEBHOOKS_REDIS_HOST = WEBHOOKS_REDIS.get('HOST', 'localhost') WEBHOOKS_REDIS_PORT = WEBHOOKS_REDIS.get('PORT', 6379) WEBHOOKS_REDIS_SENTINELS = WEBHOOKS_REDIS.get('SENTINELS', []) WEBHOOKS_REDIS_USING_SENTINEL = all([ isinstance(WEBHOOKS_REDIS_SENTINELS, (list, tuple)), len(WEBHOOKS_REDIS_SENTINELS) > 0 ]) WEBHOOKS_REDIS_SENTINEL_SERVICE = WEBHOOKS_REDIS.get('SENTINEL_SERVICE', 'default') WEBHOOKS_REDIS_PASSWORD = WEBHOOKS_REDIS.get('PASSWORD', '') WEBHOOKS_REDIS_DATABASE = WEBHOOKS_REDIS.get('DATABASE', 0) WEBHOOKS_REDIS_DEFAULT_TIMEOUT = WEBHOOKS_REDIS.get('DEFAULT_TIMEOUT', 300) WEBHOOKS_REDIS_SSL = WEBHOOKS_REDIS.get('SSL', False) WEBHOOKS_REDIS_SOCKET = WEBHOOKS_REDIS.get('USE_SOCKET', False) CACHING_REDIS = REDIS.get('caching', {}) CACHING_REDIS_HOST = CACHING_REDIS.get('HOST', 'localhost') CACHING_REDIS_PORT = CACHING_REDIS.get('PORT', 6379) CACHING_REDIS_SENTINELS = CACHING_REDIS.get('SENTINELS', []) CACHING_REDIS_USING_SENTINEL = all([ isinstance(CACHING_REDIS_SENTINELS, (list, tuple)), len(CACHING_REDIS_SENTINELS) > 0 ]) CACHING_REDIS_SENTINEL_SERVICE = CACHING_REDIS.get('SENTINEL_SERVICE', 'default') CACHING_REDIS_PASSWORD = CACHING_REDIS.get('PASSWORD', '') CACHING_REDIS_DATABASE = CACHING_REDIS.get('DATABASE', 0) CACHING_REDIS_DEFAULT_TIMEOUT = CACHING_REDIS.get('DEFAULT_TIMEOUT', 300) CACHING_REDIS_SSL = CACHING_REDIS.get('SSL', False) CACHING_REDIS_SOCKET = CACHING_REDIS.get('USE_SOCKET', False) # # Caching # if CACHING_REDIS_USING_SENTINEL: CACHEOPS_SENTINEL = { 'locations': CACHING_REDIS_SENTINELS, 'service_name': CACHING_REDIS_SENTINEL_SERVICE, 'db': CACHING_REDIS_DATABASE, } else: if CACHING_REDIS_SOCKET: REDIS_CACHE_CON_STRING = 'unix://' elif CACHING_REDIS_SSL: REDIS_CACHE_CON_STRING = 'rediss://' else: REDIS_CACHE_CON_STRING = 'redis://' if CACHING_REDIS_PASSWORD: REDIS_CACHE_CON_STRING = '{}:{}@'.format(REDIS_CACHE_CON_STRING, CACHING_REDIS_PASSWORD) if CACHING_REDIS_SOCKET: REDIS_CACHE_CON_STRING = '{}{}?db={}'.format( REDIS_CACHE_CON_STRING, CACHING_REDIS_HOST, CACHING_REDIS_DATABASE ) else: REDIS_CACHE_CON_STRING = '{}{}:{}/{}'.format( REDIS_CACHE_CON_STRING, CACHING_REDIS_HOST, CACHING_REDIS_PORT, CACHING_REDIS_DATABASE ) CACHEOPS_REDIS = REDIS_CACHE_CON_STRING # # Django RQ (Webhooks backend) # RQ_QUEUES = { 'default': { 'HOST': WEBHOOKS_REDIS_HOST, 'PORT': WEBHOOKS_REDIS_PORT, 'DB': WEBHOOKS_REDIS_DATABASE, 'PASSWORD': WEBHOOKS_REDIS_PASSWORD, 'DEFAULT_TIMEOUT': WEBHOOKS_REDIS_DEFAULT_TIMEOUT, 'SSL': WEBHOOKS_REDIS_SSL, } if not WEBHOOKS_REDIS_SOCKET and WEBHOOKS_REDIS_USING_SENTINEL else { 'UNIX_SOCKET_PATH': WEBHOOKS_REDIS_HOST, 'DB': WEBHOOKS_REDIS_DATABASE, 'PASSWORD': WEBHOOKS_REDIS_PASSWORD, 'DEFAULT_TIMEOUT': WEBHOOKS_REDIS_DEFAULT_TIMEOUT, 'SSL': WEBHOOKS_REDIS_SSL, } if not WEBHOOKS_REDIS_USING_SENTINEL else { 'SENTINELS': WEBHOOKS_REDIS_SENTINELS, 'MASTER_NAME': WEBHOOKS_REDIS_SENTINEL_SERVICE, 'DB': WEBHOOKS_REDIS_DATABASE, 'PASSWORD': WEBHOOKS_REDIS_PASSWORD, 'SOCKET_TIMEOUT': None, 'CONNECTION_KWARGS': { 'socket_connect_timeout': WEBHOOKS_REDIS_DEFAULT_TIMEOUT }, } } ```
adam added the pending closure label 2025-12-29 18:29:27 +01:00
adam closed this issue 2025-12-29 18:29:27 +01:00
Author
Owner

@stale[bot] commented on GitHub (Apr 3, 2020):

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. NetBox is governed by a small group of core maintainers which means not all opened issues may receive direct feedback. Please see our contributing guide.

@stale[bot] commented on GitHub (Apr 3, 2020): This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. NetBox is governed by a small group of core maintainers which means not all opened issues may receive direct feedback. Please see our [contributing guide](https://github.com/netbox-community/netbox/blob/develop/CONTRIBUTING.md).
Author
Owner

@stale[bot] commented on GitHub (Apr 13, 2020):

This issue has been automatically closed due to lack of activity. In an effort to reduce noise, please do not comment any further. Note that the core maintainers may elect to reopen this issue at a later date if deemed necessary.

@stale[bot] commented on GitHub (Apr 13, 2020): This issue has been automatically closed due to lack of activity. In an effort to reduce noise, please do not comment any further. Note that the core maintainers may elect to reopen this issue at a later date if deemed necessary.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: starred/netbox#3486