.env.production des gehosteten app-Images bekommt VITE_SERVER_MODE=1 → die Web-GUI ist fest an diesen Server gebunden (keine Lokal/Server-Wahl, kein Server-Adress-Wechsel). Greift mit RAPPORT f88825e. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
RAPPORT-SERVER
⚠️ Status: Alpha — noch nicht End-to-End-getestet. Die Files in diesem Repo sind ein Skelett (Docker-Compose, Init-Skripte, Frontend-Build), aber der Stack startet noch nicht out-of-the-box. Vor produktivem Einsatz ist die Supabase-Init-Reihenfolge auszubauen (siehe «Bekannte offene Punkte» unten).
Self-Hosting-Stack für Rapport — die Studio-Management-Software für Architekturbüros.
Dieses Repo enthält alles, um Rapport auf eigenem Server (Linux-VM, NAS, Mac Mini) zu hosten:
- Postgres (Datenbank)
- GoTrue (Auth — Email-Login, Passwort-Reset, …)
- PostgREST (REST-API auf der DB)
- Realtime (Live-Sync zwischen Geräten)
- Storage (Bilder, Quittungen)
- Kong (API-Gateway)
- Rapport-Frontend (nginx mit dem React-Build)
Alles als Docker-Compose. Komplett Open-Source.
Voraussetzungen
| OS | Container-Runtime |
|---|---|
| Linux (Ubuntu 22.04+, Debian 12+, …) | Docker Engine + Compose v2 |
| macOS (Mac Mini etc.) | Colima + Docker CLI — vollständig Open-Source |
Auf macOS funktioniert auch OrbStack oder Docker Desktop, beide sind aber proprietär. Colima ist die OSS-Alternative und für Selfhost ausreichend.
Plus: ein erreichbarer DNS-Name (für TLS) — z.B. rapport.studio.ch. Optional: Nginx Proxy Manager oder Caddy als Reverse-Proxy für SSL.
Setup
1. Repo klonen + Frontend-Sources holen
git clone https://git.kgva.ch/karim/rapport-server.git
cd rapport-server
2. .env erstellen
cp .env.example .env
In .env müssen mindestens diese drei Werte ersetzt werden:
POSTGRES_PASSWORD— Datenbank-Passwort (mind. 32 Zeichen zufällig)JWT_SECRET— JWT-Signatur-Secret (mind. 32 Zeichen zufällig)SITE_URL— die öffentliche URL deiner Rapport-Instanz (z.B.https://app.rapport.studio.ch)
Zufallswerte generieren:
openssl rand -hex 32 # für POSTGRES_PASSWORD und JWT_SECRET
3. Migrations holen
Die SQL-Migrations stammen aus dem App-Repo. Einmal initial holen:
./scripts/sync-migrations.sh
(Bei späteren Rapport-Updates sync-migrations.sh erneut ausführen, dann docker compose down && docker compose up -d.)
4. Stack starten
docker compose up -d
Erststart dauert ~1 Minute (Postgres initialisiert sich, Migrations laufen, Container starten).
5. Health-Check
docker compose ps
Alle Container sollten healthy zeigen.
Frontend ist erreichbar auf http://localhost:8080 — direkt im Browser öffnen oder über deinen Reverse-Proxy auf eine Domain mappen.
Reverse-Proxy + HTTPS
Empfohlen: Nginx Proxy Manager (OSS, Web-UI, Let's-Encrypt automatisch) oder Caddy (config-as-code, vollautomatisch).
Beispiel Caddy:
app.rapport.studio.ch {
reverse_proxy localhost:8080
}
api.rapport.studio.ch {
reverse_proxy localhost:8000 # Kong-Gateway
}
In .env dann SITE_URL=https://app.rapport.studio.ch und API_EXTERNAL_URL=https://api.rapport.studio.ch setzen.
Updates
git pull
./scripts/sync-migrations.sh # falls neue Migrations
docker compose pull # neueste Container-Versionen
docker compose up -d # neu starten
Daten bleiben erhalten (Volume postgres-data wird nicht angetastet).
Backup
Komplettes Postgres-Dump:
docker compose exec -T db pg_dumpall -U postgres > backup-$(date +%Y%m%d).sql
Empfohlen: per cron täglich + auf externe Disk/S3/Backblaze sichern.
Storage (Quittungen, Logos):
docker compose exec storage tar -czf - /var/lib/storage > storage-$(date +%Y%m%d).tar.gz
Bekannte offene Punkte
Beim ersten End-to-End-Versuch (lokal mit Docker Compose + alternativen Ports) sind diese Probleme aufgefallen:
auth.users-Schema fehlt beim Postgres-Init: Die Rapport-Migrationen (0001_initial.sql) referenzierenauth.users(id)als Foreign Key. In Karimssupabase start-Setup wird das von der Supabase-CLI vorab initialisiert; hier indocker-composemuss das per Init-Script (vor den App-Migrationen) explizit angelegt werden — analog zum offiziellen supabase/supabase Self-Host-Setup. Stub-Variante involumes/db/init/00-init.shist drin, aber nicht ausreichend.- Healthcheck-User:
supabase/postgresImage hat als Default-Usersupabase_admin(nichtpostgres). Compose-Healthchecks und SQL-Skripte müssen das berücksichtigen. auth.uid()undauth.role()als Stub-Funktionen brauchen Pre-Migration, damit RLS-Policies + RPCs (is_studio_member,create_studio_with_admin, …) im Init durchlaufen.- Standard-Init-SQL aus dem offiziellen Supabase Self-Host kopieren:
roles.sql,_supabase.sql,realtime.sql,webhooks.sql,jwt.sql,logs.sql— diese fehlen aktuell.
Diese Punkte sind in einer separaten Iteration zu adressieren, nicht in einem Schritt. Empfehlung: Sich Schritt für Schritt am offiziellen Supabase-Self-Host-Compose orientieren.
Lizenz
GNU AGPL-3.0-or-later — identisch zur Rapport-App.