"""Konfiguration. Alle Werte kommen aus der Umgebung (im Betrieb aus .env).""" import os from pathlib import Path def _s(name: str, default: str = "") -> str: return os.environ.get(name, default).strip() def _i(name: str, default: int) -> int: try: return int(_s(name) or default) except ValueError: return default def _b(name: str, default: bool) -> bool: v = _s(name).lower() if not v: return default return v in ("1", "true", "yes", "on") DATA_DIR = Path(_s("DATA_DIR", "./data")) IMAGE_DIR = DATA_DIR / "images" DB_PATH = DATA_DIR / "cards.db" # Leeres Passwort schaltet die Anmeldung ab - nur fuer die lokale Entwicklung. APP_PASSWORD = _s("APP_PASSWORD") SECRET_KEY = _s("SECRET_KEY", "dev-only-insecure-secret") SESSION_DAYS = _i("SESSION_DAYS", 30) ANTHROPIC_API_KEY = _s("ANTHROPIC_API_KEY") ANTHROPIC_MODEL = _s("ANTHROPIC_MODEL", "claude-opus-5") EXTRACT_CONCURRENCY = _i("EXTRACT_CONCURRENCY", 5) SMTP_HOST = _s("SMTP_HOST") SMTP_PORT = _i("SMTP_PORT", 587) SMTP_USER = _s("SMTP_USER") SMTP_PASSWORD = _s("SMTP_PASSWORD") SMTP_FROM = _s("SMTP_FROM") or SMTP_USER SMTP_STARTTLS = _b("SMTP_STARTTLS", True) REMINDER_TO = _s("REMINDER_TO") REVERSE_GEOCODE = _b("REVERSE_GEOCODE", True) NOMINATIM_URL = _s("NOMINATIM_URL", "https://nominatim.openstreetmap.org/reverse") USER_AGENT = _s("USER_AGENT", "business-card-scanner/1.0 (self-hosted)") PUBLIC_BASE_URL = _s("PUBLIC_BASE_URL").rstrip("/") def ensure_dirs() -> None: IMAGE_DIR.mkdir(parents=True, exist_ok=True)