patrickandClaude Sonnet 5 1d163cc299
Security Audit / Python Dependency Audit (push) Canceled after 0s
Security Audit / Node.js Dependency Audit (push) Canceled after 0s
Security Audit / Frontend Build (tsc + vite) (push) Canceled after 0s
fix(security): Audit-Nachzug – Rate-Limit, X-Real-IP-Vertrauen, Indizes
Security-Audit 2026-09-10 (siehe Ed25519-Reinstall-Commits):
- Rate-Limit 10/min auf POST /kiosk/my-qr-token (Q-1) – kompromittiertes
  Employee-JWT konnte sonst unbegrenzt QR-Login-Tokens erzeugen.
- _get_client_ip vertraut X-Real-IP nur noch, wenn die Verbindung selbst
  von 127.0.0.1 kommt (I-1) – sonst könnte ein Client den Header selbst
  setzen und die Kiosk-IP-Whitelist umgehen.
- Migration 0047: Unique-Index auf kiosk_devices.device_token_hash (B-2,
  war Seq-Scan pro Bearer-Request), Index auf time_entries.kiosk_device_id
  (K-1). RLS auf kiosk_devices bereits seit Migration 0024 vorhanden,
  K-1-Verdacht einer RLS-Lücke damit ausgeräumt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dzdm3EWeNdYFUuXFRJryA1
2026-09-10 15:33:12 +02:00
2026-05-23 21:16:24 +02:00

TimeMaster

Zeiterfassung & HR-Tool (Zeiterfassung, Abwesenheiten, Kiosk-Terminals, Reports) – DSGVO-konform, EU-Server. Multimandantenfähig mit strikter Company-Isolation über PostgreSQL Row-Level-Security.

Tech-Stack

  • Backend: Python 3.12 · FastAPI · SQLAlchemy (async) · PostgreSQL 16 · Redis 7 · Alembic
  • Frontend: React 18 · TypeScript · Tailwind CSS · Vite
  • Deployment: nativ auf Ubuntu (systemd + nginx), kein Docker
  • Tests: pytest + pytest-asyncio + pytest-cov

Features (Auszug)

  • Zeiterfassung mit ArbZG-Prüfung (Pausen, Höchstarbeitszeit, Ruhezeiten)
  • Abwesenheiten: Urlaub (mit Pro-rata/Teilzeit-Anspruch), Krankmeldung (Bradford-Faktor), Zwei-Stufen-Genehmigung
  • Kiosk-Terminals: Ed25519-signierte PC-Terminals, NFC+PIN, QR-Code-BYOD-Stempeln
  • 2FA (TOTP), LDAP-Sync, CalDAV-Export, iCal-Abo-Feed
  • Reports & Exports: CSV/XLSX/PDF, DATEV-Monatsblatt für Steuerberater
  • Reseller/Mandantenverwaltung, Audit-Log, DSGVO-Datenexport (Art. 15) + Löschkonzept

API-Dokumentation

Vollständige Endpunkt-Referenz: docs/api.md. Interaktive Swagger-UI (/docs) und ReDoc (/redoc) sind nur im Development-Modus aktiv, nicht in Production.

Setup

Migrationen und Tests laufen nicht lokal, sondern auf dem Zielserver (kein lokales Postgres/Redis vorausgesetzt).

Server-Neueinrichtung (Debian 13, als root):

bash setup_server.sh

Installiert Postgres, Redis, nginx, Python-venv, führt Alembic-Migrationen aus und schreibt die nginx-Konfiguration. Danach .env mit echten Secrets befüllen.

Frontend deployen (von einem Rechner mit Node.js, nach dem Server-Setup):

./push-frontend.sh <server-host>

Baut das Frontend (npm run build) und synct dist/ zum Server.

Deployment-Workflow (bestehender Server)

Server pullen git-basiert aus dem eigenen Remote, kein direktes Hochladen von Code:

git push origin main                  # lokal
ssh root@<server> 'cd /opt/timemaster && ./server-update.sh'   # git pull → alembic → restart → health-check

Tests

cd backend
pytest -q

Läuft gegen eine echte PostgreSQL-Testdatenbank (RLS-Policies werden in conftest.py repliziert), kein SQLite. Coverage-Gate: --cov-fail-under=50 in pytest.ini.

S
Description
No description provided
Readme
2 MiB
0 Stars 1 Watchers 0 Forks
Languages
JavaScript 59.2%
Python 23.5%
TypeScript 16.3%
Shell 1%