# Backup e restauração

Em uma instalação no seu próprio servidor, tudo o que importa está no **banco
de dados**: configurações, instruções, fontes de conhecimento, mensagens,
rascunhos e os segredos criptografados. Por isso você faz backup do banco de
dados – e do arquivo `.env` com a `MASTER_KEY`.

## Do que fazer backup

1. **Do banco de dados** – o próprio draften faz o dump dele na pasta
   `backups/` (veja abaixo); você garante que os dumps saiam do servidor.
2. **Do `.env`**, sobretudo da **`MASTER_KEY`** – fora do servidor, em um lugar
   seguro. Sem ela, você não consegue ler do banco de dados as chaves de API, os
   acessos às caixas de e-mail nem os clientes de login; o backup seria inútil.
   Nós não a temos.

Um dump do banco de dados contém os e-mails dos clientes. Proteja-o como a
própria caixa de e-mail.

## Os backups que o draften faz

O draften salva um dump do banco de dados na pasta `backups/` do diretório da
instalação:

- **todos os dias** – às 01:00 no horário de Praga, ou no horário que você
  definir em **Instalação → Instalação**, no cartão **Backups do banco de
  dados**. Se o servidor estava desligado nesse horário, o backup é feito assim
  que ele voltar. Se falhar, uma nova tentativa é feita uma hora depois e o
  cartão mostra o motivo.
- **sob demanda** – com o botão **Fazer backup agora** no mesmo cartão. O
  progresso aparece em Solicitações como “Backup do banco de dados”.
- **antes de cada atualização** – para que também as mudanças no banco de
  dados possam ser desfeitas.

Os backups diários e os sob demanda são contados separadamente dos feitos antes
das atualizações: ficam os 7 últimos deles e, ao lado, os 3 últimos backups de
antes de uma atualização. O cartão mostra os sete últimos backups – quando
foram feitos, o tipo, a versão e o tamanho.

As configurações podem ser alteradas no `.env`:

| Variável | Para quê |
|---|---|
| `DRAFTEN_DAILY_BACKUPS` | quantos backups diários e sob demanda manter (padrão 7); `0` desativa o diário, o backup sob demanda continua sendo feito |
| `DRAFTEN_BACKUP_AT`, `DRAFTEN_TIMEZONE` | o horário do backup diário e o fuso horário dele (padrão `01:00`, `Europe/Prague`); um horário definido na interface tem prioridade |
| `DRAFTEN_BACKUPS` | quantos backups de antes de uma atualização manter (padrão 3) |

### Sem o updater

Os backups diários e o botão são trabalho do updater. Quando a instalação não
tem o updater rodando, o mesmo backup é feito com:

```
./draften backup
```

Para um backup diário, execute-o pelo cron, por exemplo à uma da manhã
(substitua o caminho pelo diretório da sua instalação):

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

## Os backups em `backups/` não estão fora do servidor

Eles ficam no mesmo disco que o banco de dados – se você perder o disco ou o
servidor, perde os backups também. Copie a pasta `backups/` junto com o `.env`
para outro lugar, como fazem os seus outros backups, ou faça backup do servidor
inteiro depois do backup diário (ou seja, depois das 01:00 ou do horário que
você definiu).

Os backups em `backups/` não são afetados pela
[retenção de dados](/pt/admin/data-storage): um dump guarda o que havia no
banco de dados quando foi feito.

## Restauração

Cada dump em `backups/` traz no nome o horário e a versão que estava rodando
naquele momento: `<time>-<version>.backup.sql.gz` para os backups diários e os
sob demanda, `<time>-<version>.sql.gz` para os de antes de uma atualização.
Pare os workers, carregue o dump e inicie a versão que está no nome dele:

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

Tudo o que aconteceu no draften depois que o dump foi feito se perde.

Em um servidor novo, instale primeiro o draften e coloque no `.env` a
`MASTER_KEY` da época em que o dump foi feito.

## Trocar a chave de criptografia

A `MASTER_KEY` pode ser trocada sem interrupção – na interface
(**Instalação → Instalação → Chave de criptografia → Trocar a chave de
criptografia**, requer o updater) ou com o comando:

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

A nova chave é gravada primeiro no `.env`, os contêineres a assumem um a um e
tudo o que está guardado é criptografado de novo com ela. A chave antiga fica
no `.env` como `MASTER_KEY_PREVIOUS` enquanto `backups/` tiver dumps de antes da
troca – só ela consegue abri-los. O draften recusa uma nova troca enquanto
existir um dump desses. Os backups diários de antes da troca somem em no máximo
7 dias; os de antes de uma atualização, só depois de mais três atualizações.

!> Depois da troca, **copie o novo `.env` para fora do servidor na hora.** A
nova chave nunca chega à interface; ela está só no `.env` do servidor.

## Atenção

- O volume `db-data` é o banco de dados em uso. **Nunca** remova a instalação
  com `docker compose down -v` se não tiver um dump recente fora do servidor.
- A pasta `data/` não guarda a verdade – ali ficam só o log e os relatórios do
  worker.
- Você sempre pode conferir na interface: o cartão **Status da instalação** na
  página Instalação mostra se a `MASTER_KEY` está definida, e o cartão
  **Backups do banco de dados**, quando foi feito o último backup. Na linha de
  comando, `./draften status` mostra o mesmo.
