Files
guyg1474andClaude Opus 5.5 819219fb2d Rollen (Admin/Mitglied), Seite Kooperationen, Textanpassungen
- 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>
2026-10-12 19:47:03 +02:00

6.9 KiB
Raw Permalink Blame History

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-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:

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. 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.