"""Konfiguration über Umgebungsvariablen (Präfix ``APP_``). Beispiel: ``APP_DATA_DIR=/var/lib/certain-finance`` setzt ``data_dir``. Die Standardwerte sind bewusst entwicklungsfreundlich (relatives Datenverzeichnis, unsichere Cookies erlaubt). Für den Produktivbetrieb setzt das Install-Skript die sicheren Werte in ``/etc/certain-finance/env`` (siehe ``deploy/env.example``). """ from functools import lru_cache from pydantic_settings import BaseSettings, SettingsConfigDict class Settings(BaseSettings): model_config = SettingsConfigDict(env_prefix="APP_", env_file=".env", extra="ignore") # --- Ablageort für Datenbank und Backups --------------------------------- # Produktiv per Env auf einen absoluten Pfad setzen (z. B. /var/lib/...). data_dir: str = "./data" # Leer = SQLite-Datei unter data_dir/app.db. Sonst vollständige URL. database_url: str = "" # --- Sitzungen / Cookies ------------------------------------------------- session_secret: str = "change-me-in-production" session_ttl_days: int = 30 cookie_name: str = "cf_session" # Standard False, damit die Anmeldung auch über http://localhost im Dev # funktioniert. Produktiv hinter HTTPS (Nginx Proxy Manager) auf true setzen. cookie_secure: bool = False cookie_samesite: str = "lax" # --- Erster Admin, nur beim allerersten Start angelegt ------------------- admin_username: str = "admin" admin_password: str = "changeme" # --- Währung ------------------------------------------------------------- default_base_currency: str = "EUR" # Beim Start die aktuellen EZB-Kurse nachladen (benötigt Internet). ecb_fetch_on_start: bool = True # --- Oeffentliche Adresse ------------------------------------------------ # Unter welcher Adresse Certain von aussen erreichbar ist, z. B. # https://certain.example.com – OHNE Pfad am Ende. # # Gebraucht fuer die Rueckleit-Adresse der SSO-Anmeldung. Die liesse sich # zwar aus der Anfrage ableiten, aber hinter einem Reverse Proxy kaeme # dabei die INTERNE Adresse heraus (http://10.0.0.5:8071/...), und der # Anmeldedienst weist sie ab – mit einer Fehlermeldung, die nicht sagt, # woran es liegt. Wer sie hier hinschreibt, hat das Problem nicht. # # Leer = aus der Anfrage ableiten. Das genuegt ohne Proxy und in der # Entwicklung. public_base_url: str = "" # --- CORS ---------------------------------------------------------------- # Leer = kein Cross-Origin (gleiche Herkunft, da FastAPI das SPA selbst # ausliefert). Kommagetrennte Liste oder "*" nur bei Bedarf. cors_origins: str = "" @property def effective_database_url(self) -> str: if self.database_url: return self.database_url return f"sqlite:///{self.data_dir.rstrip('/')}/app.db" @lru_cache def get_settings() -> Settings: return Settings()