- Rate Limiting ueber ASP.NET Cores eingebautes Microsoft.AspNetCore.RateLimiting (keine neue Paketabhaengigkeit): /api/auth/login auf 5 Versuche/Minute begrenzt (Brute-Force-Schutz), alle Endpunkte zusaetzlich global auf 120 Anfragen/Minute je IP - Kestrel MaxRequestBodySize auf 15 MB gedeckelt (Anhaenge sind clientseitig ohnehin auf 10 MB begrenzt) - Neu docker/backup.sh: Tar-Archiv von ./data (Ereignis-Logs, Snapshots, Anhaenge, Nutzer), raeumt Archive aelter als 30 Tage auf, laeuft direkt auf dem Host - docker/README.md um Backup- und Rate-Limit-Dokumentation ergaenzt Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
LehrerApp.Api – Deployment per Docker
Starten
cd docker
JWT_SECRET=<zufälliger-langer-string> docker compose up -d
./data (relativ zu docker/) wird als Volume gemountet und enthält alle Server-Daten
(Ereignis-Logs, Snapshots, Nutzer) – bei Neustarts/Updates bleibt es erhalten.
Nutzer anlegen
Es gibt keine offene Registrierung (/api/auth/register). Neue Nutzer werden per CLI im
laufenden Container angelegt:
docker compose exec api dotnet LehrerApp.Api.dll create-user <benutzername>
Fragt interaktiv nach einem Passwort (mind. 12 Zeichen). Alternativ nicht-interaktiv, z. B. aus einem Skript:
docker compose exec api dotnet LehrerApp.Api.dll create-user <benutzername> --password "<passwort>"
Der Befehl beendet sich danach sofort wieder, ohne den API-Dienst zu starten – für den
eigentlichen Serverbetrieb läuft docker compose up unverändert weiter.
Backup
backup.sh sichert ./data (Ereignis-Logs, Snapshots, Anhänge, Nutzer) als komprimiertes
Tar-Archiv unter docker/backups/ und räumt Archive älter als 30 Tage automatisch auf. Läuft
direkt auf dem Host (kein Container-Zugriff nötig, ./data liegt dort per Bind-Mount ohnehin):
./docker/backup.sh
Für regelmäßige Sicherung z. B. per Cron, einmal täglich nachts:
0 3 * * * /pfad/zu/docker/backup.sh >> /pfad/zu/docker/backup.log 2>&1
Rate Limiting
/api/auth/login ist auf 5 Versuche pro Minute begrenzt (Brute-Force-Schutz). Alle übrigen
Endpunkte sind zusätzlich global auf 120 Anfragen pro Minute je IP begrenzt. Anhänge sind auf
15 MB Anfragegröße gedeckelt (Kestrel MaxRequestBodySize), einzelne Dateien clientseitig
zusätzlich auf 10 MB (IAttachmentStorage.MaxSizeBytes).