2026-10-10 14:16:09 +02:00

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

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. Skripte für Updates und Backups liegen in deploy/.

S
Description
No description provided
Readme
456 KiB
0 Stars 1 Watchers 0 Forks
Languages
JavaScript 60.3%
CSS 22.3%
HTML 16.7%
Shell 0.4%
Dockerfile 0.3%