Simple App um Ausleihen zu verwalten.
- Python 29.9%
- CSS 26.7%
- JavaScript 20.4%
- HTML 15.8%
- Shell 5.4%
- Other 1.8%
| app | ||
| data | ||
| static | ||
| templates | ||
| .gitignore | ||
| docker-compose.yml | ||
| Dockerfile | ||
| entrypoint.sh | ||
| LICENSE | ||
| nginx-leihapp.conf | ||
| README.md | ||
| requirements.txt | ||
| start.sh | ||
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
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
nginx-leihapp.confals Custom-Config in nginx Proxy Manager einfügen (oder in deine bestehendenginx.confintegrieren).leihapp.example.comundauth.example.comanpassen.- Authelia muss
Remote-UserundRemote-Nameals 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 |