Files
RAPPORT/DEPLOY.md
T
karim 27b1057cd4 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>
2026-05-23 19:08:00 +02:00

3.7 KiB

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

    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:

    npm install
    npm run build
    

    Erzeugt dist/ mit statischen Files (~500 kB).

  4. Static-Container starten:

    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

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:

    VITE_SUPABASE_URL=https://api.rapport.kgva.ch
    VITE_SUPABASE_ANON_KEY=<aus supabase status>
    
  3. Supabase-Config anpassen in supabase/config.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:

    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.