Release 0.8.0: Cloud-Variante (Supabase, Multi-Studio, Realtime, Web-Deploy)

Rapport ist jetzt dual: lokal (wie bisher) ODER Cloud auf eigenem Supabase-Server.
Beide Modi haben dieselben Funktionen, Cloud zusätzlich Multi-User + Live-Sync.

Storage-Architektur
- src/storage/adapter.js: einheitliche Promise-API, LocalStorage- und SupabaseAdapter
- src/storage/migrations.js: applyMigrations als reine Funktion, für beide Backends
- Konfig-driven: VITE_SUPABASE_URL im Production-Build → automatisch Cloud-Modus

Postgres-Schema (supabase/migrations/0001–0010)
- 29 Tabellen, multi-tenant via studio_id + Row-Level-Security
- Audit-Spalten (created_by/updated_by/at) + Trigger
- Seed-Trigger pro neuem Studio (Rollen, Templates, Absenz-Typen)
- Realtime-Publication für Live-Sync
- RPCs: ensure_profile, create_studio_with_admin (mit Personen-Sharing),
  list_studios, load_persons_for_studio, attach_user_to_studio

Cloud-Features (App)
- BackendChoice.jsx als Erst-Screen «Lokal oder Cloud»
- CloudSetup.jsx: 3-Schritt-Wizard für Erst-Einrichtung
- Login.jsx: Modus-Switcher + Server-URL + Studio-Dropdown + Passwort-Vergessen
- ResetPassword.jsx: empfängt Mail-Link-Klick via PASSWORD_RECOVERY-Event
- Realtime: Änderungen zwischen Browsern ohne Reload sichtbar
- Settings → System: Cloud-Verbindung, Studio-Switcher, weiteres Studio anlegen
- Settings → Team: Mitarbeiter via Email einladen (Admin-Aktion)
- Personen-Sharing: bei neuem Studio Personen aus anderen Studios übernehmen
- Reload-Resume: studio_id in sessionStorage, kein erneuter Login nötig

Web-Deploy
- deploy/docker-compose.yml + nginx.conf: dist/ via nginx-Container, Port 8080
- .env.production.example: Build-time Cloud-URL
- DEPLOY.md: Anleitung für LAN-only und extern via Nginx Proxy Manager

Doku
- README.md: Cloud-Variante prominent erklärt
- ARCHITECTURE.md: Storage-Adapter, Migrations, neue Views in Risiko-Tabelle
- DEPLOY.md: Schritt-für-Schritt für Mac Mini + NPM

Version-Bump auf 0.8.0 in package.json, src-tauri/tauri.conf.json, Cargo.toml.
Changelog-Entry im App.jsx-Modal (Karim sieht ihn beim ersten Start).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-23 19:08:00 +02:00
parent c71feddf63
commit 27b1057cd4
35 changed files with 4668 additions and 151 deletions
+133
View File
@@ -0,0 +1,133 @@
# Rapport-Web-App Deploy
> Wer kein Tauri installieren will, kann Rapport im Browser nutzen. Diese
> Anleitung beschreibt, wie du die Web-Version auf dem Mac Mini hostest.
---
## Option 2 — Im LAN erreichbar (ohne SSL)
Ziel: jedes Gerät im Studio-Netz kann `http://<mac-mini.local>:8080` öffnen.
### Voraussetzungen
- Mac Mini hat OrbStack/Docker und Supabase wie in [README.md](README.md) eingerichtet.
- `supabase start` läuft (Supabase auf Port 54321).
- Der Mac Mini ist im LAN erreichbar (`mac-mini.local` per Bonjour oder feste IP).
### Schritt-für-Schritt
1. **Repo auf den Mac Mini kopieren** (falls noch nicht da).
2. **`.env.production` anlegen** (im Repo-Root):
```bash
cp .env.production.example .env.production
```
Dann den Anon-Key aus `supabase status` einsetzen und `VITE_SUPABASE_URL`
auf die LAN-Adresse stellen, z.B. `http://mac-mini.local:54321`.
3. **Build:**
```bash
npm install
npm run build
```
Erzeugt `dist/` mit statischen Files (~500 kB).
4. **Static-Container starten:**
```bash
docker compose -f deploy/docker-compose.yml up -d
```
Liefert `dist/` auf Port `8080` aus.
5. **Test:** anderes Gerät im LAN öffnet `http://<mac-mini.local>:8080`
im Browser. Login-Screen erscheint, Cloud-Modus ist bereits korrekt
konfiguriert (Server-URL ist gebakene `.env.production`).
### Update auf neue Version
```bash
git pull
npm run build
docker compose -f deploy/docker-compose.yml restart
```
---
## Option 3 — Auch extern erreichbar (mit SSL)
Zusätzlich zu Option 2: Nginx Proxy Manager (NPM) auf dem Mac Mini macht
Domain-Routing und holt Let's-Encrypt-Zertifikate.
### Voraussetzungen
- NPM läuft bereits auf dem Mac Mini (typisch Port 81 für UI, 80/443 für
Traffic).
- DNS-Records `app.rapport.kgva.ch` und `api.rapport.kgva.ch` zeigen auf den
Mac Mini (z.B. via Tailscale Funnel, DDNS oder feste IP).
### Schritt-für-Schritt
1. **In NPM-UI zwei Proxy-Hosts anlegen:**
| Domain | Forward zu | SSL |
|---|---|---|
| `app.rapport.kgva.ch` | `mac-mini-ip:8080` | Force HTTPS + Let's Encrypt |
| `api.rapport.kgva.ch` | `mac-mini-ip:54321` | Force HTTPS + Let's Encrypt |
Beide mit «Block Common Exploits» und «Cache Assets» an. Für `api.*`
zusätzlich Websocket-Support an (Realtime braucht WS).
2. **`.env.production` umstellen auf die externe URL:**
```env
VITE_SUPABASE_URL=https://api.rapport.kgva.ch
VITE_SUPABASE_ANON_KEY=<aus supabase status>
```
3. **Supabase-Config anpassen** in `supabase/config.toml`:
```toml
[api]
external_url = "https://api.rapport.kgva.ch"
[auth]
site_url = "https://app.rapport.kgva.ch"
additional_redirect_urls = ["https://app.rapport.kgva.ch"]
```
Dann `supabase stop && supabase start`, damit GoTrue die neuen URLs nutzt.
4. **Rebuild + restart:**
```bash
npm run build
docker compose -f deploy/docker-compose.yml restart
```
5. **Test:** von außen (Smartphone mit Mobile-Data) `https://app.rapport.kgva.ch`
öffnen → Login funktioniert.
---
## Troubleshooting
**Other devices see "Login" without auto-filled Server-URL?**
→ `.env.production` enthält nicht den richtigen `VITE_SUPABASE_URL`, oder das
Build wurde vor der Änderung gemacht. `npm run build` neu ausführen.
**Realtime funktioniert nicht von extern?**
→ NPM braucht «Websocket Support» an im Proxy-Host für `api.*`.
**Auth-Mails kommen nicht an?**
→ Lokales Supabase nutzt Inbucket (Port 54324). Für Production brauchst du
einen echten SMTP-Server in `config.toml`.
**Mac Mini wird neugestartet, Rapport-App weg?**
→ `restart: unless-stopped` im docker-compose sorgt für Auto-Start. Plus:
Supabase als LaunchAgent registrieren, damit `supabase start` beim Boot läuft.