# Zálohy a obnova

U instalace na vlastním serveru je všechno podstatné v **databázi**:
nastavení, pokyny, zdroje znalostí, zprávy, koncepty i šifrovaná tajemství.
Zálohujete tedy databázi — a soubor `.env` s klíčem `MASTER_KEY`.

## Co zálohovat

1. **Databázi** — draften ji sám ukládá do složky `backups/` (viz níže); vy
   se postaráte, aby se výpisy dostaly mimo server.
2. **`.env`**, hlavně **`MASTER_KEY`** — mimo server, na bezpečné místo. Bez
   něj z databáze nepřečtete API klíče, přístupy ke schránkám ani klienty pro
   přihlášení; záloha by byla k ničemu. My ho nemáme.

Výpis databáze obsahuje poštu zákazníků. Chraňte ho stejně jako samotnou
schránku.

## Zálohy, které dělá draften

draften ukládá výpis databáze do složky `backups/` v adresáři instalace:

- **každý den** — v 01:00 pražského času, nebo v čase, který nastavíte ve
  **Správě instalace → Instalace**, v kartě **Zálohy databáze**. Když byl
  server v tu dobu vypnutý, záloha se udělá hned, jak znovu naběhne. Když se
  nepovede, zkusí se znovu za hodinu a karta ukáže proč.
- **na požádání** — tlačítkem **Zálohovat teď** v téže kartě. Průběh je vidět
  v Historii žádostí jako „Záloha databáze“.
- **před každou aktualizací** — aby šlo vrátit i změny v databázi.

Denní zálohy a zálohy na požádání se počítají zvlášť od záloh před
aktualizací: drží se jich posledních 7 a vedle nich poslední 3 zálohy před
aktualizací. Karta ukazuje posledních sedm záloh — kdy vznikly, jakého jsou
druhu, z jaké verze a jak jsou velké.

V `.env` jde nastavení změnit:

| Proměnná | K čemu |
|---|---|
| `DRAFTEN_DAILY_BACKUPS` | kolik denních záloh a záloh na požádání držet (výchozí 7); `0` denní zálohu vypne, na požádání se zálohuje dál |
| `DRAFTEN_BACKUP_AT`, `DRAFTEN_TIMEZONE` | čas denní zálohy a jeho časové pásmo (výchozí `01:00`, `Europe/Prague`); čas nastavený v rozhraní má přednost |
| `DRAFTEN_BACKUPS` | kolik záloh před aktualizací držet (výchozí 3) |

### Bez updateru

Denní zálohy a tlačítko obstarává updater. Když na instalaci neběží, udělá
tutéž zálohu příkaz:

```
./draften backup
```

Na denní zálohu ho spouštějte z cronu, třeba v jednu ráno (cestu nahraďte
adresářem své instalace):

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

## Zálohy v `backups/` nejsou mimo server

Leží na stejném disku jako databáze — když přijdete o disk nebo server,
přijdete i o ně. Kopírujte složku `backups/` spolu s `.env` jinam, jak to
dělají vaše ostatní zálohy, nebo zálohujte celý server až po denní záloze
(tedy po 01:00, případně po čase, který jste nastavili).

Zálohy v `backups/` nemění [doba uchování dat](/cs/admin/data-storage): výpis
drží, co v databázi bylo, když vznikl.

## Obnova

Každý výpis v `backups/` nese v názvu čas a verzi, která tehdy běžela:
`<čas>-<verze>.backup.sql.gz` u denních záloh a záloh na požádání,
`<čas>-<verze>.sql.gz` u záloh před aktualizací. Zastavte workery, nahrajte
výpis a spusťte verzi z jeho názvu:

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

Všechno, co se v draftenu stalo po vzniku výpisu, se tím ztratí.

Na novém serveru nejdřív draften nainstalujte a do `.env` vložte `MASTER_KEY`
z doby, kdy výpis vznikl.

## Výměna šifrovacího klíče

`MASTER_KEY` jde vyměnit bez výpadku — v rozhraní (**Správa instalace →
Instalace → Šifrovací klíč → Vyměnit šifrovací klíč**, potřebuje updater),
nebo příkazem:

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

Nový klíč se nejdřív zapíše do `.env`, kontejnery si ho postupně vezmou
a všechno uložené se jím znovu zašifruje. Starý klíč zůstane v `.env` jako
`MASTER_KEY_PREVIOUS`, dokud jsou v `backups/` výpisy z doby před výměnou —
jen jím se dají otevřít. Další výměnu draften odmítne, dokud takový výpis
existuje. Denní zálohy z doby před výměnou zmizí nejpozději po 7 dnech, zálohy
před aktualizací až po třech dalších aktualizacích.

!> Po výměně si **hned zkopírujte nový `.env` mimo server.** Nový klíč se do
rozhraní nikdy nedostane; je jen v `.env` na serveru.

## Na co si dát pozor

- Svazek `db-data` je živá databáze. **Nikdy** nemažte instalaci příkazem
  `docker compose down -v`, pokud nemáte čerstvý výpis mimo server.
- Složka `data/` pravdu nedrží — jsou v ní jen log a reporty workera.
- V rozhraní si to vždy můžete ověřit: v kartě **Stav instalace** na stránce
  Instalace je vidět, jestli je `MASTER_KEY` nastavený, a v kartě **Zálohy
  databáze**, kdy vznikla poslední záloha. Z příkazové řádky totéž ukáže
  `./draften status`.
