SPB Git

spb/api-ka

Public

API-KA — plateforme centrale : collecte quotidienne des 8 services KA, historisation append-only et API publique sur www.api-ka.com

3.8 KB · 128 lines python
1# ============================================2# Projet   : API-KA3# Fichier  : src/config.py4# Node     : m3u96b5# Author   : Simon-Pierre Boucher6# Contact  : contact@spboucher.ai7# Date     : 2026-08-168# ============================================9"""Configuration centrale d'API-KA : chargement du .env et vérification du node m3u96b."""1011from __future__ import annotations1213import os14import socket15from dataclasses import dataclass16from functools import lru_cache17from pathlib import Path1819from dotenv import load_dotenv2021REQUIRED_NODE = "m3u96b"2223SERVICES: tuple[str, ...] = (24    "louka",25    "immoka",26    "foodka",27    "autoka",28    "fabrika",29    "restoka",30    "sortika",31    "creaka",32    "jobka",33    "houseka",34    "rentka",35)3637SERVICE_TABLES: dict[str, str] = {service: f"{service}_data" for service in SERVICES}3839SERVICE_SOURCE_ENV: dict[str, str] = {40    "louka": "LOUKA_SOURCE_URL",41    "immoka": "IMMOKA_SOURCE_URL",42    "foodka": "FOODKA_SOURCE_URL",43    "autoka": "AUTOKA_SOURCE_URL",44    "fabrika": "FABRIKA_SOURCE_URL",45    "restoka": "RESTOKA_SOURCE_URL",46    "sortika": "SORTIKA_SOURCE_URL",47    "creaka": "CREAKA_SOURCE_URL",48    "jobka": "JOBKA_SOURCE_URL",49    "houseka": "HOUSEKA_SOURCE_URL",50    "rentka": "RENTKA_SOURCE_URL",51}5253BASE_DIR = Path(__file__).resolve().parents[1]5455load_dotenv(BASE_DIR / ".env")565758def verify_node() -> None:59    """Refuse de démarrer en production si le hostname n'est pas m3u96b.6061    Le suffixe éventuel (ex. ``.local``) est ignoré et la comparaison est62    insensible à la casse, mais la règle reste stricte : en production,63    API-KA ne tourne que sur le node m3u96b.64    """65    hostname = socket.gethostname()66    if os.getenv("APP_ENV") == "production":67        short = hostname.split(".")[0].lower()68        if short != REQUIRED_NODE:69            raise RuntimeError(70                f"API-KA doit tourner sur {REQUIRED_NODE}, node actuel : {hostname}"71            )727374@dataclass(frozen=True)75class Settings:76    """Configuration immuable de la plateforme, chargée depuis le .env."""7778    app_env: str79    node_name: str80    database_url: str81    ngrok_authtoken: str82    ngrok_domain: str83    api_port: int84    daily_run_hour: int85    backup_retention_days: int86    rate_limit_per_minute: int87    trouveka_search_url: str88    trouveka_suggest_url: str89    source_urls: dict[str, str]90    base_dir: Path91    logs_dir: Path92    backups_dir: Path939495@lru_cache(maxsize=1)96def get_settings() -> Settings:97    """Charge et met en cache la configuration depuis les variables d'environnement."""98    logs_dir = BASE_DIR / "logs"99    backups_dir = BASE_DIR / "data" / "backups"100    logs_dir.mkdir(parents=True, exist_ok=True)101    backups_dir.mkdir(parents=True, exist_ok=True)102103    default_db = f"sqlite:///{BASE_DIR / 'data' / 'apika_dev.db'}"104    return Settings(105        app_env=os.getenv("APP_ENV", "development"),106        node_name=os.getenv("NODE_NAME", REQUIRED_NODE),107        database_url=os.getenv("DATABASE_URL", default_db),108        ngrok_authtoken=os.getenv("NGROK_AUTHTOKEN", ""),109        ngrok_domain=os.getenv("NGROK_DOMAIN", "www.api-ka.com"),110        api_port=int(os.getenv("API_PORT", "8000")),111        daily_run_hour=int(os.getenv("DAILY_RUN_HOUR", "02")),112        backup_retention_days=max(90, int(os.getenv("BACKUP_RETENTION_DAYS", "90"))),113        rate_limit_per_minute=int(os.getenv("RATE_LIMIT_PER_MINUTE", "120")),114        trouveka_search_url=os.getenv(115            "TROUVEKA_SEARCH_URL", "https://www.trouve-ka.com/api/search"116        ),117        trouveka_suggest_url=os.getenv(118            "TROUVEKA_SUGGEST_URL", "https://www.trouve-ka.com/api/suggest"119        ),120        source_urls={121            service: os.getenv(env_var, "")122            for service, env_var in SERVICE_SOURCE_ENV.items()123        },124        base_dir=BASE_DIR,125        logs_dir=logs_dir,126        backups_dir=backups_dir,127    )128
Files · ff8f31f8df33329eb200d1a4c923198ee45d3f3d
Menu

Theme