# Backup e ripristino

In un’installazione sul tuo server, tutto ciò che conta sta nel **database**:
impostazioni, istruzioni, fonti di conoscenza, messaggi, bozze e i segreti
cifrati. Quindi fai il backup del database – e del file `.env` con la
`MASTER_KEY`.

## Di cosa fare il backup

1. **Il database** – draften stesso ne salva i dump nella cartella `backups/`
   (vedi sotto); tu fai in modo che i dump finiscano fuori dal server.
2. **`.env`**, soprattutto la **`MASTER_KEY`** – fuori dal server, in un posto
   sicuro. Senza di essa non puoi leggere dal database le chiavi API, l’accesso
   alle caselle né i client di accesso; il backup sarebbe inutile. Noi non la
   abbiamo.

Un dump del database contiene la posta dei clienti. Proteggilo come la casella
stessa.

## I backup che fa draften

draften salva un dump del database nella cartella `backups/` della cartella
dell’installazione:

- **ogni giorno** – alle 01:00 ora di Praga, oppure all’ora che imposti in
  **Installazione → Installazione**, nel riquadro **Backup del database**. Se a
  quell’ora il server era spento, il backup viene eseguito appena torna attivo.
  Se non riesce, si riprova un’ora dopo e il riquadro mostra perché.
- **su richiesta** – con il pulsante **Esegui il backup ora** nello stesso
  riquadro. L’avanzamento compare in Richieste come “Backup del database”.
- **prima di ogni aggiornamento** – così si possono annullare anche le
  modifiche al database.

I backup giornalieri e quelli su richiesta si contano separatamente da quelli
prima degli aggiornamenti: se ne tengono gli ultimi 7 e, accanto a questi, gli
ultimi 3 backup di prima di un aggiornamento. Il riquadro mostra gli ultimi
sette backup – quando sono stati eseguiti, il tipo, la versione e la
dimensione.

Le impostazioni si possono cambiare in `.env`:

| Variabile | A cosa serve |
|---|---|
| `DRAFTEN_DAILY_BACKUPS` | quanti backup giornalieri e su richiesta tenere (predefinito 7); `0` disattiva quello giornaliero, il backup su richiesta si fa comunque |
| `DRAFTEN_BACKUP_AT`, `DRAFTEN_TIMEZONE` | l’ora del backup giornaliero e il suo fuso orario (predefiniti `01:00`, `Europe/Prague`); l’ora impostata nell’interfaccia ha la precedenza |
| `DRAFTEN_BACKUPS` | quanti backup di prima di un aggiornamento tenere (predefinito 3) |

### Senza l’updater

I backup giornalieri e il pulsante sono compito dell’updater. Quando
nell’installazione l’updater non è attivo, lo stesso backup lo esegue il
comando:

```
./draften backup
```

Per un backup giornaliero, eseguilo da cron, per esempio all’una di notte
(sostituisci il percorso con la cartella della tua installazione):

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

## I backup in `backups/` non sono fuori dal server

Stanno sullo stesso disco del database – se perdi il disco o il server, perdi
anche loro. Copia la cartella `backups/` insieme a `.env` altrove, come gli
altri tuoi backup, oppure fai il backup dell’intero server dopo il backup
giornaliero (cioè dopo le 01:00 o dopo l’ora che hai impostato).

La [conservazione dei dati](/it/admin/data-storage) non tocca i backup in
`backups/`: un dump conserva ciò che il database conteneva quando è stato
creato.

## Ripristino

Ogni dump in `backups/` porta nel nome l’ora e la versione che era in
esecuzione in quel momento: `<ora>-<versione>.backup.sql.gz` per i backup
giornalieri e su richiesta, `<ora>-<versione>.sql.gz` per quelli prima di un
aggiornamento. Ferma i worker, carica il dump e avvia la versione indicata nel
suo nome:

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

Tutto ciò che è successo in draften dopo la creazione del dump va perso.

Su un nuovo server, installa prima draften e metti in `.env` la `MASTER_KEY`
del momento in cui è stato creato il dump.

## Sostituire la chiave di cifratura

La `MASTER_KEY` si può sostituire senza interruzioni – nell’interfaccia
(**Installazione → Installazione → Chiave di cifratura → Sostituisci la chiave
di cifratura**, richiede l’updater), oppure con il comando:

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

La nuova chiave viene prima scritta in `.env`, i container la prendono uno alla
volta e tutto ciò che è salvato viene cifrato di nuovo con essa. La vecchia
chiave resta in `.env` come `MASTER_KEY_PREVIOUS` finché in `backups/` ci sono
dump precedenti alla sostituzione – solo lei li può aprire. draften rifiuta
un’altra sostituzione finché esiste un dump del genere. I backup giornalieri di
prima della sostituzione spariscono al più tardi dopo 7 giorni, quelli di prima
di un aggiornamento solo dopo altri tre aggiornamenti.

!> Dopo la sostituzione, **copia subito il nuovo `.env` fuori dal server.** La
nuova chiave non arriva mai nell’interfaccia; è solo in `.env` sul server.

## Attenzione

- Il volume `db-data` è il database attivo. **Non** rimuovere **mai**
  l’installazione con `docker compose down -v` se non hai un dump recente fuori
  dal server.
- La cartella `data/` non contiene i dati veri e propri – lì ci sono solo il log
  e i report del worker.
- Nell’interfaccia puoi sempre controllare: il riquadro **Stato
  dell’installazione** nella pagina Installazione mostra se la `MASTER_KEY` è
  impostata, e il riquadro **Backup del database** quando è stato eseguito
  l’ultimo backup. Dalla riga di comando lo stesso lo mostra `./draften status`.
