mirror of
https://github.com/guyg1474/hcrb.git
synced 2026-10-16 07:13:28 +02:00
- Gemeinsame Zugänge mit Rollen: Admin darf alles, Mitglied nutzt Kalender, Fahrtplaner, Treffpunkte und bearbeitet Mitglieder (kein Hinzufügen, Löschen, Import, keine Patches, keine Statistik-Korrektur) - Server prüft die Rechte (403), Konten ohne Rolle gelten als Admin - npm run user: add <name> [admin|mitglied], role <name> <rolle> - Neue öffentliche Seite Kooperationen mit Titelbild, Anführer, Social-Media-Links und Beschreibung, Pflege durch Admin - Kopfzeile bleibt bei mittlerer Breite einzeilig - Texte auf Wunsch gekürzt Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
113 lines
6.9 KiB
Markdown
113 lines
6.9 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“.
|
||
Admin-Zugang: 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.
|
||
- **Kooperationen** (`/kooperationen`, öffentlich) – Gruppen, mit denen die HCRB zusammenarbeitet. Übersicht als Karten,
|
||
jede Kooperation hat eine eigene Ansicht (`/kooperationen#<id>`) mit Titelbild, Anführer, Social-Media-Links
|
||
(Website, Instagram, YouTube, TikTok, Facebook, Discord) und Beschreibung. Anlegen, bearbeiten, löschen nur mit dem
|
||
Admin-Zugang. Titelbilder liegen in `data/kooperationen/`.
|
||
- **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.
|
||
Hinzufügen, Löschen und Import nur mit dem Admin-Zugang.
|
||
|
||
## Login
|
||
|
||
Öffentlich sind nur die Startseite (inkl. der nächsten 3 Termine: Datum, Uhrzeit, Titel, Anzahl Zusagen), die Statistik
|
||
(Namen und Anzahl gespielter Spieltage), die Patches und die Kooperationen.
|
||
Kalender, Fahrtplaner, Gruppe und die komplette API sind nur nach dem Anmelden erreichbar.
|
||
|
||
Die Zugänge sind gemeinsame Konten, keine persönlichen. Es gibt zwei Rollen:
|
||
|
||
| | Admin | Mitglied |
|
||
| --- | --- | --- |
|
||
| Kalender: Termine eintragen, bearbeiten, löschen, zusagen | ✓ | ✓ |
|
||
| Fahrtplaner, Treffpunkte | ✓ | ✓ |
|
||
| Mitglieder bearbeiten, Gruppe exportieren | ✓ | ✓ |
|
||
| Mitglieder hinzufügen, löschen, Gruppe importieren | ✓ | – |
|
||
| Patches hochladen, bearbeiten, löschen | ✓ | – |
|
||
| Kooperationen anlegen, bearbeiten, löschen | ✓ | – |
|
||
| Statistik von Hand korrigieren (− / +) | ✓ | – |
|
||
|
||
Typisch: ein Konto `admin` und ein Konto für alle Mitglieder, z. B. `hcrb`.
|
||
Konten aus der Zeit vor den Rollen gelten als Admin, bis man ihre Rolle ändert.
|
||
|
||
Benutzer werden auf dem Server per Kommandozeile verwaltet:
|
||
|
||
```bash
|
||
npm run user -- list # alle Benutzer mit Rolle anzeigen
|
||
npm run user -- add <name> [admin|mitglied] # Benutzer anlegen (Standard: mitglied)
|
||
npm run user -- role <name> <admin|mitglied> # Rolle ändern (meldet den Benutzer überall ab)
|
||
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, /api/kooperationen, .ics-Export)
|
||
auth.js Login, Passwort-Hashing, Sitzungen
|
||
scripts/user.js Benutzerverwaltung (npm run user)
|
||
data/ db.json, users.json, sessions.json, patches/, kooperationen/ (automatisch angelegt, nicht in Git)
|
||
public/ öffentlich: Startseite, Statistik, Patches, Kooperationen, 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.
|