# Kopia zapasowa i odtwarzanie

W instalacji na własnym serwerze wszystko, co ważne, jest w **bazie danych**:
ustawienia, wytyczne, źródła wiedzy, wiadomości, szkice i zaszyfrowane sekrety.
Kopię zapasową robisz więc z bazy danych – i z pliku `.env` z `MASTER_KEY`.

## Co zabezpieczyć

1. **Bazę danych** – draften sam zapisuje jej zrzuty do folderu `backups/`
   (zobacz niżej); ty dbasz o to, żeby zrzuty trafiły poza serwer.
2. **`.env`**, przede wszystkim **`MASTER_KEY`** – poza serwerem, w bezpiecznym
   miejscu. Bez niego nie odczytasz z bazy danych kluczy API, dostępu do
   skrzynek ani klientów logowania; kopia zapasowa byłaby bezużyteczna. My go
   nie mamy.

Zrzut bazy danych zawiera pocztę klientów. Chroń go tak jak samą skrzynkę.

## Kopie zapasowe, które robi draften

draften zapisuje zrzut bazy danych do folderu `backups/` w katalogu instalacji:

- **codziennie** – o 01:00 czasu praskiego albo o godzinie, którą ustawisz
  w **Instalacja → Instalacja**, na karcie **Kopie zapasowe bazy danych**. Gdy
  serwer był o tej porze wyłączony, kopia zostanie zrobiona, gdy tylko znowu
  wstanie. Gdy się nie uda, zostanie ponowiona po godzinie, a karta pokaże
  dlaczego.
- **na żądanie** – przyciskiem **Zrób kopię teraz** na tej samej karcie. Postęp
  widać w Historii zleceń jako „Kopia zapasowa bazy danych”.
- **przed każdą aktualizacją** – żeby dało się cofnąć także zmiany w bazie
  danych.

Kopie codzienne i na żądanie liczą się osobno od kopii sprzed aktualizacji:
przechowywanych jest 7 ostatnich z nich, a obok nich 3 ostatnie kopie sprzed
aktualizacji. Karta pokazuje siedem ostatnich kopii – kiedy powstały, jakiego
są rodzaju, z jakiej wersji i jaki mają rozmiar.

Ustawienia można zmienić w `.env`:

| Zmienna | Do czego |
|---|---|
| `DRAFTEN_DAILY_BACKUPS` | ile kopii codziennych i na żądanie przechowywać (domyślnie 7); `0` wyłącza kopię codzienną, kopia na żądanie dalej się wykonuje |
| `DRAFTEN_BACKUP_AT`, `DRAFTEN_TIMEZONE` | godzina codziennej kopii i jej strefa czasowa (domyślnie `01:00`, `Europe/Prague`); godzina ustawiona w interfejsie ma pierwszeństwo |
| `DRAFTEN_BACKUPS` | ile kopii sprzed aktualizacji przechowywać (domyślnie 3) |

### Bez updatera

Kopie codzienne i przycisk obsługuje updater. Gdy w instalacji nie działa, tę
samą kopię robi polecenie:

```
./draften backup
```

Na kopię codzienną uruchamiaj je z crona, na przykład o pierwszej w nocy
(ścieżkę zastąp katalogiem swojej instalacji):

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

## Kopie w `backups/` nie są poza serwerem

Leżą na tym samym dysku co baza danych – gdy stracisz dysk albo serwer,
stracisz także je. Kopiuj folder `backups/` razem z `.env` w inne miejsce, tak
jak robią to twoje pozostałe kopie zapasowe, albo rób kopię całego serwera po
codziennej kopii (czyli po 01:00 albo po ustawionej przez ciebie godzinie).

Na kopie w `backups/` nie wpływa
[okres przechowywania danych](/pl/admin/data-storage): zrzut zawiera to, co
było w bazie danych, gdy powstał.

## Odtwarzanie

Każdy zrzut w `backups/` ma w nazwie czas i wersję, która wtedy działała:
`<time>-<version>.backup.sql.gz` przy kopiach codziennych i na żądanie,
`<time>-<version>.sql.gz` przy kopiach sprzed aktualizacji. Zatrzymaj workery,
wczytaj zrzut i uruchom wersję z jego nazwy:

```
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
```

Wszystko, co wydarzyło się w draften po utworzeniu zrzutu, przepada.

Na nowym serwerze najpierw zainstaluj draften i wpisz do `.env` `MASTER_KEY`
z czasu, gdy powstał zrzut.

## Wymiana klucza szyfrowania

`MASTER_KEY` można wymienić bez przerwy – w interfejsie
(**Instalacja → Instalacja → Klucz szyfrowania → Wymień klucz szyfrowania**,
wymaga updatera) albo poleceniem:

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

Nowy klucz najpierw zapisuje się do `.env`, kontenery przejmują go jeden po
drugim, a wszystko, co zapisano, zostaje nim zaszyfrowane od nowa. Stary klucz
zostaje w `.env` jako `MASTER_KEY_PREVIOUS`, dopóki `backups/` zawiera zrzuty
sprzed wymiany – tylko on może je otworzyć. draften odmówi kolejnej wymiany,
dopóki taki zrzut istnieje. Kopie codzienne sprzed wymiany znikają najpóźniej
po 7 dniach, kopie sprzed aktualizacji dopiero po trzech kolejnych
aktualizacjach.

!> Po wymianie **od razu skopiuj nowy `.env` poza serwer.** Nowy klucz nigdy
nie trafia do interfejsu; jest tylko w `.env` na serwerze.

## Uwaga

- Wolumen `db-data` to działająca baza danych. **Nigdy** nie usuwaj instalacji
  poleceniem `docker compose down -v`, jeśli nie masz świeżego zrzutu poza
  serwerem.
- Folder `data/` nie zawiera nic istotnego – są tam tylko dziennik i raporty
  workera.
- Zawsze możesz to sprawdzić w interfejsie: karta **Stan instalacji** na
  stronie Instalacja pokazuje, czy ustawiony jest `MASTER_KEY`, a karta
  **Kopie zapasowe bazy danych** – kiedy powstała ostatnia kopia. W wierszu
  poleceń to samo pokazuje `./draften status`.
