from pydantic_settings import BaseSettings from typing import Optional from dotenv import load_dotenv from pathlib import Path # Загружаем .env файл перед созданием Settings # Ищем .env в корне проекта (на уровень выше от app/) env_path = Path(__file__).parent.parent.parent / ".env" # override=True гарантирует, что переменные из .env перезапишут существующие load_dotenv(dotenv_path=env_path, override=True) class Settings(BaseSettings): # App PROJECT_NAME: str = "Новая Планета API" VERSION: str = "1.0.0" API_V1_STR: str = "/api/v1" DEBUG: bool = False # Security SECRET_KEY: str = "3db8542397edddbd6162ad823157e36f8d47232aa646725d4799266229ba7aa4" ALGORITHM: str = "HS256" ACCESS_TOKEN_EXPIRE_MINUTES: int = 30 REFRESH_TOKEN_EXPIRE_DAYS: int = 7 # Database POSTGRES_USER: str = "postgres" POSTGRES_PASSWORD: str = "postgres" POSTGRES_DB: str = "newplanet" POSTGRES_HOST: str = "localhost" POSTGRES_PORT: int = 5432 DATABASE_URL: Optional[str] = None @property def database_url(self) -> str: if self.DATABASE_URL: return self.DATABASE_URL return f"postgresql+asyncpg://{self.POSTGRES_USER}:{self.POSTGRES_PASSWORD}@{self.POSTGRES_HOST}:{self.POSTGRES_PORT}/{self.POSTGRES_DB}" # Redis REDIS_HOST: str = "localhost" REDIS_PORT: int = 6379 REDIS_DB: int = 0 REDIS_URL: Optional[str] = None @property def redis_url(self) -> str: if self.REDIS_URL: return self.REDIS_URL return f"redis://{self.REDIS_HOST}:{self.REDIS_PORT}/{self.REDIS_DB}" # Storage (MinIO/S3) STORAGE_ENDPOINT: str = "localhost:9000" STORAGE_ACCESS_KEY: str = "minioadmin" STORAGE_SECRET_KEY: str = "minioadmin" STORAGE_BUCKET: str = "new-planet-images" STORAGE_USE_SSL: bool = False STORAGE_REGION: str = "us-east-1" # AI Agent Service (внешний сервис для работы с GigaChat) # URL можно переопределить через переменную окружения AI_AGENT_BASE_URL # Для Docker сети используйте: http://ai-agent:8000 (или имя сервиса из docker-compose) # Для локальной разработки используйте: http://localhost:8000 AI_AGENT_BASE_URL: str = "http://ai-agent:8000" AI_AGENT_TIMEOUT: int = 120 # Таймаут в секундах # GigaChat (оставлено для обратной совместимости, но используется через AI-agent сервис) GIGACHAT_CLIENT_ID: str = "019966f4-1c5c-7382-9006-b84419fbe5d1" GIGACHAT_CLIENT_SECRET: str = "MDE5OTY2ZjQtMWM1Yy03MzgyLTkwMDYtYjg0NDE5ZmJlNWQxOjJjODBmOWE2LWU4YWMtNDE4YS1iOGVkLWE4NTE0YzVkNDAwNw==" GIGACHAT_AUTH_URL: str = "https://ngw.devices.sberbank.ru:9443/api/v2/oauth" GIGACHAT_BASE_URL: str = "https://gigachat.devices.sberbank.ru/api/v1" GIGACHAT_MODEL_CHAT: str = "GigaChat-2-Lite" GIGACHAT_MODEL_SCHEDULE: str = "GigaChat-2-Pro" # CORS CORS_ORIGINS: list[str] = ["*"] # Rate Limiting RATE_LIMIT_ENABLED: bool = True RATE_LIMIT_PER_MINUTE: int = 60 class Config: # Путь к .env файлу относительно корня проекта env_file = str(env_path) if env_path.exists() else ".env" env_file_encoding = "utf-8" case_sensitive = True settings = Settings()