Erste Version: HCRB Spieltag-Kalender und Fahrtplaner

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
guyg1474andClaude Opus 5.5 committed 2026-10-10 13:54:33 +02:00
commit 10400eee59
30 files changed
+3771

No files matched your search

+78
View File
@@ -0,0 +1,78 @@
# HCRB – Highcap Rasselbande
Webseite der Airsoft-Gruppe HCRB mit Spieltag-Kalender und Fahrtplaner.
## Starten
```bash
npm install # nur beim ersten Mal
npm start # oder: npm run dev (startet bei Änderungen neu)
```
Vor dem ersten Login einen Benutzer anlegen (Passwort wird verdeckt abgefragt):
```bash
npm run user -- add elias
```
Dann im Browser `http://localhost:3000` öffnen.
Andere Geräte im selben WLAN erreichen die Seite über `http://<IP-dieses-Rechners>:3000`.
Anderen Port wählen: `PORT=8080 npm start`.
## Seiten
- **Start** (`/`) – Startseite mit Platzhaltertext, Links zu Kalender und Fahrtplaner, nächste Spieltage.
- **Kalender** (`/kalender`) – Mitglieder wählen „Ich bin …“, tragen Spieltage ein und sagen zu oder ab.
Über „Fahrt planen“ geht es direkt in den Fahrtplaner, alle Zusagen sind dann schon als „kommt mit“ ausgewählt.
- **Fahrtplaner** (`/fahrt`) – Treffpunkt, Abfahrt (Standard 07:00) und Treffzeit (15 min vorher) festlegen – nach der Berechnung pro Auto änderbar, Mitfahrer auswählen
und pro Fahrt angeben, wer sein Auto dabei hat. Wer immer mit eigenem Auto kommt, fährt immer selbst und bekommt zuerst Mitfahrer.
Wer gern bei jemandem mitfährt, kommt in dessen Auto (oder ins selbe Auto, falls beide mitfahren).
Unter „Feste Zuteilung“ lässt sich vorab festlegen, wer diesmal sicher bei wem mitfährt, Gäste nur für diese Fahrt hinzufügen, Fahrgemeinschaften berechnen,
Ergebnis kopieren oder drucken. „Eingabe zurücksetzen“ leert alles für die nächste Planung.
- **Statistik** (`/statistik`, öffentlich) – wie oft jedes Mitglied (ohne Externe) im laufenden Jahr gespielt hat:
Spieltage mit Zusage aus dem Kalender plus manuelle Korrektur (− / +, nur angemeldet), z. B. für spontane Fahrten.
Zu Neujahr wird der Endstand des Vorjahres archiviert (im Jahresmenü abrufbar) und die Zählung beginnt bei 0.
Die Startseite zeigt als „Pile of Shame“, wer im laufenden Jahr noch nicht spielen war.
Der Jahreswechsel richtet sich nach der Zeitzone des Servers (im systemd-Dienst `Environment=TZ=Europe/Berlin` setzen).
- **Gruppe** (`/gruppe`) – feste Mitglieder (Vorname, extern ja/nein, Auto ja/nein, freie Plätze ohne Fahrer, „kommt immer mit eigenem Auto“,
Standard-Treffpunkt als Fahrer, „fährt am liebsten mit bei …“) und Treffpunkte (Name, Adresse) verwalten, Export/Import der Mitglieder als JSON.
## Login
Öffentlich sind nur die Startseite (inkl. der nächsten 3 Spieltage: Datum, Titel, Anzahl Zusagen) und die Statistik
(Namen und Anzahl gespielter Spieltage).
Kalender, Fahrtplaner, Gruppe und die komplette API sind nur nach dem Anmelden erreichbar.
Benutzer werden auf dem Server per Kommandozeile verwaltet:
```bash
npm run user -- list # alle Benutzer anzeigen
npm run user -- add <name> # Benutzer anlegen
npm run user -- passwd <name> # Passwort ändern (meldet den Benutzer überall ab)
npm run user -- remove <name> # Benutzer löschen (sofort abgemeldet)
```
Sicherheit:
- Passwörter werden nur als scrypt-Hash mit eigenem Salt gespeichert (`data/users.json`), nie im Klartext.
- Sitzungen gelten 30 Tage. Im Browser liegt ein zufälliges Token als `HttpOnly`-Cookie,
auf dem Server nur dessen SHA-256-Hash (`data/sessions.json`).
- Nach 10 Fehlversuchen innerhalb von 15 Minuten wird die IP für den Login gesperrt.
- Im Internet nur über HTTPS betreiben (z. B. hinter nginx), dann wird das Cookie automatisch als `Secure` gesetzt.
## Aufbau
```
server.js Express-Server + REST-API (/api/members, /api/events, /api/meeting-points)
auth.js Login, Passwort-Hashing, Sitzungen
scripts/user.js Benutzerverwaltung (npm run user)
data/ db.json, users.json, sessions.json (automatisch angelegt, nicht in Git)
public/ öffentlich: Startseite, Login, CSS, Bilder, common.js
private/ nur angemeldet: Kalender, Fahrtplaner, Gruppe
```
## Auf einem Server betreiben
Per Docker hinter dem Nginx Proxy Manager: `docker compose up -d --build` (Daten liegen in `./data`,
das Docker-Netz des Proxys steht in `.env`). Schritt-für-Schritt-Anleitung inkl. Domain, HTTPS, Updates und Backups:
[DEPLOY.md](DEPLOY.md). Skripte für Updates und Backups liegen in `deploy/`.