27b1057cd4
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>
134 lines
3.7 KiB
Markdown
134 lines
3.7 KiB
Markdown
# 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.
|