diff --git a/src/assistant/.env.example b/src/assistant/.env.example index 23e920f..faeea2a 100644 --- a/src/assistant/.env.example +++ b/src/assistant/.env.example @@ -5,6 +5,12 @@ POSTGRES_USER=user POSTGRES_PASSWORD=Qwe123 POSTGRES_DB_NAME=api_db +PROXY_HOST=255.255.255.255 +PROXY_PORT=8888 +PROXY_USER=YOUR_USER +PROXY_PASSWORD=YOUR_PASSWORD +PROXY_ENABLE=False + NGINX_PORT=80 API_HOST=0.0.0.0 API_PORT=8000 diff --git a/src/assistant/lib/app/settings.py b/src/assistant/lib/app/settings.py index 95e727e..0becd43 100644 --- a/src/assistant/lib/app/settings.py +++ b/src/assistant/lib/app/settings.py @@ -16,3 +16,4 @@ class Settings(pydantic_settings.BaseSettings): project: app_split_settings.ProjectSettings = pydantic.Field( default_factory=lambda: app_split_settings.ProjectSettings() ) + proxy: app_split_settings.ProxySettings = pydantic.Field(default_factory=lambda: app_split_settings.ProxySettings()) diff --git a/src/assistant/lib/app/split_settings/__init__.py b/src/assistant/lib/app/split_settings/__init__.py index 793ebe0..f9ddd1f 100644 --- a/src/assistant/lib/app/split_settings/__init__.py +++ b/src/assistant/lib/app/split_settings/__init__.py @@ -3,6 +3,7 @@ from .app import * from .logger import * from .postgres import * from .project import * +from .proxy import * __all__ = [ "ApiSettings", @@ -10,5 +11,6 @@ __all__ = [ "LoggingSettings", "PostgresSettings", "ProjectSettings", + "ProxySettings", "get_logging_config", ] diff --git a/src/assistant/lib/app/split_settings/proxy.py b/src/assistant/lib/app/split_settings/proxy.py new file mode 100644 index 0000000..a79a746 --- /dev/null +++ b/src/assistant/lib/app/split_settings/proxy.py @@ -0,0 +1,40 @@ +import pydantic +import pydantic_settings + +import lib.app.split_settings.utils as app_split_settings_utils + + +class ProxySettings(pydantic_settings.BaseSettings): + model_config = pydantic_settings.SettingsConfigDict( + env_file=app_split_settings_utils.ENV_PATH, + env_prefix="PROXY_", + env_file_encoding="utf-8", + extra="ignore", + ) + user: str | None = None + password: pydantic.SecretStr | None = None + host: str | None = None + port: int | None = None + enable: bool = False + + @property + def dsn(self) -> str: + if self.user and self.password: + password = self.password.get_secret_value() + return f"http://{self.user}:{password}@{self.host}:{self.port}" + return f"http://{self.host}:{self.port}" + + @pydantic.computed_field + @property + def dsn_as_safe_url(self) -> str: + if self.user and self.password: + return f"http://{self.user}:{self.password}@{self.host}:{self.port}" + return f"http://{self.host}:{self.port}" + + @pydantic.model_validator(mode="after") + def check_proxy(self): + if not self.enable: + return self + if self.host and self.port: + return self + raise ValueError("Proxy settings must be set if use_proxy is True")