mirror of
https://github.com/guyg1474/hcrb.git
synced 2026-10-16 07:13:28 +02:00
- Kalender: Termine als Spiel-Event markieren (nur diese zählen in der Statistik), optionale Uhrzeiten, Termine bearbeiten - .ics-Download für einzelne und alle kommenden Termine - Neue Seite Patches: Upload (PNG, JPEG, WebP, geprüftes SVG), Status "Gibt es schon" / "In Planung", Bilder in data/patches/ - Volle Seitenbreite mit Spaltenlayouts, neues Design mit selbst gehosteten Schriften, Startseite mit Zoom und drehendem Zahnrad - Bestehende Daten werden beim Laden ergänzt, keine Migration nötig Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
92 lines
5.5 KiB
Markdown
92 lines
5.5 KiB
Markdown
# 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 Flagge, die beim Scrollen heranzoomt, nächstem Spiel samt Countdown,
|
||
Links zu allen Bereichen, neuesten Patches, nächsten Terminen und „Pile of Shame“.
|
||
- **Kalender** (`/kalender`) – Mitglieder wählen „Ich bin …“, tragen Termine ein (optional mit Beginn und Ende), bearbeiten sie und sagen zu oder ab.
|
||
Pro Termin wird angekreuzt, ob es ein **Spiel-Event** ist – nur diese zählen in der Statistik (Treffen, Grillen usw. nicht).
|
||
Einzelne Termine oder alle kommenden lassen sich als `.ics`-Datei für Google, Apple oder Outlook herunterladen.
|
||
Ü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:
|
||
Spiel-Events 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).
|
||
- **Patches** (`/patches`, öffentlich) – Galerie der Gruppen- und Event-Patches, getrennt nach „Gibt es schon“ und „In Planung“.
|
||
Angemeldet: Patch hochladen (PNG, JPEG oder WebP – wird im Browser auf max. 1600 px verkleinert – oder SVG bis 2 MB),
|
||
bearbeiten, löschen. SVGs mit Skripten, Ereignis-Attributen oder Verweisen auf fremde Dateien werden abgelehnt
|
||
und zusätzlich mit einer Content-Security-Policy ausgeliefert.
|
||
Die Bilder liegen in `data/patches/` und sind damit im Docker-Volume und im Backup enthalten.
|
||
- **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 Termine: Datum, Uhrzeit, Titel, Anzahl Zusagen), die Statistik
|
||
(Namen und Anzahl gespielter Spieltage) und die Patches.
|
||
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, /api/patches, .ics-Export)
|
||
auth.js Login, Passwort-Hashing, Sitzungen
|
||
scripts/user.js Benutzerverwaltung (npm run user)
|
||
data/ db.json, users.json, sessions.json, patches/ (automatisch angelegt, nicht in Git)
|
||
public/ öffentlich: Startseite, Statistik, Patches, Login, CSS, Bilder, Schriften, 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`,
|
||
die Seite läuft auf Port 3000, änderbar per `HCRB_PORT` 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/`.
|
||
|
||
## Schriften
|
||
|
||
Die Schriften liegen in `public/fonts/` und werden vom eigenen Server ausgeliefert (keine Anfrage an Google, DSGVO):
|
||
Saira Stencil One (Schriftzug „HCRB“), Barlow und Barlow Condensed. Alle unter der SIL Open Font License 1.1.
|