diff --git a/src/infrastructure/cache/client.py b/src/infrastructure/cache/client.py index 4c8b59a..614a935 100644 --- a/src/infrastructure/cache/client.py +++ b/src/infrastructure/cache/client.py @@ -4,13 +4,15 @@ from src.infrastructure.config import settings def create_redis_client() -> Redis: - return redis.from_url( - settings.REDIS_URL, - max_connections=50, - decode_responses=True, - socket_timeout=5, - socket_connect_timeout=5, - health_check_interval=30, - retry_on_timeout=True, - socket_keepalive=True, - ) \ No newline at end of file + kw = { + 'max_connections': 50, + 'decode_responses': True, + 'socket_timeout': 5, + 'socket_connect_timeout': 5, + 'health_check_interval': 30, + 'retry_on_timeout': True, + 'socket_keepalive': True, + } + if settings.REDIS_PASSWORD: + kw['password'] = settings.REDIS_PASSWORD + return redis.from_url(settings.REDIS_URL, **kw) \ No newline at end of file diff --git a/src/infrastructure/config/settings.py b/src/infrastructure/config/settings.py index 95f99f1..96c9748 100644 --- a/src/infrastructure/config/settings.py +++ b/src/infrastructure/config/settings.py @@ -104,6 +104,13 @@ class Settings(BaseSettings): return None return v + @field_validator('REDIS_PASSWORD', mode='before') + @classmethod + def empty_redis_password_to_none(cls, v): + if v is None or (isinstance(v, str) and not v.strip()): + return None + return v + model_config = SettingsConfigDict( env_file='.env', env_file_encoding='utf-8', @@ -215,6 +222,26 @@ class Settings(BaseSettings): rb_set('password', 'RABBIT_PASSWORD') rb_set('vhost', 'RABBIT_VHOST') + redis_secret = read_secret_optional('redis') + if redis_secret: + rd_ci = {str(k).lower(): v for k, v in redis_secret.items()} + + def rd_set(field: str, env_key: str, *, as_int: bool = False) -> None: + v = rd_ci.get(field) + if v is None: + return + if isinstance(v, str) and not v.strip(): + return + if as_int: + data[env_key] = int(v) + else: + data[env_key] = str(v).strip() + + rd_set('host', 'REDIS_HOST') + rd_set('port', 'REDIS_PORT', as_int=True) + rd_set('password', 'REDIS_PASSWORD') + rd_set('db', 'REDIS_DB', as_int=True) + return data @@ -231,8 +258,7 @@ class Settings(BaseSettings): @property def REDIS_URL(self) -> str: - auth = f":{self.REDIS_PASSWORD}@" if self.REDIS_PASSWORD else "" - return f"redis://{auth}{self.REDIS_HOST}:{self.REDIS_PORT}/{self.REDIS_DB}" + return f'redis://{self.REDIS_HOST}:{self.REDIS_PORT}/{self.REDIS_DB}' @property def RABBIT_URL(self) -> str: