{% if database != 'none' or use_redis %}import os {% endif %}from pydantic import Field{% if database != 'none' or 'aiogram_bot' in backend_services or include_payments or use_llm or use_redis %}, SecretStr{% endif %} from pydantic_settings import BaseSettings, SettingsConfigDict {% if database != 'none' or use_redis %} def is_prod() -> bool: return os.getenv("RUN_ENVIRONMENT") == "prod" {% endif %} class LogSettings(BaseSettings): level: str = "INFO" level_external: str = "WARNING" show_time: bool = False console_width: int = 150 {% if database == 'mongo' %} class DatabaseSettings(BaseSettings): host: str = "mongodb" port: int = 27017 user: str = "{{ project_slug }}" password: SecretStr = SecretStr("{{ project_slug }}") db_name: str = "{{ project_slug }}" connection_params: str = "?authSource=admin" @property def connection_url(self) -> str: host = self.host if is_prod() else "localhost" password = self.password.get_secret_value() return f"mongodb://{self.user}:{password}@{host}:{self.port}/{self.db_name}{self.connection_params}" {% elif database == 'postgres' %} class DatabaseSettings(BaseSettings): host: str = "postgres" port: int = 5432 user: str = "{{ project_slug }}" password: SecretStr = SecretStr("{{ project_slug }}") db_name: str = "{{ project_slug }}" min_pool_size: int = 5 max_pool_size: int = 20 @property def connection_url(self) -> str: host = self.host if is_prod() else "localhost" password = self.password.get_secret_value() return f"postgresql://{self.user}:{password}@{host}:{self.port}/{self.db_name}" @property def async_connection_url(self) -> str: return self.connection_url.replace("postgresql://", "postgresql+asyncpg://", 1) {% endif %}{% if use_redis %} class RedisSettings(BaseSettings): host: str = "redis" port: int = 6379 db: int = 0 password: SecretStr | None = None cache_ttl: int = 300 @property def url(self) -> str: host = self.host if is_prod() else "localhost" auth = f":{self.password.get_secret_value()}@" if self.password else "" return f"redis://{auth}{host}:{self.port}/{self.db}" {% endif %}{% if 'api' in backend_services %} class ApiSettings(BaseSettings): host: str = "0.0.0.0" # noqa: S104 port: int = 8080 workers: int = 1 docs: bool = False {%- if serve_spa %} static_dir: str = "static" {%- endif %} {% endif %}{% if 'aiogram_bot' in backend_services %} class BotSettings(BaseSettings): token: SecretStr = SecretStr("") admins: list[int] = Field(default_factory=list) {% endif %}{% if include_payments %} class CryptoPaySettings(BaseSettings): token: SecretStr = SecretStr("") {% endif %}{% if use_llm %} class LlmSettings(BaseSettings): model: str = "google-gla:gemini-2.5-flash" gemini_api_key: SecretStr = SecretStr("") {% endif %} class Settings(BaseSettings): log: LogSettings = Field(default_factory=LogSettings) {%- if database != 'none' %} db: DatabaseSettings = Field(default_factory=DatabaseSettings) {%- endif %} {%- if use_redis %} redis: RedisSettings = Field(default_factory=RedisSettings) {%- endif %} {%- if 'api' in backend_services %} api: ApiSettings = Field(default_factory=ApiSettings) {%- endif %} {%- if 'aiogram_bot' in backend_services %} bot: BotSettings = Field(default_factory=BotSettings) {%- endif %} {%- if include_payments %} crypto_pay: CryptoPaySettings = Field(default_factory=CryptoPaySettings) {%- endif %} {%- if use_llm %} llm: LlmSettings = Field(default_factory=LlmSettings) {%- endif %} model_config = SettingsConfigDict( case_sensitive=False, env_file={% if layout == 'part' %}("../.env", ".env"){% else %}".env"{% endif %}, env_nested_delimiter="__", extra="ignore", ) env = Settings()