Admin-Panel (/admin): Auth, Spieler-Tracking, Live-Tuning, Bild-Verwaltung

- Passwortgeschütztes Panel unter /admin (Auto-Passwort 20 Zeichen, per CLI abrufbar:
  `node server/admin.js password` / `password reset`), In-Memory-Sessions + Cookie,
  Login-Rate-Limit.
- Spieler-Tracking: pro Score IP (CF/XFF/req.ip), Gerät/Browser (ua-parser-js),
  grober Ort (geoip-lite, offline) -> data/players.json; Aggregation pro Name.
- Live-Tuning: configStore (data/config.json) für Timer + Schwierigkeitskurve; Server
  (makeRound) und Client (/api/config) lesen daraus -> Änderungen ohne Neustart.
- Bild-Verwaltung: Upload/Löschen von Füßen & Deko (multer) + rescanLibrary().
- Panel-Aktionen: Spieler bannen/entbannen, Rangliste heute/alles leeren.
- Fix: .item object-fit:contain -> nicht-quadratische Bilder werden nicht mehr verzerrt.
- trust proxy für korrekte Client-IP hinter Reverse-Proxy/Cloudflare.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Guido
2026-08-05 22:19:52 +02:00
parent 51909deb9f
commit 5018ab753a
12 changed files with 1357 additions and 92 deletions

View File

@@ -11,6 +11,7 @@
import { readLeaderboard, buildBoards, deletePlayer, clearAll, clearToday } from './leaderboardStore.js';
import { getMode, setMode } from './modeStore.js';
import { banPlayer, unbanPlayer, readBans } from './banStore.js';
import { getPassword, resetPassword } from './adminAuth.js';
const [, , cmd, ...rest] = process.argv;
const arg = rest.join(' ').trim();
@@ -80,6 +81,17 @@ switch (cmd) {
break;
}
case 'password': {
if (arg === 'reset') {
console.log('🔑 Neues Admin-Passwort: ' + resetPassword());
} else {
console.log('🔑 Admin-Passwort: ' + getPassword());
console.log(' (neu erzeugen: node server/admin.js password reset)');
}
console.log(' Login unter: /admin');
break;
}
case 'mode': {
const sub = (rest[0] || '').toLowerCase();
if (sub === 'public') {
@@ -112,6 +124,10 @@ Bannen (namensbasiert):
node server/admin.js unban "<name>" Sperre aufheben
node server/admin.js bans gebannte Namen anzeigen
Admin-Panel (/admin):
node server/admin.js password Admin-Passwort anzeigen
node server/admin.js password reset neues Passwort erzeugen
Betriebsmodus (Spiel oeffentlich / privat):
node server/admin.js mode aktuellen Modus anzeigen
node server/admin.js mode public Spiel oeffentlich unter "/"