from pydantic_settings import BaseSettings from typing import List, Optional, Union from functools import lru_cache import os class Settings(BaseSettings): # تنظیمات برنامه PROJECT_NAME: str = "دستیار هوش مصنوعی مستقل" VERSION: str = "2.0.0" DEBUG: bool = True ENVIRONMENT: str = "development" # تنظیمات امنیتی SECRET_KEY: str = "your-secret-key-change-in-production" ALGORITHM: str = "HS256" ACCESS_TOKEN_EXPIRE_MINUTES: int = 1440 REFRESH_TOKEN_EXPIRE_DAYS: int = 7 # تنظیمات دامنه DOMAIN: str = "assistant.zpir.ir" BACKEND_CORS_ORIGINS: List[str] = [ "http://localhost:3000", "http://localhost:8000", "https://assistant.zpir.ir", "https://zpir.ir" ] # تنظیمات MySQL DATABASE_URL: str = "mysql://app_user:app_password123@mysql:3306/ai_assistant" REDIS_URL: str = "redis://redis:6379/0" # تنظیمات Celery CELERY_BROKER_URL: str = "redis://redis:6379/0" CELERY_RESULT_BACKEND: str = "redis://redis:6379/0" # تنظیمات ایمیل SMTP_SERVER: Optional[str] = None SMTP_PORT: Optional[int] = None SMTP_USERNAME: Optional[str] = None SMTP_PASSWORD: Optional[str] = None EMAILS_FROM_EMAIL: Optional[str] = None # تنظیمات امنیتی پیشرفته MAX_LOGIN_ATTEMPTS: int = 5 ACCOUNT_LOCKOUT_MINUTES: int = 30 SESSION_TIMEOUT_MINUTES: int = 60 # تنظیمات سیستم MAX_CONCURRENT_TASKS_PER_USER: int = 3 MAX_TASK_DURATION_SECONDS: int = 300 MAX_FILE_SIZE_MB: int = 100 # حداکثر حجم فایل آپلودی TASK_QUEUE_LIMIT: int = 10 # حداکثر تسک در صف # مسیرهای ذخیره‌سازی UPLOAD_DIR: str = "/app/uploads" TEMP_DIR: str = "/app/temp" SCREENSHOTS_DIR: str = "/app/temp/screenshots" RESULTS_DIR: str = "/app/temp/results" # تنظیمات پاکسازی CLEANUP_INTERVAL_HOURS: int = 2 # هر 2 ساعت TEMP_FILE_MAX_AGE_HOURS: int = 2 # حداکثر عمر فایل موقت # API Keys DEEPSEEK_API_KEY: Optional[str] = None OPENAI_API_KEY: Optional[str] = None # تنظیمات Web Scraping MAX_SCRAPING_DEPTH: int = 3 SCRAPING_TIMEOUT: int = 30 # تنظیمات Desktop Control ALLOW_REMOTE_CONTROL: bool = False DESKTOP_CONTROL_TIMEOUT: int = 60 class Config: env_file = ".env" case_sensitive = True @lru_cache() def get_settings() -> Settings: return Settings() settings = get_settings()