- 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>
6.9 KiB
HCRB – Highcap Rasselbande
Webseite der Airsoft-Gruppe HCRB mit Spieltag-Kalender und Fahrtplaner.
Starten
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):
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-DienstEnvironment=TZ=Europe/Berlinsetzen). - 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 indata/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 indata/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:
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
Securegesetzt.
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. 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.