mirror of
https://github.com/guyg1474/hcrb.git
synced 2026-10-15 23:13:28 +02:00
Erste Version: HCRB Spieltag-Kalender und Fahrtplaner
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
commit
10400eee59
30 files changed
+3771
No files matched your search
@@ -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/`.
|
||||
Reference in new issue
Block a user