import os from typing import List from pydantic import AliasChoices, Field from pydantic_settings import BaseSettings, SettingsConfigDict if os.environ.get("APP_ENV", "dev") == "test": prefix = "OPENBAO__SETTINGS_TEST" else: prefix = "OPENBAO__SETTINGS" class Settings(BaseSettings): """Настройки backend для DFiP Budget Planing.""" ROOT_PATH: str = Field(default="", description="Префикс API", alias="ROOT_PATH") # Database DATABASE_URL: str = Field( default="sqlite+aiosqlite:///./dfip_budget_planing.db", description="URL подключения к базе данных", validation_alias=AliasChoices(f"{prefix}__DATABASE_URL", "DATABASE_URL"), ) DATABASE_SCHEMA: str = Field( default="", description="Схема БД (для Postgres search_path)", validation_alias=AliasChoices(f"{prefix}__DATABASE_SCHEMA", "DATABASE_SCHEMA"), ) # JWT JWT_SECRET: str = Field( default="change-me-in-production", description="Секретный ключ для JWT", ) JWT_ALGORITHM: str = Field(default="HS256", description="Алгоритм JWT") ACCESS_TOKEN_EXPIRE_MINUTES: int = Field( default=60, description="Время жизни access-токена (минуты)", ) REFRESH_TOKEN_EXPIRE_DAYS: int = Field( default=7, description="Время жизни refresh-токена (дни)", ) # CORS CORS_ORIGINS: List[str] = Field( default=[ "https://raisa.go.rshbank.ru", "http://localhost:3000", "http://localhost:8080", "http://127.0.0.1:3000", "http://127.0.0.1:8000", ], description="Разрешенные origins для CORS", ) HOST: str = Field( default="0.0.0.0", description="Хост API", validation_alias=AliasChoices("SERVER__HOST", "HOST"), ) PORT: int = Field( default=8000, description="Порт API", validation_alias=AliasChoices("SERVER__PORT", "PORT"), ) # Environment ENVIRONMENT: str = Field( default="development", description="Окружение приложения", alias="APP_ENV", ) DEBUG: bool = Field( default=True, description="Режим отладки", validation_alias=AliasChoices(f"{prefix}__DEBUG", "DEBUG"), ) # Authorization (prod branch) JWKS_URL: str = Field( default="https://keycloak.raisa.go.rshbank.ru/realms/datalab/protocol/openid-connect/certs", description="URL для получения JWKS", alias="JWKS_URL", ) APP_NAMESPACE: str = Field( default="dfip", description="Namespace приложения для protected-api", alias="APP_NAMESPACE", ) APP_NAME: str = Field( default="dfip_budget_planing_api", description="Имя приложения для protected-api", alias="APP_NAME", ) # Audit log AUDIT_LOG_RETENTION_DAYS: int = Field( default=365, description="Удалять записи аудита старше N дней", alias="AUDIT_LOG_RETENTION_DAYS", ) AUDIT_LOG_CLEANUP_BATCH_SIZE: int = Field( default=5000, description="Размер батча для очистки аудита", alias="AUDIT_LOG_CLEANUP_BATCH_SIZE", ) AUDIT_LOG_CLEANUP_INTERVAL_SECONDS: int = Field( default=86400, description="Интервал автозапуска очистки аудита в секундах", alias="AUDIT_LOG_CLEANUP_INTERVAL_SECONDS", ) model_config = SettingsConfigDict( env_file=".env", extra="ignore", env_nested_delimiter="__", ) settings = Settings()