Simple App um Ausleihen zu verwalten.
  • Python 29.9%
  • CSS 26.7%
  • JavaScript 20.4%
  • HTML 15.8%
  • Shell 5.4%
  • Other 1.8%
Find a file
2026-03-10 14:27:23 +01:00
app chore: change login 2026-03-10 12:56:18 +01:00
data feat: initial features 2026-03-04 20:36:03 +01:00
static fix. mobile view 2026-03-10 14:27:23 +01:00
templates fix. mobile view 2026-03-10 14:27:23 +01:00
.gitignore chore: change login 2026-03-10 12:56:18 +01:00
docker-compose.yml chore: change login 2026-03-10 12:56:18 +01:00
Dockerfile fix: rights 2026-03-10 13:09:37 +01:00
entrypoint.sh fix: rights 2026-03-10 13:09:37 +01:00
LICENSE Initial commit 2026-03-03 21:49:04 +01:00
nginx-leihapp.conf chore: change login 2026-03-10 12:56:18 +01:00
README.md chore: change port 2026-03-06 06:20:29 +01:00
requirements.txt chore: change login 2026-03-10 12:56:18 +01:00
start.sh feat: initial features 2026-03-04 20:36:03 +01:00

LeihApp

Einfache Ausleihverwaltung auf Basis von FastAPI + SQLite. Läuft hinter Authelia (SSO) und nginx Reverse Proxy.


Schnellstart (lokal, ohne Docker)

chmod +x start.sh
./start.sh

http://127.0.0.1:4444

DEV_MODE=true ist gesetzt Authelia-Header werden nicht erzwungen. Zum Überschreiben einzelner Variablen eine .env.local anlegen:

# .env.local (wird von start.sh geladen, nicht einchecken!)
DATABASE_URL=sqlite:///./data/leihapp.db

Docker

Build & Start

docker compose up -d --build

Die SQLite-Datenbank liegt im Volume leihapp_data.

Netzwerk

Der Container hängt im externen Docker-Netz proxy das gemeinsame Netz deines nginx Proxy Managers. Anlegen falls noch nicht vorhanden:

docker network create proxy

Deployment hinter nginx + Authelia

  1. nginx-leihapp.conf als Custom-Config in nginx Proxy Manager einfügen (oder in deine bestehende nginx.conf integrieren).
  2. leihapp.example.com und auth.example.com anpassen.
  3. Authelia muss Remote-User und Remote-Name als Response-Header an nginx zurückliefern (Standard-Verhalten).

Projektstruktur

leihapp/
├── app/
│   ├── main.py          # FastAPI-App, Middleware, User-Dependency
│   ├── database.py      # SQLAlchemy Engine & Session
│   ├── models.py        # ORM-Modelle (Ausleihe, Person)
│   ├── schemas.py       # Pydantic-Schemas mit Validierung
│   ├── security.py      # SecurityHeadersMiddleware
│   └── routers/
│       ├── leihen.py    # CRUD-Endpunkte /api/ausleihen
│       └── personen.py  # GET /api/personen (Datalist-Befüllung)
├── templates/
│   └── index.html       # Jinja2-Template (Single Page)
├── static/
│   ├── css/style.css
│   └── js/app.js
├── data/                # SQLite-Datei (gitignore!)
├── Dockerfile
├── docker-compose.yml
├── nginx-leihapp.conf
├── requirements.txt
└── start.sh

Sicherheitsmaßnahmen

Maßnahme Details
Authelia-Auth Remote-User/Remote-Name Header, DEV_MODE erzwingt Fallback nur lokal
Rate Limiting slowapi 30 POST/min, 120 GET/min je IP
Input-Validierung Pydantic mit Regex für Namen, Längen-Limits überall
CSP default-src 'self', kein Inline-Script
Security-Header X-Frame-Options DENY, X-Content-Type-Options, Referrer-Policy
ORM Kein Raw-SQL SQLAlchemy verhindert SQL-Injection
Non-root Container appuser ohne Shell
Healthcheck Docker-native, /health ohne Auth
HSTS Über nginx gesetzt (nicht doppelt)

API-Endpunkte

Methode Pfad Beschreibung
GET /api/ausleihen?filter=offen&suche=… Liste (filter: offen/mit_rueckgabe/beendet/alle)
POST /api/ausleihen Neue Ausleihe anlegen
PATCH /api/ausleihen/{id}/rueckgabe Rückgabe mit Datum erfassen
DELETE /api/ausleihen/{id} Ausleihe löschen
GET /api/personen Bekannte Personen (für Datalist)
GET /health Healthcheck