122 lines
3.8 KiB
Django/Jinja
122 lines
3.8 KiB
Django/Jinja
{% 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()
|