from pathlib import Path from dotenv import load_dotenv from pydantic import Field from pydantic_settings import BaseSettings, SettingsConfigDict # .env рядом с корнём проекта (не зависит от текущей директории при запуске uvicorn) _PROJECT_ROOT = Path(__file__).resolve().parent.parent load_dotenv(_PROJECT_ROOT / ".env") class Settings(BaseSettings): model_config = SettingsConfigDict( env_file=str(_PROJECT_ROOT / ".env"), env_file_encoding="utf-8", extra="ignore", ) http_addr: str = Field(default="0.0.0.0:8080", validation_alias="HTTP_ADDR") database_url: str = Field(default="", validation_alias="DATABASE_URL") grafana_webhook_secret: str = Field(default="", validation_alias="GRAFANA_WEBHOOK_SECRET") # JSON-массив: [{"slug":"adibrov","api_url":"https://...","api_token":"glsa_...","webhook_secret":"..."}] # Пусто + задан GRAFANA_URL → один источник slug "default" grafana_sources_json: str = Field(default="", validation_alias="GRAFANA_SOURCES_JSON") # HTTP API (service account): Grafana → Administration → Service accounts → токен grafana_url: str = Field(default="", validation_alias="GRAFANA_URL") grafana_service_account_token: str = Field( default="", validation_alias="GRAFANA_SERVICE_ACCOUNT_TOKEN", ) vault_addr: str = Field(default="", validation_alias="VAULT_ADDR") vault_token: str = Field(default="", validation_alias="VAULT_TOKEN") # Forgejo (Gitea-совместимый API): Settings → Applications → токен, или при создании PAT forgejo_url: str = Field(default="", validation_alias="FORGEJO_URL") forgejo_token: str = Field(default="", validation_alias="FORGEJO_TOKEN") log_level: str = Field(default="info", validation_alias="LOG_LEVEL") def get_settings() -> Settings: return Settings()