fix: systemd ohne ProtectHome (venv unter /root sichtbar) + Phase-3-Backend
Deployment-Fixes (Dienst startete nicht -> 203/EXEC "uvicorn not found"): - Unit ohne ProtectHome/ProtectSystem: Repo/venv dürfen unter /root oder /home liegen (ProtectHome=true blendete diese Pfade für den Dienst aus). - install.sh: Python-3.11+-Prüfung mit klarer Meldung; prüft nach der Installation, dass uvicorn wirklich in der venv liegt. - EZB-Kursabruf läuft beim Start jetzt im Hintergrund (blockiert den Start nie). Phase-3-Backend (Dashboard): - Modell + Migration 0004: dashboard_layouts (JSON-Layout je Nutzer). - routers/dashboard: Layout speichern/laden/zurücksetzen + Kartendaten (Budget-Donut, Budget-Fortschritt, Einnahmen/Ausgaben, Kontostände, Vermögensverlauf, letzte Buchungen). - Frontend-Infrastruktur: Chart-Komponenten (Donut/Line), palette, API-Methoden, react-grid-layout. (Dashboard-Seite folgt im nächsten Commit.) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+16
-2
@@ -5,6 +5,7 @@ gebaute Frontend (``web/dist``) aus – hinter dem Nginx Proxy Manager des Nutze
|
||||
Beim Start werden die Alembic-Migrationen angewandt und der erste Admin angelegt.
|
||||
"""
|
||||
|
||||
import threading
|
||||
from contextlib import asynccontextmanager
|
||||
from pathlib import Path
|
||||
|
||||
@@ -22,6 +23,7 @@ from .routers import (
|
||||
auth,
|
||||
budgets,
|
||||
categories,
|
||||
dashboard,
|
||||
rates,
|
||||
settings as settings_router,
|
||||
transactions,
|
||||
@@ -44,10 +46,21 @@ async def lifespan(app: FastAPI):
|
||||
db = SessionLocal()
|
||||
try:
|
||||
ensure_first_admin(db)
|
||||
# Best-effort: aktuelle EZB-Kurse nachladen (ohne Internet läuft es weiter).
|
||||
ecb_rates.ensure_rates_on_startup(db, settings.ecb_fetch_on_start)
|
||||
finally:
|
||||
db.close()
|
||||
|
||||
# EZB-Kurse im HINTERGRUND laden – der Start darf nie darauf warten
|
||||
# (langsames/geblocktes Netz oder hängendes DNS würde den Dienst sonst
|
||||
# blockieren und der Health-Check nie grün werden).
|
||||
if settings.ecb_fetch_on_start:
|
||||
def _laden() -> None:
|
||||
s = SessionLocal()
|
||||
try:
|
||||
ecb_rates.ensure_rates_on_startup(s, True)
|
||||
finally:
|
||||
s.close()
|
||||
|
||||
threading.Thread(target=_laden, name="ecb-rates", daemon=True).start()
|
||||
yield
|
||||
|
||||
|
||||
@@ -89,6 +102,7 @@ api.include_router(accounts.router)
|
||||
api.include_router(categories.router)
|
||||
api.include_router(transactions.router)
|
||||
api.include_router(budgets.router)
|
||||
api.include_router(dashboard.router)
|
||||
api.include_router(rates.router)
|
||||
|
||||
app.include_router(api)
|
||||
|
||||
Reference in New Issue
Block a user