diff --git a/KONZEPT.md b/KONZEPT.md index cc38df6..1a0726f 100644 --- a/KONZEPT.md +++ b/KONZEPT.md @@ -36,7 +36,7 @@ Ein modular aufgebautes System, das bei Disc-Einwurf automatisch den Typ erkennt | Multi-Disc-Set-Handling (Release-Group-Resolver) | ✔ M | | | | SQLite-Cache für API-Rate-Limits | ✔ M | | | | ~~JWT-Auth (Access 15min/Refresh 7 Tage)~~ — GESTRICHEN 24.07.2026, siehe §10 | | | | -| Rate-Limiting (100/min pro Client-IP) | ✔ M | | | +| Rate-Limiting pro Client-IP — ~~100/min~~ **600/min** (26.07.2026, siehe Abweichungen) | ✔ M | | | | Celery-Queue + Redis mit AOF-Persistence | ✔ M | | | | React-UI (statisch via Nginx) | ✔ M | | | | Proxmox LXC Template + Ansible Playbooks | ✔ M | | | @@ -183,6 +183,22 @@ Ein modular aufgebautes System, das bei Disc-Einwurf automatisch den Typ erkennt passlib/bcrypt-Abhängigkeit hat die CI-Ampel gebrochen. Rate-Limiting (pro IP) bleibt. Wer Rippy je nach außen öffnet, stellt einen Reverse-Proxy mit eigener Auth davor (z. B. Authelia/Caddy basicauth). +- **26.07.2026 — Rate-Limit von 100/min auf 600/min:** Das Muss-Feature + („Rate-Limiting pro Client-IP") bleibt unverändert, nur die Zahl ändert sich. + Begründung: 100/min lag UNTER Rippys eigener Last. Nachgerechnet an den + Taktgebern im UI verursacht ein einziger offener Tab 111 Anfragen pro Minute + (Dashboard 75 + Log-Kasten 24 + Laufwerks-Suche 12), ein installierter + Windows-Worker weitere 12. Die Bremse griff also im Normalbetrieb permanent — + 97 Antworten mit HTTP 429 im nginx-Log —, und weil das UI einen abgewiesenen + Abruf als „nichts da" verbuchte, leerte sich die Job-Liste im Sekundentakt. + Genau das hat der Commander als „wird oft neu geladen" gemeldet. 600/min = + 10 Anfragen pro Sekunde: Luft für mehrere Tabs und Worker, während der Zweck + der Bremse (ein Skript in einer Endlosschleife, Hunderte pro Sekunde) weiter + erfüllt ist. Die Rechnung steht als Kommentar in `ratelimit.py` und ist durch + `test_grenze_deckt_die_eigene_last_ab` festgehalten — wer die Zahl senkt, muss + dort vorbei. Zweiter Teil derselben Reparatur: Hinter dem nginx ist + `request.client.host` immer der Proxy, alle Clients teilten sich also EINEN + Eimer; jetzt gilt `X-Real-IP`. - **25.07.2026 — 4K-UHD-Disc-Schlüssel: Rippy stellt Platz bereit, keine Schlüssel:** Das Muss-Feature „MakeMKV-Ripping (lossless)" bleibt unverändert; ergänzt wird nur ein **persistentes MakeMKV-Datenverzeichnis**