mirror of
https://github.com/guyg1474/hcrb.git
synced 2026-10-16 07:13:28 +02:00
79 lines
4.2 KiB
Markdown
79 lines
4.2 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 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/`.
|