2026-05-22 21:53:42 +00:00
|
|
|
from functools import lru_cache
|
|
|
|
|
from typing import Literal
|
|
|
|
|
|
|
|
|
|
from pydantic import Field
|
|
|
|
|
from pydantic_settings import BaseSettings, SettingsConfigDict
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Settings(BaseSettings):
|
|
|
|
|
model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8", extra="ignore")
|
|
|
|
|
|
|
|
|
|
database_url: str = Field(alias="DATABASE_URL")
|
|
|
|
|
|
|
|
|
|
jwt_secret: str = Field(alias="JWT_SECRET")
|
|
|
|
|
jwt_access_ttl_min: int = Field(default=15, alias="JWT_ACCESS_TTL_MIN")
|
|
|
|
|
jwt_refresh_ttl_days: int = Field(default=30, alias="JWT_REFRESH_TTL_DAYS")
|
|
|
|
|
|
|
|
|
|
tracksolid_push_token: str = Field(default="", alias="TRACKSOLID_PUSH_TOKEN")
|
|
|
|
|
tracksolid_api_base_url: str = Field(default="", alias="TRACKSOLID_API_BASE_URL")
|
2026-05-23 05:59:27 +00:00
|
|
|
tracksolid_app_key: str = Field(default="", alias="TRACKSOLID_APP_KEY")
|
|
|
|
|
tracksolid_app_secret: str = Field(default="", alias="TRACKSOLID_APP_SECRET")
|
|
|
|
|
tracksolid_user_id: str = Field(default="", alias="TRACKSOLID_USER_ID")
|
|
|
|
|
tracksolid_pwd_md5: str = Field(default="", alias="TRACKSOLID_PWD_MD5")
|
|
|
|
|
tracksolid_target_account: str = Field(default="", alias="TRACKSOLID_TARGET_ACCOUNT")
|
2026-05-23 06:29:04 +00:00
|
|
|
tracksolid_targets: str = Field(default="", alias="TRACKSOLID_TARGETS") # comma-separated
|
2026-05-23 05:59:27 +00:00
|
|
|
tracksolid_token_ttl_sec: int = Field(default=7200, alias="TRACKSOLID_TOKEN_TTL_SEC")
|
|
|
|
|
tracksolid_poll_interval_sec: int = Field(default=60, alias="TRACKSOLID_POLL_INTERVAL_SEC")
|
|
|
|
|
tracksolid_stale_poll_interval_sec: int = Field(
|
|
|
|
|
default=600, alias="TRACKSOLID_STALE_POLL_INTERVAL_SEC"
|
|
|
|
|
)
|
|
|
|
|
tracksolid_stale_after_sec: int = Field(default=1800, alias="TRACKSOLID_STALE_AFTER_SEC")
|
2026-05-22 21:53:42 +00:00
|
|
|
|
|
|
|
|
ntfy_base_url: str = Field(default="", alias="NTFY_BASE_URL")
|
|
|
|
|
ntfy_topic: str = Field(default="fleet-slo-breach", alias="NTFY_TOPIC")
|
|
|
|
|
ntfy_token: str = Field(default="", alias="NTFY_TOKEN")
|
|
|
|
|
|
2026-05-23 20:06:25 +00:00
|
|
|
nominatim_base_url: str = Field(
|
|
|
|
|
default="https://nominatim.openstreetmap.org", alias="NOMINATIM_BASE_URL"
|
|
|
|
|
)
|
|
|
|
|
nominatim_user_agent: str = Field(
|
|
|
|
|
default="fleet-platform/0.1 (admin@rahamafresh.com)", alias="NOMINATIM_USER_AGENT"
|
|
|
|
|
)
|
|
|
|
|
geocoder_max_per_tick: int = Field(default=8, alias="GEOCODER_MAX_PER_TICK")
|
|
|
|
|
geocoder_tick_sec: int = Field(default=30, alias="GEOCODER_TICK_SEC")
|
|
|
|
|
geocoder_rate_limit_sec: float = Field(default=1.1, alias="GEOCODER_RATE_LIMIT_SEC")
|
|
|
|
|
|
2026-05-22 21:53:42 +00:00
|
|
|
app_mode: Literal["dev", "prod"] = Field(default="prod", alias="APP_MODE")
|
|
|
|
|
app_role: Literal["gateway", "worker", "cron"] = Field(default="gateway", alias="APP_ROLE")
|
|
|
|
|
app_log_level: str = Field(default="INFO", alias="APP_LOG_LEVEL")
|
|
|
|
|
app_git_sha: str = Field(default="unknown", alias="APP_GIT_SHA")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@lru_cache(maxsize=1)
|
|
|
|
|
def get_settings() -> Settings:
|
|
|
|
|
return Settings()
|