# Sicherung und Wiederherstellung

Bei einer Installation auf dem eigenen Server steht alles, was zählt, in der
**Datenbank**: Einstellungen, Anweisungen, Wissensquellen, Nachrichten,
Entwürfe und die verschlüsselten Geheimnisse. Sie sichern also die Datenbank –
und die Datei `.env` mit dem `MASTER_KEY`.

## Was Sie sichern

1. **Die Datenbank** – draften sichert sie selbst in den Ordner `backups/`
   (siehe unten); Sie sorgen dafür, dass die Sicherungen vom Server
   wegkommen.
2. **`.env`**, vor allem **`MASTER_KEY`** – außerhalb des Servers, an einem
   sicheren Ort. Ohne ihn können Sie die API-Schlüssel, die Zugriffe auf
   Postfächer und die Anmelde-Clients aus der Datenbank nicht lesen; die
   Sicherung wäre nutzlos. Wir haben ihn nicht.

Eine Datenbanksicherung enthält die Post der Kunden. Schützen Sie sie wie das
Postfach selbst.

## Die Sicherungen, die draften erstellt

draften speichert eine Datenbanksicherung im Ordner `backups/` im Verzeichnis
der Installation:

- **jeden Tag** – um 01:00 Uhr Prager Zeit oder zu der Uhrzeit, die Sie unter
  **Installation → Installation** in der Karte **Datenbanksicherungen**
  festlegen. War der Server zu dieser Zeit ausgeschaltet, wird die Sicherung
  erstellt, sobald er wieder läuft. Schlägt sie fehl, wird sie eine Stunde
  später erneut versucht, und die Karte zeigt den Grund.
- **auf Anfrage** – mit der Schaltfläche **Jetzt sichern** in derselben Karte.
  Den Fortschritt sehen Sie unter Aufträge als „Datenbanksicherung“.
- **vor jeder Aktualisierung** – damit sich auch Änderungen an der Datenbank
  rückgängig machen lassen.

Die täglichen Sicherungen und die auf Anfrage werden getrennt von denen vor
Aktualisierungen gezählt: Von ihnen bleiben die letzten 7, daneben die letzten
3 Sicherungen von vor einer Aktualisierung. Die Karte zeigt die letzten sieben
Sicherungen – wann sie erstellt wurden, ihre Art, die Version und die Größe.

Die Einstellungen lassen sich in `.env` ändern:

| Variable | Wofür |
|---|---|
| `DRAFTEN_DAILY_BACKUPS` | wie viele tägliche Sicherungen und Sicherungen auf Anfrage bleiben (Standard 7); `0` schaltet die tägliche aus, eine Sicherung auf Anfrage wird weiterhin erstellt |
| `DRAFTEN_BACKUP_AT`, `DRAFTEN_TIMEZONE` | die Uhrzeit der täglichen Sicherung und ihre Zeitzone (Standard `01:00`, `Europe/Prague`); eine in der Oberfläche festgelegte Uhrzeit hat Vorrang |
| `DRAFTEN_BACKUPS` | wie viele Sicherungen von vor einer Aktualisierung bleiben (Standard 3) |

### Ohne Updater

Die täglichen Sicherungen und die Schaltfläche übernimmt der Updater. Läuft
auf der Installation kein Updater, erstellt dieselbe Sicherung der Befehl:

```
./draften backup
```

Für eine tägliche Sicherung führen Sie ihn per cron aus, etwa um ein Uhr
nachts (ersetzen Sie den Pfad durch das Verzeichnis Ihrer Installation):

```
0 1 * * * cd /srv/draften && ./draften backup
```

## Die Sicherungen in `backups/` liegen nicht außerhalb des Servers

Sie liegen auf derselben Platte wie die Datenbank – verlieren Sie die Platte
oder den Server, verlieren Sie auch sie. Kopieren Sie den Ordner `backups/`
zusammen mit `.env` an einen anderen Ort, so wie Ihre anderen Backups, oder
sichern Sie den ganzen Server erst nach der täglichen Sicherung (also nach
01:00 Uhr bzw. nach der Uhrzeit, die Sie festgelegt haben).

Die [Aufbewahrung der Daten](/de/admin/data-storage) ändert nichts an den
Sicherungen in `backups/`: Eine Sicherung enthält, was bei ihrer Erstellung in
der Datenbank stand.

## Wiederherstellen

Jede Sicherung in `backups/` trägt im Namen die Uhrzeit und die Version, die
damals lief: `<time>-<version>.backup.sql.gz` bei den täglichen Sicherungen
und denen auf Anfrage, `<time>-<version>.sql.gz` bei denen vor einer
Aktualisierung. Halten Sie die Worker an, laden Sie die Sicherung und starten
Sie die Version aus ihrem Namen:

```
docker compose stop worker
gunzip -c backups/<dump>.sql.gz | docker compose exec -T db sh -c 'mariadb -uroot -p"$MARIADB_ROOT_PASSWORD"'
./draften update <version> --no-backup
```

Alles, was in draften nach der Erstellung der Sicherung geschehen ist, geht
verloren.

Auf einem neuen Server installieren Sie zuerst draften und tragen den
`MASTER_KEY` aus der Zeit der Sicherung in `.env` ein.

## Den Verschlüsselungsschlüssel ersetzen

`MASTER_KEY` lässt sich ohne Ausfall ersetzen – in der Oberfläche
(**Installation → Installation → Verschlüsselungsschlüssel →
Verschlüsselungsschlüssel ersetzen**, braucht den Updater) oder mit dem Befehl:

```
./draften rotate-key
```

Der neue Schlüssel wird zuerst in `.env` geschrieben, die Container übernehmen
ihn nacheinander, und alles Gespeicherte wird mit ihm neu verschlüsselt. Der
alte Schlüssel bleibt als `MASTER_KEY_PREVIOUS` in `.env`, solange `backups/`
Sicherungen von vor dem Ersetzen enthält – nur er kann sie öffnen. Solange es
eine solche Sicherung gibt, lehnt draften ein weiteres Ersetzen ab. Tägliche
Sicherungen von vor dem Ersetzen verschwinden spätestens nach 7 Tagen,
Sicherungen von vor einer Aktualisierung erst nach drei weiteren
Aktualisierungen.

!> Kopieren Sie nach dem Ersetzen **die neue `.env` sofort vom Server weg.** Der
neue Schlüssel gelangt nie in die Oberfläche; er steht nur in `.env` auf dem
Server.

## Achtung

- Das Volume `db-data` ist die lebende Datenbank. Entfernen Sie die Installation
  **nie** mit `docker compose down -v`, wenn Sie keine frische Sicherung
  außerhalb des Servers haben.
- Im Ordner `data/` liegt nicht die Wahrheit – dort sind nur das Log und die
  Berichte des Workers.
- In der Oberfläche können Sie immer nachsehen: Die Karte **Zustand der
  Installation** auf der Seite Installation zeigt, ob `MASTER_KEY` gesetzt ist,
  und die Karte **Datenbanksicherungen**, wann die letzte Sicherung erstellt
  wurde. Auf der Kommandozeile zeigt dasselbe `./draften status`.
