from __future__ import annotations from pydantic import AliasChoices, Field from pydantic_settings import BaseSettings, SettingsConfigDict _prefix = "OPENBAO__SETTINGS" class Settings(BaseSettings): """Настройки БД и секретов для хранения токенов OpenCloud заказчиков. Конвенция (`OPENBAO__SETTINGS__*`, pydantic-settings + AliasChoices) скопирована с примера DFiP Budget Planning (api/src/core/config.py) — там она уже проверена в проде для этой же схемы инъекции секретов через OpenBao. """ DATABASE_URL: str = Field( default="sqlite+aiosqlite:///./sfm_opencloud_tokens.db", description="URL подключения к БД с таблицей токенов OpenCloud", 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"), ) FERNET_KEY: str = Field( default="", description=( "Ключ шифрования токенов OpenCloud (Fernet, urlsafe base64, 32 байта). " "ОБЯЗАТЕЛЕН в проде — пустое значение допустимо только для локальной " "разработки, где шифрование токенов не тестируется." ), validation_alias=AliasChoices(f"{_prefix}__FERNET_KEY", "FERNET_KEY"), ) model_config = SettingsConfigDict(env_file=".env", extra="ignore") settings = Settings()