patrickandClaude Sonnet 5 107cba99f9
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(redis): INCR+EXPIRE atomar via Pipeline (MULTI/EXEC)
Login-, TOTP- und Kiosk-PIN-Lockout zählten Fehlversuche mit separaten
INCR/EXPIRE-Calls. Zwischen beiden konnte der Fail-Counter-Key kurzzeitig
ohne TTL bestehen bleiben (Crash-Fenster) - nicht atomar. Jetzt per
redis.pipeline(transaction=True) als MULTI/EXEC.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015Ahyx6D3r7G1EuAc42nezn
2026-09-03 00:12:44 +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
1.6 MiB
Languages
JavaScript 60.2%
Python 22.8%
TypeScript 16.2%
Shell 0.8%