---
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.openbureau.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** | **~ 1–2 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/).
