docs(konzept): Rate-Limit 100/min -> 600/min als Abweichung vermerkt
Ampel / ampel (push) Successful in 32s

Regel B: keine stille Aenderung an einer KONZEPT-Vorgabe. Das Muss-Feature
"Rate-Limiting pro Client-IP" bleibt, nur die Zahl aendert sich - mit der
Rechnung, die zeigt warum: 100/min lag unter Rippys eigener Last (ein offener
Tab braucht 111/min, ein Windows-Worker 12 dazu). Festgehalten durch
test_grenze_deckt_die_eigene_last_ab, damit die Zahl nicht unbemerkt zurueck
unter die Grundlast wandert.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-07-26 17:09:23 +02:00
parent 163216a68e
commit a9cfcb272a
+17 -1
View File
@@ -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**