Die Adresse, an die der Anmeldedienst zurueckschickt, wurde aus der Anfrage abgeleitet. Hinter einem Proxy ist das die INTERNE – http://10.0.0.5:8071/… –, denn uvicorn lief ohne --proxy-headers. Der Anmeldedienst haette die Rueckleitung abgewiesen, mit einer Meldung, die nicht sagt, woran es liegt. APP_PUBLIC_BASE_URL sagt es ihm jetzt ausdruecklich. Leer bleiben darf sie weiterhin: ohne Proxy und in der Entwicklung genuegt die Anfrage. Die Referenz-Unit bekommt zusaetzlich --proxy-headers. Das hilft neuen Installationen; bestehende ruehrt update.sh nicht an, deshalb ist die Einstellung der verlaessliche Weg. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
70 lines
2.9 KiB
Python
70 lines
2.9 KiB
Python
"""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()
|