83 lines
3.8 KiB
Markdown
83 lines
3.8 KiB
Markdown
# Familien-Motorrad-Tracker
|
|
|
|
Gemeinsame Verwaltung von Motorrädern, Wartungen, TÜV-/Inspektionsterminen und Fahrten für eine Familie. Die App nutzt Next.js, TypeScript und SQLite und ist für den Betrieb per Docker hinter einem Reverse Proxy vorbereitet.
|
|
|
|
## Lokale Entwicklung
|
|
|
|
Voraussetzungen: Node.js 24 und npm.
|
|
|
|
```powershell
|
|
Copy-Item .env.example .env.local
|
|
npm ci
|
|
npm run dev
|
|
```
|
|
|
|
Vor dem Start in `.env.local` mindestens `ADMIN_PASSWORD`, `ADMIN_NAME` und `AUTH_SECRET` setzen. Die App ist anschließend unter `http://localhost:3000` erreichbar. Datenbank und Uploads liegen standardmäßig in `data\`.
|
|
|
|
Beim ersten Start wird genau dann ein Admin aus den `ADMIN_*`-Werten angelegt, wenn noch kein aktives Konto existiert. Danach meldet man sich mit `ADMIN_NAME` und `ADMIN_PASSWORD` an. Das initiale Passwort sollte direkt unter **Konto** geändert werden.
|
|
|
|
## Standard-Admin-Zugang (aus `.env.example`)
|
|
|
|
- Passwort: `change-this-password`
|
|
- Name: `Familien-Admin`
|
|
|
|
## Docker
|
|
|
|
```powershell
|
|
Copy-Item .env.example .env
|
|
# Sichere Werte in .env eintragen
|
|
docker compose up -d --build
|
|
```
|
|
|
|
Die Anwendung ist standardmäßig über Port 3000 erreichbar. `PORT` in `.env` ändert nur den veröffentlichten Host-Port. Für eine Domain sollte nginx, Traefik oder ein anderer Reverse Proxy TLS terminieren und auf diesen Port weiterleiten.
|
|
|
|
Für YubiKey/WebAuthn im Docker-Betrieb mit Domain sollten zusätzlich gesetzt werden:
|
|
|
|
- `WEBAUTHN_RP_ID` (z. B. `garage.example.com`)
|
|
- `WEBAUTHN_ORIGIN` (z. B. `https://garage.example.com`)
|
|
|
|
Sichere Schlüssel lassen sich beispielsweise so erzeugen:
|
|
|
|
```powershell
|
|
node -e "console.log(require('node:crypto').randomBytes(32).toString('hex'))"
|
|
node -e "console.log(require('node:crypto').randomBytes(32).toString('base64'))"
|
|
```
|
|
|
|
Den Hex-Wert für `AUTH_SECRET` und den Base64-Wert für `NEXT_SERVER_ACTIONS_ENCRYPTION_KEY` verwenden.
|
|
|
|
## Benutzer und Rollen
|
|
|
|
Es gibt Administratoren und Mitglieder. Jedes Motorrad gehört genau einem Benutzer (Besitzer). Administratoren sehen alle Motorräder, Mitglieder sehen ihre eigenen plus explizit freigegebene Motorräder. Besitzer und Administratoren können Motorräder mit anderen aktiven Benutzern per Benutzername teilen. Konten werden durch Administratoren verwaltet. Motorräder dürfen vom Besitzer oder von Administratoren gelöscht werden. Gelöschte Benutzer können sich nicht mehr anmelden und sind nicht mehr als Fahrer auswählbar; vorhandene Wartungen und Fahrten bleiben mit dem ursprünglichen Namen zur Nachvollziehbarkeit erhalten. Der letzte aktive Administrator kann weder gelöscht noch herabgestuft werden.
|
|
|
|
## Admin-Login mit YubiKey
|
|
|
|
Administratoren können unter **Konto → YubiKeys** bis zu zwei Sicherheitsschlüssel (z. B. YubiKey) registrieren. Sobald mindestens ein Schlüssel hinterlegt ist, wird beim Admin-Login nach Benutzername/Passwort zusätzlich eine WebAuthn-Bestätigung verlangt.
|
|
|
|
## Kiosk-Modus
|
|
|
|
Unter `/kiosk` gibt es einen öffentlichen Kiosk-Modus ohne Login. Dort reicht das Kennzeichen, um die hinterlegten Wartungs-Sollwerte (Reifendruck, Kettenspannung, Öl-Prüfanleitung) eines Motorrads anzuzeigen.
|
|
|
|
## Eingabesicherheit
|
|
|
|
Alle Datenbankzugriffe nutzen parametrisierte SQL-Statements (`?`-Platzhalter), und Eingaben werden serverseitig validiert. Damit sind SQL-Injection-Angriffe über Formularfelder abgefangen.
|
|
|
|
## Backups
|
|
|
|
Alle persistenten Daten liegen im Docker-Volume `moped-data` unter `/app/data`:
|
|
|
|
- `moped-tracker.sqlite` sowie mögliche `-wal`-/`-shm`-Dateien
|
|
- `uploads\` mit Rechnungen und Fotos
|
|
|
|
Für ein konsistentes Backup den Container kurz stoppen und das komplette Volume sichern. Bei lokaler Entwicklung entsprechend den gesamten Ordner `data\` sichern.
|
|
|
|
## Qualität
|
|
|
|
```powershell
|
|
npm run lint
|
|
npm run build
|
|
```
|
|
|
|
## Sinnvolle nächste Ausbaustufen
|
|
|
|
E-Mail-Erinnerungen vor Fälligkeiten, Mehrsprachigkeit und PDF-Exporte der Wartungshistorie.
|