Add SQLite passive income dashboard with Excel import and deployment tools

This commit is contained in:
kai
2026-09-09 08:46:27 +02:00
parent 729a13bfca
commit afc6f74f36
27 changed files with 1109 additions and 67 deletions
+35 -10
View File
@@ -1,16 +1,41 @@
import sqlite3
from contextlib import asynccontextmanager
from pathlib import Path
from urllib.parse import urlsplit
from fastapi import FastAPI, Request
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
app = FastAPI(title="Finance Dashboard")
templates = Jinja2Templates(directory="/app/templates")
from fastapi.staticfiles import StaticFiles
from database import initialize
from routes import dashboard, income, export
@app.get("/", response_class=HTMLResponse)
async def index(request: Request):
return templates.TemplateResponse(request=request, name="index.html")
@asynccontextmanager
async def lifespan(app):
initialize()
yield
@app.get("/health")
async def health():
return {"status": "ok"}
app = FastAPI(title='Finance Dashboard', lifespan=lifespan)
app.mount('/static', StaticFiles(directory=Path(__file__).parent / 'static'), name='static')
app.include_router(dashboard.router)
app.include_router(income.router)
app.include_router(export.router)
@app.middleware('http')
async def protect_forms(request: Request, call_next):
if request.method == 'POST':
origin = request.headers.get('origin')
if request.headers.get('sec-fetch-site') == 'cross-site' or (origin and urlsplit(origin).netloc != request.headers.get('host')):
return HTMLResponse('Fremder Formularursprung ist nicht erlaubt.', status_code=403)
return await call_next(request)
@app.exception_handler(sqlite3.OperationalError)
async def database_error(request, error):
return HTMLResponse('<html lang="de"><meta charset="utf-8"><h1>Datenbank vorübergehend nicht verfügbar</h1><p>Bitte in einigen Sekunden erneut versuchen.</p><a href="/">Zum Dashboard</a></html>', status_code=503, headers={'Retry-After': '5'})
@app.get('/health')
def health():
return {'status': 'ok'}