2026-04-03 08:30:56 +03:00
|
|
|
|
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")
|
2026-04-03 13:53:19 +03:00
|
|
|
|
# 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")
|
2026-04-03 08:30:56 +03:00
|
|
|
|
# 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")
|
2026-04-03 15:59:17 +03:00
|
|
|
|
# Путь к лог-файлу. Пусто = не писать в файл. Пример: /var/log/onguard24/app.log
|
|
|
|
|
|
# Файл ротируется: 10 МБ × 5 штук (~50 МБ суммарно).
|
|
|
|
|
|
log_file: str = Field(default="", validation_alias="LOG_FILE")
|
2026-04-03 15:26:38 +03:00
|
|
|
|
# Устаревшее: автосоздание инцидента на каждый вебхук (без учёта irm_alerts). По умолчанию выкл.
|
|
|
|
|
|
auto_incident_from_alert: bool = Field(
|
|
|
|
|
|
default=False,
|
|
|
|
|
|
validation_alias="AUTO_INCIDENT_FROM_ALERT",
|
|
|
|
|
|
)
|
2026-04-03 08:30:56 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_settings() -> Settings:
|
|
|
|
|
|
return Settings()
|