"""Конфигурация приложения. Все значения приходят из окружения (см. .env.example)."""
from functools import lru_cache
from pydantic import model_validator
from pydantic_settings import BaseSettings, SettingsConfigDict
# Дефолт в репозитории — подделываемая кука, если при деплое забыть SESSION_SECRET.
# Падаем на старте вместо молчаливо небезопасной сессии (остальные секреты и так
# обязательны — без них gauth не работает).
DEFAULT_SESSION_SECRET = "change-me-session-secret"
class Settings(BaseSettings):
model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8", extra="ignore")
# SSO (gnexus-gauth)
gauth_base_url: str = "https://auth.gnexus.space"
gauth_client_id: str = ""
gauth_client_secret: str = ""
gauth_redirect_uri: str = "http://localhost:8134/auth/callback"
# Database
database_url: str = "postgresql+psycopg://gntodo:gntodo@localhost:5432/gntodo"
# Session cookie
session_secret: str = DEFAULT_SESSION_SECRET
session_cookie_name: str = "gntodo_session"
# Ollama (M2)
ollama_base_url: str = "http://192.168.1.130:11434"
ollama_model: str = "qwen3.5:2b-q4_K_M"
# Хранилище вложений (M2)
attachments_path: str = "data/attachments"
# MCP-сервер (M5): bearer-токен для агентов; пусто — /mcp закрыт (401)
mcp_token: str = ""
@model_validator(mode="after")
def _session_secret_must_be_set(self) -> "Settings":
if self.session_secret == DEFAULT_SESSION_SECRET:
raise ValueError(
"SESSION_SECRET не задан: дефолтный секрет из репозитория позволяет "
"подделать куку сессии. Задайте SESSION_SECRET в .env."
)
return self
@lru_cache
def get_settings() -> Settings:
return Settings()