PokerClock ist eine auf Spring Boot + React basierende Webanwendung zur digitalen Vorbereitung, Durchführung und Verwaltung von Pokerturnieren mit unterstützenden Features wie einer zufälligen Tischverteilung, Verwaltung der Blingstrukturen, Tisch- und Rebuymanagement und abschließendem Tunierabschluss.
- Funktionen & Features
- Exemplarischer Turnierablauf
- Architektur
- Technologie-Stack
- Projekt-Struktur
- Build & Entwicklung
- Docker: Build, Deploy & Start
- MiniPC & Android-PWA MVP
- Installed Services
- Aktueller Entwicklungsstand
- Screenshots der Anwendung
- Beiträge & Änderungswünsche
- Lizenz
- Haftungsausschluss
- ✓ Mehrstufige Registrierung mit gruppierten Eingaben
- ✓ Flexibles Rebuy-System
- ✓ Blindstruktur-Editor mit Levels + Breaks
- ✓ Speichern von Registrierungsvorlagen in PostgreSQL beziehungsweise Import/Export für Turniervorlagen
- ✓ Automatische zufällige Tischverteilung
- ✓ Dealer- und Blinds-Positionen
- ✓ Optionale Neutral-Dealer-Regel
- ✓ Visuelle Vorschau vor Turnierbeginn
- ✓ Echtzeit-Blind-Countdown und Sprachansagen
- ✓ Spielerstatus, Rebuys und Seat Open
- ✓ Pause, Resume und Turnierende
- ✓ Tischmanagement im pausierten Turnier
- ✓ Zusammenfassung mit Turnier-Statistiken
- ✓ Automatische Preispool-Berechnung
- ✓ Auszahlungs-Presets und individuelle Verteilungen
- ✓ Deal-Modus mit Spieler-Auswahl
- ✓ Validierung und optionales Speichern von Ergebnissen
- ✓ Authentifizierung und Session-Management
- ✓ Responsives Design für Desktop und Tablet
- ✓ Sound-Einstellungen und Dark Mode
- ✓ Persistent Login und Benutzerfeedback
- Benutzer meldet sich mit berechtigtem Account an.
- Session-Token wird im Frontend gespeichert.
- Turnierdaten, Buy-in-/Rebuy-Regeln, Teilnehmerliste und Blindstruktur erfassen.
- Optional als Vorlage speichern oder bestehende Vorlage laden.
- Turnier aus Vorlage erstellen.
- Sitzplätze werden auf Tische verteilt und im Vorbereitungsscreen angezeigt.
- In der Tischverteilung wird mit „Turnier kann beginnen“ auf die Turnierseite gewechselt.
- Das Turnier befindet sich dort zunächst im Zustand bereit.
- Erst mit Shuffle Up and Deal startet Level 1 fachlich und technisch.
- Während des Spiels: Seat Open markieren und Rebuy erfassen.
- Bei Bedarf Turnier pausieren, zum Beispiel für organisatorische Aktionen.
- Tische ausgleichen: Ein Spieler wird vom größten zum kleinsten aktiven Tisch verschoben.
- Final Table erstellen: Verfügbare aktive Spieler werden auf Tisch 1 zusammengeführt.
- Beide Aktionen sind nur verfügbar, wenn das Turnier pausiert ist.
- Turnier beenden öffnet die Zusammenfassung mit Kennzahlen.
- Preispool berechnen, Auszahlungsmodus wählen und Spieler zuordnen.
- Ergebnis optional im Backend speichern.
PokerClock folgt einer klassischen Client-Server-Architektur:
- REST-API für Turnierverwaltung, Authentifizierung und Echtzeit-Status
- PostgreSQL-Datenbank für persistente Speicherung (Registrierungsvorlagen, Turniere, Ergebnisse)
- JPA/Hibernate für Datenzugriff und Entitätsverwaltung
- Service-Layer als zentrale fachliche Logik für Turnierzustände, Zeitberechnung, Tischverteilung, Rebuy-Verarbeitung und Ergebnisaufbereitung
- Endpoints:
/api/auth/– Login, Logout, Authentifizierung/api/registration/templates/– Registrierungsvorlagen (CRUD, Import/Export)/api/– Turnier-Setup, Status, Aktionen (Start, Pause, Resume, End, Seat Open, Rebuy)/api/table/– Tischmanagement (Balancing, Final Table)/api/results– Optionale Speicherung von Turnierergebnissen
- Ein Turnier durchläuft die Zustände READY, RUNNING, PAUSED und ENDED.
- Der Wechsel von der Tischverteilung auf die Turnierseite ist bewusst vom echten Start getrennt.
- Erst über Shuffle Up and Deal beginnt das Turnier fachlich: Die Startsequenz wird abgespielt und die Uhr wird gestartet.
- Organisatorische Eingriffe wie Tische ausgleichen und Final Table erstellen sind ausschließlich im Zustand PAUSED erlaubt.
- Die Tischverteilung wird serverseitig als JSON im Turnier gespeichert und bei Statusabfragen an das Frontend zurückgegeben.
- Das Frontend arbeitet zustandsorientiert mit den Ansichten Registrierung, Tischverteilung, Turnier und Zusammenfassung.
- Die Turnierseite verwendet denselben Status-Endpunkt sowohl für Clock, Blindinformationen und Kennzahlen als auch für die Anzeige des aktuellen Tischplans.
- Die Ergebniszusammenfassung ist als kontrollierter Abschlussdialog umgesetzt: Sie wird nach Turnierende angezeigt und kann nur über die vorgesehenen Aktionen verlassen werden.
- React-Komponenten für alle Phasen (Authentifizierung, Registrierung, Tischverteilung, Turnier, Ergebnisse)
- Vite als Build-Tool und Dev-Server
- CSS Modules für Styling
- ✓ Responsive Design für Desktop und Tablet
- PostgreSQL läuft im Docker Container
- Hibernate-Schemaaktualisierung und kompatible Schema-Patches für vorhandene Datenvolumes
- Volumes für Datenpersistenz über Container-Restarts
- Session-basiert mit Token-Header (
X-Auth-Token) - Benutzer in PostgreSQL verwaltet
| Komponente | Technologie | Version |
|---|---|---|
| Backend | Spring Boot | 4.0.5 |
| Language (Backend) | Java | 25 |
| Language (Frontend) | JavaScript (React) | ES2020+ |
| Database | PostgreSQL | - |
| Build (Frontend) | Vite | 5.4 |
| Container | Docker & Docker Compose | - |
| ORM | JPA/Hibernate | - |
PokerClock/
├── backend/
│ ├── src/main/java/com/pokerclock/
│ │ ├── api/ # REST DTOs (Request/Response)
│ │ ├── controller/ # REST Endpoints
│ │ ├── model/ # JPA Entities
│ │ ├── repository/ # Data Access Layer (JPA)
│ │ ├── service/ # Business Logic
│ │ └── config/ # Spring Config (Security, Web, DB)
│ ├── pom.xml # Maven Dependencies
│ └── Dockerfile # Container für Backend
│
├── frontend/
│ ├── src/
│ │ ├── pages/ # Page Components (Login, Turnier, etc.)
│ │ ├── components/ # Reusable Components
│ │ ├── api.js # API-Client
│ │ ├── App.jsx # Root Component
│ │ └── index.css # Global Styles
│ ├── package.json # NPM Dependencies
│ ├── vite.config.js # Vite Config
│ └── Dockerfile # Container für Frontend
│
├── docker-compose.yml # Orchestration (Backend, Frontend, DB)
└── README.md # Diese Datei
- Node.js 18+ (für Frontend)
- Java 25 (für Backend)
- Maven 3.8+ (für Backend)
cd backend
mvn spring-boot:run✓ Backend verfügbar unter http://localhost:8080
cd frontend
npm install
npm run dev✓ Frontend verfügbar unter http://localhost:5173 (oder wie in der Konsole angezeigt)
cd frontend
npm install
npm run build
# Output: dist/cd backend
mvn clean package -DskipTests
# Output: target/pokerclock-backend-0.0.1-SNAPSHOT.jar-
Docker Engine und Docker Compose starten
-
Umgebungsvariablen vorbereiten (Pflicht):
# macOS / Linux cp .env.example .env# Windows PowerShell Copy-Item .env.example .env
Dann in
.envsichere Werte setzen:POSTGRES_PASSWORDDB_PASSWORD- Beide Passwortwerte müssen identisch sein.
Beim ersten Start werden die Demo-Konten
Admin(admin),Floorman(floorman),Tisch1(tisch) undTisch2(tisch) angelegt. Für einen produktiven Betriebsecrets/users.example.jsonnachsecrets/users.jsonkopieren, sichere Passwörter setzen undAPP_SEED_USERS_FILE=./secrets/users.jsonin.enveintragen. Die lokale Datei ist von Git ausgeschlossen und wird von Docker nur read-only als Secret an das Backend übergeben. -
Im Projektstamm den Stack bauen und im Hintergrund starten:
docker compose up --build -d
-
Start prüfen:
docker compose ps docker compose exec backend curl -f http://localhost:8081/actuator/health -
Anwendung testen:
- Direkt auf dem Host:
http://127.0.0.1:8085 - Hinter einem System-Nginx: über den dort eingerichteten Hostnamen, zum Beispiel
https://pokerclock.local
- Direkt auf dem Host:
-
Stack stoppen:
docker compose down
| Service | Port | Beschreibung |
|---|---|---|
frontend |
127.0.0.1:8085 |
React App (Nginx), nur lokal für System-Nginx erreichbar |
backend |
keiner | Spring Boot REST API im privaten Compose-Netz |
db |
keiner | PostgreSQL im privaten Compose-Netz |
db_data– PostgreSQL Daten (persistent über Restarts)- Automatische Datenbank-Initialisierung beim ersten Start
cd /srv/docker/pokerclock
docker compose logs --tail=100 db backend frontendDie produktive Zielumgebung ist ein Ubuntu-MiniPC mit Docker Engine. Der Reverse Proxy terminiert HTTPS; Docker Compose veröffentlicht PokerClock ausschließlich auf dem lokalen Host-Port 127.0.0.1:8085.
-
Auf dem MiniPC in das Git-Repository wechseln und lokalen Zustand prüfen:
cd /srv/docker/pokerclock git status --short --branch git fetch originDie produktive
.envundsecrets/users.jsonwerden nicht von Git verwaltet und bleiben beim Branch-Wechsel erhalten. Andere lokale Änderungen, zum Beispiel andocker-compose.yml, müssen vor dem Wechsel übernommen oder gesichert werden:git diff -- docker-compose.yml git stash push -m "MiniPC lokale Compose-Konfiguration" -- docker-compose.yml -
Den Produktiv-Branch
mainauf dem MiniPC auschecken und aktualisieren:cd /srv/docker/pokerclock git checkout main git pull --ff-only origin mainSoll stattdessen ein anderer Branch deployed werden, ersetzt du in beiden Befehlen
main, zum Beispiel:git checkout feature/rollen git pull --ff-only origin feature/rollen
Wenn der Branch auf dem MiniPC noch nicht lokal existiert, verwende:
git checkout -b feature/rollen origin/feature/rollen
-
Zum Projekt wechseln und die Konfiguration prüfen:
cd /srv/docker/pokerclock test -f .env && echo ".env vorhanden" || cp .env.example .env nano .env
POSTGRES_PASSWORDundDB_PASSWORDmüssen identisch sein. Für einen produktiven Betrieb die lokale Benutzer-Secret-Datei erzeugen, mit sicheren Zugangsdaten füllen und den Pfad alsAPP_SEED_USERS_FILEin.envsetzen:cp secrets/users.example.json secrets/users.json chmod 600 secrets/users.json
-
Images für den MiniPC bauen und Container starten:
docker compose up --build -d
-
Start und Backend-Gesundheit prüfen:
docker compose ps docker compose exec backend curl -f http://localhost:8081/actuator/health -
Den externen Zugriff prüfen:
curl --cacert /etc/nginx/certs/home-ca.crt -I https://pokerclock.local
Erwartet wird eine erfolgreiche HTTP-Antwort, nicht
502 Bad Gateway. -
Bei einem Fehler die Containerprotokolle lesen:
docker compose logs --tail=100 db backend frontend
Ein erneutes docker compose up --build -d aktualisiert die Container, ohne das Docker-Volume db_data zu löschen. docker compose down -v entfernt dagegen auch die persistierten Daten und darf nicht für ein normales Update verwendet werden.
Nach einem erfolgreichen Deploy kann PokerClock im Android-Browser als eigenständige Anwendung installiert werden:
https://pokerclock.localin Chrome auf dem Android-Gerät öffnen und anmelden.- Im Chrome-Menü App installieren beziehungsweise Zum Startbildschirm hinzufügen wählen.
- Die Installation bestätigen. PokerClock erscheint anschließend mit eigenem Icon und startet ohne Browser-Adressleiste.
Die Installation setzt voraus, dass Android dem Zertifikat der Home-CA vertraut und das Gerät im Heimnetz pokerclock.local auflösen kann. Bei einem Update wird die PWA beim nächsten Aufruf automatisch aktualisiert. Für eine vollständige Aktualisierung kann die Anwendung einmal geschlossen und erneut geöffnet werden.
PokerClock wird im Heimnetz auf dem Ubuntu-MiniPC unter /srv/docker/pokerclock betrieben. Der MiniPC baut und startet die drei Docker-Compose-Dienste db, backend und frontend. Der Reverse Proxy auf dem MiniPC stellt die Anwendung unter https://pokerclock.local bereit; die Namensauflösung erfolgt durch den bestehenden dnsmasq-Dienst. Die Android-Steuerung verwendet dieselbe responsive React-Anwendung und kann anschließend als PWA installiert werden.
Die folgenden Schritte sind nach Komponenten getrennt. Befehle unter Entwicklungs-PC werden in der lokalen Git-Arbeitskopie ausgeführt. Befehle unter MiniPC werden per SSH auf dem Server ausgeführt.
Komponente: Entwicklungs-PC, im Repository pokerClock
git status
git add README.md
git commit -m "Dokumentiere MiniPC-Deployment"
git push origin feature/rollenWenn die Änderungen bereits auf dem Remote-Branch liegen, entfällt dieser Schritt.
Komponente: MiniPC
cd /srv/docker/pokerclock
git fetch origin
git checkout feature/rollen
git pull --ff-only origin feature/rollen
git status --short --branchLokale produktive Dateien wie .env und secrets/users.json dürfen nicht durch den Git-Abgleich überschrieben werden.
Komponente: MiniPC, Datei /srv/docker/pokerclock/.env
nano /srv/docker/pokerclock/.envDie Datei muss mindestens enthalten:
POSTGRES_PASSWORD=<starkes-datenbankpasswort>
DB_PASSWORD=<dasselbe-datenbankpasswort>
APP_SEED_USERS_FILE=./secrets/users.jsonKomponente: MiniPC, Datei /srv/docker/pokerclock/secrets/users.json
mkdir -p /srv/docker/pokerclock/secrets
cp /srv/docker/pokerclock/secrets/users.example.json /srv/docker/pokerclock/secrets/users.json
nano /srv/docker/pokerclock/secrets/users.json
chmod 600 /srv/docker/pokerclock/secrets/users.jsonIn users.json stehen die Startbenutzer mit ihren Passwörtern. Die Datei wird nicht committed und von Docker read-only als Secret in den Backend-Container eingebunden.
Komponente: MiniPC, Docker Compose im Projektverzeichnis
cd /srv/docker/pokerclock
docker compose config --quiet
docker compose build --no-cache backend frontend
docker compose up -d --force-recreateEin normales Update löscht die Datenbank nicht. docker compose down -v darf nur verwendet werden, wenn die Datenbank einschließlich Benutzer und Turniere bewusst gelöscht werden soll.
Komponente: MiniPC
cd /srv/docker/pokerclock
docker compose ps
docker compose exec backend curl -f http://localhost:8081/actuator/health
docker compose logs --tail=200 db backend frontendDie Container db und backend müssen healthy sein. Beim ersten Start müssen im Backend-Log Einträge wie Seed user 'Admin' created. erscheinen.
Die Seed-Benutzer können ohne Passwörter abgefragt werden:
Komponente: MiniPC, PostgreSQL im Docker-Container
docker compose exec db psql -U postgres -d pokerclock -c \
"SELECT id, username, role, created_at, updated_at FROM app_user ORDER BY id;"Komponente: MiniPC, dnsmasq
getent hosts pokerclock.localDie Ausgabe muss auf die LAN-IP des MiniPCs zeigen. Der vorhandene dnsmasq-Eintrag darf nicht durch einen zweiten Eintrag für denselben Hostnamen dupliziert werden.
Komponente: MiniPC, Reverse Proxy
curl -k -I https://pokerclock.localKomponente: Client im Heimnetz, zum Beispiel Laptop oder Smartphone
Im Browser öffnen:
https://pokerclock.local
Der Reverse Proxy terminiert HTTPS und leitet zum lokal gebundenen PokerClock-Frontend weiter. Backend, Management-Port und PostgreSQL werden nicht direkt im Heimnetz veröffentlicht.
- Entwicklungs-PC: Git-Arbeitskopie, Tests und Push auf den Remote-Branch.
- MiniPC: Git-Checkout, Docker Compose, PostgreSQL, Spring Boot und Frontend-Nginx.
- Reverse Proxy auf dem MiniPC: HTTPS für
pokerclock.localund Weiterleitung zum Frontend. - dnsmasq auf dem MiniPC: Auflösung von
pokerclock.localauf die LAN-IP des MiniPCs. - Client: Zugriff per Browser oder installierter Android-PWA.
Laptop oder Android-PWA
|
https://pokerclock.local
|
Reverse Proxy mit HTTPS auf dem MiniPC
|
127.0.0.1:8085 -> Frontend-Nginx -> /api -> Spring Boot -> PostgreSQL
- Mobile Turniersteuerung liefern: Für kleine Displays eine fokussierte Ansicht mit Uhr, Blindstufen, Spielerzahlen sowie Pause, Fortsetzen, Beenden, Seat Open und Rebuy implementieren. Registrierung und Tischvorbereitung bleiben im MVP auf dem Laptop.
- Mehrgerätebetrieb erweitern und nachweisen: Browser- und Android-PWA-Szenarien gegen den MiniPC durchführen.
- Mehrere berechtigte Geräte dürfen gleichzeitig verbunden sein; ein exklusiver Steuerungs-Lock ist nicht Bestandteil des MVP.
- Eine PWA benötigt eine Verbindung zum Heimnetz und zum MiniPC; Offline-Steuerung gehört nicht zum Umfang.
- Die spätere Entwicklung einer nativen Android-App bleibt möglich, weil sie denselben versionierten API-Vertrag verwenden kann.
- Docker-Deployment auf dem Ubuntu-MiniPC, lokaler Frontend-Port
127.0.0.1:8085, Reverse Proxy, HTTPS unddnsmasqfürpokerclock.local. - Persistierte Workflow-Phasen
REGISTRATION,PREPARATIONundTOURNAMENT. Neu verbundene Browser leiten ihre Ansicht ausGET /api/statusab. - Serverseitig erzeugte Tischverteilung; der Client erzeugt keine fachlich maßgebliche Zufallsverteilung.
- Gemeinsame Ansicht bei Übergängen zwischen Vorbereitung, Turniersteuerung und Registrierung.
- Nach einem Turnierende erscheint die Zusammenfassung auf allen verbundenen Clients.
- Sitzansagen werden nicht mehr bei jedem Status-Poll neu gestartet.
- Optimistische Versionsprüfung mit JPA-
@Version: Jede schreibende Turnieraktion sendet die aus dem Status gelesene Revision imIf-Match-Header. Veraltete Aktionen werden mit409 Conflictabgewiesen; der Client lädt den gemeinsamen Status erneut. - Installierbare PWA mit Web-App-Manifest, App-Icon und Service Worker für
https://pokerclock.local. - Backend-Tests für Workflow-Phasen, Übergänge und Versionskonflikte. Stand dieses Entwicklungsschritts: 40 Tests erfolgreich.
- Speziell verdichtete mobile Turniersteuerung.
Diese Punkte sollten erledigt sein, bevor du die App anderen zeigst oder in ein erreichbares Umfeld deployest.
-
Lokale Secrets setzen, nie committen
.env.examplenach.envkopieren.- Starke Werte für
POSTGRES_PASSWORDundDB_PASSWORDsetzen. - Sicherstellen, dass
.envnicht versioniert ist.
-
Seed-Benutzer konfigurieren
- Eine lokale
secrets/users.jsonaussecrets/users.example.jsonerzeugen. - Sichere Passwörter setzen und
APP_SEED_USERS_FILE=./secrets/users.jsonin.enveintragen. - Die Seed-Datei wird von Docker als read-only Secret an das Backend übergeben.
- Eine lokale
-
Image/Code-Stand bereinigen
- Keine Build-Artefakte in Git (
target/,dist/). - Keine temporären lokalen Dateien mit Zugangsdaten im Repo.
- Keine Build-Artefakte in Git (
-
Sichtprüfung vor Freigabe
git statusmuss sauber sein.- Nochmal nach harten Credentials suchen (z. B. mit
gitleaks).
-
Secrets-Management erzwingen
- Keine Klartext-Secrets in
Deployment,ConfigMap,values.yaml. - Secrets nur über
Secret, Sealed Secrets, External Secrets oder Vault. - Keine Default-Passwörter verwenden.
- Keine Klartext-Secrets in
-
Produktionsfähige Authentifizierung verwenden
- Aktuell ist die Session-Verwaltung in-memory und auf einfache Nutzung ausgelegt.
- Für offene Umgebungen stattdessen robuste Auth-Lösung einsetzen (z. B. OIDC/JWT + serverseitige Session-/Token-Strategie).
- Token-Lebensdauer, Logout-Invalidierung und Rotationsstrategie definieren.
-
Transport & Ingress absichern
- Nur HTTPS/TLS, HTTP auf HTTPS umleiten.
- CORS restriktiv setzen (nur benötigte Origins).
- Security-Header auf Ingress/Proxy aktivieren.
-
Datenbank absichern
- DB nicht öffentlich exponieren.
- Eigener DB-User mit minimalen Rechten.
- Backups, Restore-Test und Rotationsprozess für DB-Credentials definieren.
-
Container-Härtung
- Images mit festen Versionen bauen, regelmäßig patchen.
- Container möglichst als non-root ausführen.
readOnlyRootFilesystem,allowPrivilegeEscalation: false, sinnvollesecurityContextsetzen.
-
Netzwerk- und Laufzeitschutz
NetworkPolicyfür minimale Verbindungen.- Ressourcenlimits und Requests setzen.
- Liveness/Readiness-Probes aktiv halten.
-
Betrieb & Monitoring
- Zentrales Logging und Metriken aktivieren.
- Alerting für Fehlerquoten, Restart-Loops, Auth-Fehler, DB-Verbindungsprobleme.
- Auditierbare Deployment-Pipeline verwenden.
-
Compliance vor Public Release
- Git-Historie auf alte Secrets prüfen und ggf. bereinigen.
- Alle früher verwendeten Credentials rotieren.
- Optional: Secret-Scanning als CI-Gate erzwingen.
- Lokalen Stand committen und
git statusprüfen. - Secret-Scan über aktuellen Stand und Historie durchführen.
- Betroffene Credentials rotieren.
- Erst danach Repository/Deployment öffentlich machen.
Beschreibung:
- Authentifizierung mit Benutzername und Passwort
- Session-Token wird nach Login gespeichert
- Fehlerbehandlung bei falschen Credentials
Beschreibung:
- Turnierdaten: Name, Standort, Starting Stack
- Finanzielle Parameter: Buy-in in EUR, Rebuy-Optionen mit Preisen
- Teilnehmer: Liste der Spieler (kommagetrennt oder zeilenweise)
- Blindstruktur-Editor:
- Levels mit Small Blind / Big Blind
- Pause-Einträge
- Drag & Drop zum Reordern
- Standardstruktur verfügbar
- Speichern & Importieren: JSON-Export und -Import von Vorlagen
Beschreibung:
- Visuelle Darstellung der Tischverteilung
- Alle Spieler sind zugeordnet
- Dealer- und Blinds-Positionen sind markiert
- Kontrollierter Übergang mit „Turnier kann beginnen“
- Bestätigungsdialog vor dem Wechsel auf die Turnierseite
- Noch kein Sound und kein Start der Uhr in dieser Phase
- Möglichkeit, zur Konfiguration zurückzukehren
Beschreibung:
- Ready-Phase vor dem echten Start: Nach dem Wechsel auf die Turnierseite ist zunächst nur der Turnierstatus sichtbar.
- Shuffle Up and Deal ist der fachliche Startpunkt: Erst dann laufen Beep-Sequenz, Sprachansage und Clock.
- Live Clock: Countdown für aktuelle Blindstufe
- Current Blinds: SB/BB-Werte und nächste Stufe
- Spieler-Statistiken: Entries, Players Left, Average Stack, Total Chips
- Rebuys: Gezählte Rebuys während des Turniers
- Tischplan: Alle aktiven Spieler mit Live-Anzeige
- Kontrollbuttons: abhängig vom Zustand, z. B. Shuffle Up and Deal, Pause, Resume, End Tournament
Beschreibung:
- Klick auf einen Spieler öffnet diese Detailansicht
- Seat Open: Spieler als ausgeschieden markieren
- Rebuy: Spieler mit neuem Stack zurück ins Spiel nehmen
- Daten werden in Echtzeit aktualisiert
Nach dem Klick auf „Turnier beenden":
- Bestätigungsdialog in der App (kein Browser-Popup)
- Summary Modal mit:
- Turnier-Statistiken (Dauer, Einträge, Rebuys, Spieler übrig)
- Preispool-Berechnung: Buy-in × Entries + Rebuy × Rebuys
- Auszahlungs-Presets: 60/40, 50/30/20, oder Custom Top-N
- Deal-Modus: Spielerbasierte Verteilung (ICM-Deals)
- Eingabe-Modi: Prozent oder Betrag
- Spieler-Auswahl: Automatische Vorschläge nach Ausscheidungsreihenfolge
- Optionales Speichern: Ergebnis im Backend persistieren
- Kontrollierter Abschluss: Die Zusammenfassung bleibt geöffnet, bis sie über die vorgesehene Aktion beendet wird
Technische Einordnung:
- Die Zusammenfassung verwendet die finalen Statusdaten des Turniers und ergänzt diese um berechnete Werte wie Preispool, Summenprüfung und Auszahlungsmodelle.
- Die Eingabemaske validiert Summen, doppelte Spielerzuordnungen und unvollständige Payout-Zuordnungen direkt im Frontend.
- Optional kann die komplette Ergebnisstruktur inklusive Konfiguration und Auszahlungen über
/api/resultsim Backend archiviert werden.
# Terminal 1: Backend
cd backend && mvn spring-boot:run
# Terminal 2: Frontend
cd frontend && npm run dev→ Öffne http://localhost:5173
cd /srv/docker/pokerclock
docker compose up --build→ Öffne https://pokerclock.local
→ Logs: docker compose logs --tail=100 db backend frontend
# Frontend
cd frontend && npm run build
# Backend
cd backend && mvn clean package -DskipTests
Dieses Repository ist öffentlich. Damit gilt aktuell:
- Die Anwendung kann angesehen und geklont werden.
- Forks des Repositories sind erlaubt.
- Direkte Änderungen am Original-Repository sind nur durch den Repository-Eigentümer möglich.
- Externe Beiträge sollen als GitHub Issue dokumentiert werden.
Wenn du einen Fehler melden oder eine Änderung vorschlagen möchtest, nutze bitte den Bereich Issues im GitHub-Repository.
Verwendet werden dafür aktuell diese Vorlagen:
- Bug Report für Fehler, Fehlverhalten und technische Probleme
- Feature Request für neue Funktionen, UX-Ideen oder Änderungswünsche
Ein gutes Issue enthält nach Möglichkeit:
- eine kurze, präzise Überschrift
- eine Beschreibung des aktuellen Verhaltens
- eine Beschreibung des gewünschten Verhaltens
- Schritte zur Reproduktion, falls es sich um einen Fehler handelt
- Screenshots oder Kontextinformationen, falls hilfreich
Das Repository ist bewusst so konfiguriert, dass andere Personen:
- das Projekt lesen können
- das Projekt lokal klonen können
- eigene Forks anlegen können
- Issues anlegen können
Direkte Pushes auf das Original-Repository sind jedoch nicht vorgesehen.
Pull Requests aus Forks sind technisch grundsätzlich möglich, der bevorzugte Weg für Vorschläge und Änderungsanfragen ist in diesem Projekt jedoch weiterhin ein Issue.
Dieses Projekt steht unter der MIT-Lizenz. Die vollständigen Lizenzbedingungen findest du in LICENSE.
Die MIT-Lizenz erlaubt insbesondere:
- Nutzung der Software
- Kopieren und Weitergabe
- Anpassung und Erweiterung
- Veröffentlichung und Weitervertrieb
Dabei muss der Lizenzhinweis erhalten bleiben.
Diese Software wird ohne ausdrückliche oder stillschweigende Gewährleistung bereitgestellt. Die Nutzung erfolgt auf eigene Verantwortung.
Es wird keine Garantie dafür übernommen, dass die Anwendung fehlerfrei funktioniert, für einen bestimmten Zweck geeignet ist oder keine Schäden, Fehlfunktionen, Datenverluste oder sonstige Probleme verursacht.
Die Haftung richtet sich im Übrigen nach den Regelungen der MIT-Lizenz.





