from pydantic_settings import BaseSettings, SettingsConfigDict class Settings(BaseSettings): """تنظیمات برنامه — از متغیرهای محیطی یا فایل .env خوانده می‌شود.""" model_config = SettingsConfigDict( env_file=".env", env_file_encoding="utf-8", extra="ignore", ) database_url: str = "postgresql+psycopg://postgres:postgres@localhost:5432/arameshplaza_api" secret_key: str = "dev-secret-change-me-in-production" algorithm: str = "HS256" # ۸ ساعت — توکن stateless است و امکان ابطال ندارد؛ عمر کوتاه‌تر ریسک نشت را کم می‌کند access_token_expire_minutes: int = 480 cors_origins: list[str] = ["*"] admin_username: str = "admin" admin_password: str = "aramesh123" # Object Storage (MinIO / هر S3 سازگار) برای آپلود تصاویر s3_endpoint: str = "http://localhost:9000" s3_access_key: str = "aramesh" s3_secret_key: str = "aramesh-minio-secret" s3_bucket: str = "aramesh-media" # پیشوند عمومی مسیر تصاویر — Traefik آن را به باکت پروکسی می‌کند media_public_base: str = "/media" # رندرهای معماری تا ~۳۰ مگابایت — لبه (Traefik api-bodylimit = ۴۰MB) باید همیشه بزرگ‌تر باشد media_max_upload_mb: int = 35 # نشانی کامل سایت (مثل https://aramesh.example) — برای sitemap و آدرس مطلق OG site_url: str = "" # مسیر بیلد فرانت‌اند (شامل index.html) — برای سرو HTML با متای سئو در صفحات جزئیات frontend_dist: str = "../frontend/dist" # پیش‌نمایش خصوصی: سایت روی اینترنت است اما نه عمومی و نه ایندکس‌شدنی. # گیت اصلی ورود در Traefik است (Basic Auth)؛ این پرچم لایه دوم است: # هدر noindex روی همه پاسخ‌ها + robots.txt مسدودکننده. preview_mode: bool = False settings = Settings()