122 lines
3.8 KiB
Python

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()