docs: README um Web-Push-Dokumentation ergänzen
Beschreibt Opt-in, VAPID, iOS-PWA, Projektstruktur und Deployment-Hinweise. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -21,7 +21,7 @@ Alle sensiblen Inhalte werden **clientseitig verschlüsselt** (Web Crypto API).
|
|||||||
- **Schiffsdaten** und **Crew-Profile** (Skipper + Mitglieder)
|
- **Schiffsdaten** und **Crew-Profile** (Skipper + Mitglieder)
|
||||||
- **Statistik-Dashboard** — Strecken, Verbrauch, Segel/Motor, Hafenkette (pro Logbuch oder accountweit)
|
- **Statistik-Dashboard** — Strecken, Verbrauch, Segel/Motor, Hafenkette (pro Logbuch oder accountweit)
|
||||||
- **Kollaboration** — Crew per Einladungslink einladen (Schreib- oder Lesezugriff)
|
- **Kollaboration** — Crew per Einladungslink einladen (Schreib- oder Lesezugriff)
|
||||||
- **Push-Benachrichtigungen** (optional) — Logbuch-Eigner werden bei Crew-Sync per Web Push informiert (ohne Klartext-Inhalte)
|
- **Push-Benachrichtigungen** (optional) — Logbuch-Eigner per Web Push informieren, wenn Crew Änderungen synchronisiert (ohne Klartext-Inhalte; Opt-in in den Einstellungen)
|
||||||
- **Read-only-Freigabe** — öffentlicher Lese-Link für Dritte
|
- **Read-only-Freigabe** — öffentlicher Lese-Link für Dritte
|
||||||
- **Export** — PDF pro Reisetag, CSV-Download/-Teilen
|
- **Export** — PDF pro Reisetag, CSV-Download/-Teilen
|
||||||
- **Backup & Wiederherstellung** — vollständiges verschlüsseltes Logbuch-Backup (Einträge, Fotos, GPS, Crew, Schiff) als `.daagbok.json`; Restore auf gleichem oder neuem Account
|
- **Backup & Wiederherstellung** — vollständiges verschlüsseltes Logbuch-Backup (Einträge, Fotos, GPS, Crew, Schiff) als `.daagbok.json`; Restore auf gleichem oder neuem Account
|
||||||
@@ -47,12 +47,13 @@ Alle sensiblen Inhalte werden **clientseitig verschlüsselt** (Web Crypto API).
|
|||||||
| Datenbank | PostgreSQL 16 |
|
| Datenbank | PostgreSQL 16 |
|
||||||
| Auth | WebAuthn (Passkeys) via `@simplewebauthn` |
|
| Auth | WebAuthn (Passkeys) via `@simplewebauthn` |
|
||||||
| Krypto | Web Crypto API (AES-GCM), BIP39 Recovery |
|
| Krypto | Web Crypto API (AES-GCM), BIP39 Recovery |
|
||||||
|
| Push (optional) | Web Push (VAPID), Custom Service Worker (`injectManifest`) |
|
||||||
|
|
||||||
### Rollen & Zugriff
|
### Rollen & Zugriff
|
||||||
|
|
||||||
| Rolle | Bedeutung |
|
| Rolle | Bedeutung |
|
||||||
|-------|-----------|
|
|-------|-----------|
|
||||||
| **Owner** | Logbuch angelegt; voller Zugriff, Einladungen, Backup, Löschen |
|
| **Owner** | Logbuch angelegt; voller Zugriff, Einladungen, Backup, Löschen; optional Push bei Crew-Änderungen |
|
||||||
| **Collaborator (WRITE)** | Per Einladung; Einträge bearbeiten und als Crew signieren |
|
| **Collaborator (WRITE)** | Per Einladung; Einträge bearbeiten und als Crew signieren |
|
||||||
| **Collaborator (READ)** | Nur Lesen (z. B. öffentlicher Share-Link) |
|
| **Collaborator (READ)** | Nur Lesen (z. B. öffentlicher Share-Link) |
|
||||||
|
|
||||||
@@ -68,6 +69,27 @@ Nur der **Logbuch-Eigner** kann unter **Einstellungen → Backup & Wiederherstel
|
|||||||
|
|
||||||
Vor dem Löschen eines Logbuchs weist die App auf diese Funktion hin. Crew-Einladungen und Passkey-Signaturen werden nicht mitübertragen — Inhalte bleiben lesbar, Signaturen auf neuem Account ggf. nicht mehr verifizierbar.
|
Vor dem Löschen eines Logbuchs weist die App auf diese Funktion hin. Crew-Einladungen und Passkey-Signaturen werden nicht mitübertragen — Inhalte bleiben lesbar, Signaturen auf neuem Account ggf. nicht mehr verifizierbar.
|
||||||
|
|
||||||
|
## Push-Benachrichtigungen (optional)
|
||||||
|
|
||||||
|
Logbuch-**Eigner** können unter **Einstellungen** Web Push aktivieren. Sobald ein eingeladenes Crewmitglied mit Schreibrechten (`WRITE`) Änderungen synchronisiert, erhält der Owner eine **generische** Benachrichtigung — der Server kennt keine Logbuch-Inhalte (Zero-Knowledge).
|
||||||
|
|
||||||
|
| Aspekt | Verhalten |
|
||||||
|
|--------|-----------|
|
||||||
|
| Auslöser | Erfolgreicher Sync-Push durch Collaborator (`create`/`update`) |
|
||||||
|
| Aggregation | Mehrere Änderungen in einem Sync → eine Benachrichtigung pro Logbuch |
|
||||||
|
| Drosselung | Max. eine Push-Nachricht pro Logbuch alle 3 Minuten |
|
||||||
|
| Klick | Öffnet die App auf dem betroffenen Logbuch |
|
||||||
|
|
||||||
|
**Voraussetzungen:**
|
||||||
|
|
||||||
|
- HTTPS (Produktion)
|
||||||
|
- VAPID-Schlüssel auf dem Server (`VAPID_PUBLIC_KEY`, `VAPID_PRIVATE_KEY`, `VAPID_SUBJECT`)
|
||||||
|
- Browser-Berechtigung „Benachrichtigungen“; auf **iOS** installierte PWA ab iOS 16.4+
|
||||||
|
|
||||||
|
Schlüssel erzeugen: `npx web-push generate-vapid-keys` (im `server/`-Verzeichnis oder global).
|
||||||
|
|
||||||
|
Ausführlicher Implementierungs- und Testplan: [docs/push-notifications-plan.md](docs/push-notifications-plan.md).
|
||||||
|
|
||||||
## Projektstruktur
|
## Projektstruktur
|
||||||
|
|
||||||
```
|
```
|
||||||
@@ -75,13 +97,15 @@ kapteins-daagbok/
|
|||||||
├── client/ # React-PWA (Frontend)
|
├── client/ # React-PWA (Frontend)
|
||||||
│ ├── src/
|
│ ├── src/
|
||||||
│ │ ├── components/ # UI-Komponenten
|
│ │ ├── components/ # UI-Komponenten
|
||||||
│ │ ├── services/ # Auth, Sync, Krypto, Backup, Analytics, …
|
│ │ ├── services/ # Auth, Sync, Krypto, Backup, Push, Analytics, …
|
||||||
|
│ │ ├── sw.ts # Service Worker (Precache + Web Push)
|
||||||
│ │ └── i18n/ # DE/EN-Übersetzungen
|
│ │ └── i18n/ # DE/EN-Übersetzungen
|
||||||
│ └── Dockerfile # Nginx-Produktions-Image
|
│ └── Dockerfile # Nginx-Produktions-Image
|
||||||
├── server/ # Express-API + Prisma
|
├── server/ # Express-API + Prisma
|
||||||
│ ├── src/routes/ # auth, logbooks, sync, collaboration, sign
|
│ ├── src/routes/ # auth, logbooks, sync, collaboration, sign, push
|
||||||
|
│ ├── src/services/ # z. B. pushNotify (Web Push)
|
||||||
│ └── prisma/ # Datenbankschema
|
│ └── prisma/ # Datenbankschema
|
||||||
├── docs/ # Projektdokumentation (z. B. Plausible Events)
|
├── docs/ # Projektdokumentation
|
||||||
├── scripts/ # Dev- und Deploy-Skripte
|
├── scripts/ # Dev- und Deploy-Skripte
|
||||||
├── docker-compose.yml # Produktions-Stack (DB + Backend + Frontend)
|
├── docker-compose.yml # Produktions-Stack (DB + Backend + Frontend)
|
||||||
└── VERSION # App-Version (Build & Footer)
|
└── VERSION # App-Version (Build & Footer)
|
||||||
@@ -93,6 +117,7 @@ kapteins-daagbok/
|
|||||||
- **npm**
|
- **npm**
|
||||||
- **Docker** (für PostgreSQL in der Entwicklung oder den vollständigen Stack)
|
- **Docker** (für PostgreSQL in der Entwicklung oder den vollständigen Stack)
|
||||||
- Optional: OpenWeatherMap-API-Key (Wetter-Abruf in den Einstellungen)
|
- Optional: OpenWeatherMap-API-Key (Wetter-Abruf in den Einstellungen)
|
||||||
|
- Optional: VAPID-Schlüssel für Web Push (siehe Abschnitt Push-Benachrichtigungen)
|
||||||
|
|
||||||
## Lokale Entwicklung
|
## Lokale Entwicklung
|
||||||
|
|
||||||
@@ -153,7 +178,7 @@ Gesamten Stack lokal bauen und starten:
|
|||||||
|
|
||||||
Frontend: http://localhost · API: http://localhost/api/health
|
Frontend: http://localhost · API: http://localhost/api/health
|
||||||
|
|
||||||
Umgebungsvariablen für Passkeys in `.env` setzen (`RP_ID`, `ORIGIN`).
|
Umgebungsvariablen in `.env` setzen — mindestens `RP_ID` und `ORIGIN` für Passkeys. Für Push die VAPID-Variablen an den **Backend**-Container durchreichen (z. B. in `docker-compose.yml` unter `backend.environment` ergänzen).
|
||||||
|
|
||||||
## Deployment
|
## Deployment
|
||||||
|
|
||||||
@@ -165,11 +190,14 @@ Produktions-Update auf den Server (konfigurierbar via Umgebungsvariablen):
|
|||||||
|
|
||||||
Standard-Ziel: `root@10.0.0.25:/opt/kapteins-daagbok` — per `REMOTE_HOST`, `REMOTE_USER`, `REMOTE_DIR` überschreibbar.
|
Standard-Ziel: `root@10.0.0.25:/opt/kapteins-daagbok` — per `REMOTE_HOST`, `REMOTE_USER`, `REMOTE_DIR` überschreibbar.
|
||||||
|
|
||||||
|
Auf dem Server müssen `server/.env` (oder gleichwertige Umgebung) u. a. `DATABASE_URL`, `RP_ID`, `ORIGIN` und bei Push `VAPID_*` enthalten. Nach Schema-Änderungen: `npx prisma db push` im Backend-Container.
|
||||||
|
|
||||||
## Dokumentation
|
## Dokumentation
|
||||||
|
|
||||||
| Dokument | Inhalt |
|
| Dokument | Inhalt |
|
||||||
|----------|--------|
|
|----------|--------|
|
||||||
| [docs/plausible-events.md](docs/plausible-events.md) | Custom Events für Plausible Analytics |
|
| [docs/plausible-events.md](docs/plausible-events.md) | Custom Events für Plausible Analytics |
|
||||||
|
| [docs/push-notifications-plan.md](docs/push-notifications-plan.md) | Web Push: Architektur, API, Testplan |
|
||||||
| [.planning/PROJECT.md](.planning/PROJECT.md) | Produktvision und Anforderungen (GSD) |
|
| [.planning/PROJECT.md](.planning/PROJECT.md) | Produktvision und Anforderungen (GSD) |
|
||||||
|
|
||||||
## Analytics
|
## Analytics
|
||||||
|
|||||||
Reference in New Issue
Block a user