Initial commit: Rapport Website (Hugo + Hextra)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-26 11:52:03 +02:00
commit e007bdd4e7
480 changed files with 41697 additions and 0 deletions
+148
View File
@@ -0,0 +1,148 @@
---
title: Datenhaltung & Backup
linkTitle: Datenhaltung
weight: 5
toc: true
---
Wo Rapport seine Daten speichert, wie du sie sicherst und wiederherstellst.
> **Diese Seite beschreibt die Desktop-App (Single-User).** Wer im Team arbeitet und Rapport gegen einen [Rapport Server](../../server/) betreibt, sichert stattdessen die Postgres-Datenbank — siehe [Rapport Server § Backup](../../server/#backup).
## Speicherort (Desktop-App)
Die Desktop-App speichert **alles lokal** — keine Cloud, kein Server.
### macOS
```text
~/Library/Application Support/com.rapport.app/
```
Dort liegt eine einzelne **`localStorage`**-Datenbank des WebView, in der **alle** Rapport-Daten als JSON unter dem Key `studio_data_v1` gespeichert sind:
- Bürodaten, Logo, IBAN
- Mitarbeiter, Kunden, Projekte, Offerten
- Zeit-Einträge, Rechnungen
- Spesen, Lohnabrechnungen, Protokolle
- App-Einstellungen
> **Konsequenz:** Wer den Application-Support-Ordner kopiert, hat ein vollständiges Backup. Wer ihn löscht, verliert alle Daten.
### Warum localStorage?
In der Desktop-App ist Rapport eine **Single-User-Anwendung**. localStorage ist dafür:
- **Schnell** — keine Datenbank-Roundtrips
- **Einfach** — keine Migration nötig, JSON-Schema im Code
- **Portabel** — eine Datei → ein Backup
Für **Multi-User-Betrieb** existiert [Rapport Server](../../server/) — Postgres + Auth + Realtime in einem Docker-Compose. Wechsel zwischen Desktop- und Server-Modus erfolgt im Login-Bildschirm der App.
## Backup-Strategien
### A · Einfach (manuell)
Den ganzen Ordner kopieren:
```bash
cp -R "~/Library/Application Support/com.rapport.app" \
"~/Documents/Rapport-Backup-$(date +%Y%m%d)"
```
→ Auf USB-Stick, externen Datenträger oder in die Cloud.
### B · Time Machine
Wenn Time Machine läuft, ist der Ordner automatisch dabei. Versionierung inbegriffen.
> **Einschränkung:** Time Machine sichert nur lokal/USB. Für off-site-Backup separat sorgen.
### C · Cron-Job (täglich automatisch)
```bash
# In ~/Library/LaunchAgents/com.rapport.backup.plist hinterlegen
# oder als crontab-Eintrag:
0 22 * * * rsync -a "$HOME/Library/Application Support/com.rapport.app/" \
"$HOME/Backups/rapport/$(date +\%Y\%m\%d)/"
```
### D · iCloud Drive (off-site)
Application-Support liegt **nicht** automatisch in iCloud. Wer das will:
```bash
# Symlink anlegen
mkdir -p "~/iCloud Drive/Rapport"
ln -s "~/Library/Application Support/com.rapport.app" "~/iCloud Drive/Rapport/data"
```
> **Achtung:** iCloud-Sync mit aktiver App kann zu **Race-Conditions** führen. Besser den Sync zeitversetzt (z. B. nachts via Cron).
## Wiederherstellung
### Vollständig (Rapport komplett tot)
1. Rapport beenden (Cmd+Q, nicht nur Fenster zu)
2. Aktuellen Ordner umbenennen (falls noch da):
```bash
mv "~/Library/Application Support/com.rapport.app" \
"~/Library/Application Support/com.rapport.app.bak"
```
3. Backup-Ordner zurück kopieren:
```bash
cp -R "~/Documents/Rapport-Backup-20260523" \
"~/Library/Application Support/com.rapport.app"
```
4. Rapport starten
### Selektiv (nur einzelne Daten)
Da alle Daten in **einem JSON unter `studio_data_v1`** liegen, ist selektive Wiederherstellung **manuell**:
1. Backup-`localStorage`-Datei öffnen (WebKit-Format → mit Tool wie [WebKit Storage Inspector] lesen, oder via Rapport DevTools)
2. Gewünschte Felder in die aktuelle Instanz übertragen
In der Praxis: meistens lohnt sich die **vollständige** Wiederherstellung mehr.
## Export-Funktionen (in der App)
Aus Rapport selbst:
| Was | Wo | Format |
|---|---|---|
| **Zeit-Auswertung** | Zeit → Export | CSV |
| **Rechnung** | Rechnung → PDF | PDF (inkl. QR) |
| **Offerte** | Offerte → PDF | PDF |
| **Lohnabrechnung** | Mitarbeiter → PDF | PDF |
| **Jahres-Buchhaltung** | Buchhaltung → Export | CSV |
Die Exports sind für externe Verwendung (Buchhalter, Treuhänder, Archiv) gedacht — kein Full-Backup.
## Schema-Migrationen
Bei Updates kann sich das Datenformat ändern. Rapport hat einen **Migrations-Mechanismus**: beim Start prüft die App, ob das gespeicherte Format dem aktuellen entspricht, und migriert es automatisch.
Code: [src/storage/migrations.js](https://git.kgva.ch/karim/RAPPORT/src/branch/main/APP/src/storage/migrations.js).
> **Empfehlung:** Vor jedem grösseren Update ein Backup machen — Migrationen sind getestet, aber 100%-Sicherheit gibt es nicht.
## Was wird **nicht** gespeichert?
- **WebView-Cache** — `~/Library/Caches/com.rapport.app/` und `~/Library/WebKit/com.rapport.app/` sind sicher zu löschen (UI-Caches, regenerieren sich)
- **App-Updates** — werden bei Bedarf erneut runtergeladen
- **Logs** — `~/Library/Logs/com.rapport.app/` (geplant, derzeit nicht geschrieben)
## Datenmenge
Typische Grössen pro Bürojahr:
| Inhalt | Grösse |
|---|---|
| Logo (PNG/SVG) | 50 KB 1 MB |
| 1 Jahr Zeiterfassung (1 MA) | ~ 80 KB |
| 1 Jahr Zeiterfassung (5 MA) | ~ 400 KB |
| 50 Projekte mit je 5 Rechnungen | ~ 800 KB |
| **Total typisches Solo-Büro / Jahr** | **~ 12 MB** |
localStorage hat Limits (i. d. R. ~10 MB pro Origin). Für Solo-Büros reicht das problemlos für viele Jahre. Wer das Limit erreicht oder im Team arbeitet → [Rapport Server](../../server/).