# Sauvegarde et restauration

Dans une installation sur votre propre serveur, tout ce qui compte se trouve
dans la **base de données** : paramètres, consignes, sources de connaissances,
messages, brouillons et secrets chiffrés. Vous sauvegardez donc la base de
données – ainsi que le fichier `.env` avec la `MASTER_KEY`.

## Ce qu’il faut sauvegarder

1. **La base de données** – draften en fait lui-même des dumps dans le dossier
   `backups/` (voir ci-dessous) ; à vous de veiller à ce que les dumps soient
   copiés hors du serveur.
2. **`.env`**, et surtout **`MASTER_KEY`** – hors du serveur, en lieu sûr.
   Sans elle, vous ne pouvez pas lire dans la base de données les clés API,
   les accès aux boîtes mail ni les clients de connexion ; la sauvegarde ne
   servirait à rien. Nous ne l’avons pas.

Un dump de la base de données contient les e-mails des clients. Protégez-le
comme la boîte mail elle-même.

## Les sauvegardes que fait draften

draften enregistre un dump de la base de données dans le dossier `backups/` du
répertoire d’installation :

- **chaque jour** – à 01:00, heure de Prague, ou à l’heure que vous définissez
  sous **Installation → Installation**, dans la carte **Sauvegardes de la base
  de données**. Si le serveur était éteint à cette heure-là, la sauvegarde est
  faite dès qu’il redémarre. Si elle échoue, une nouvelle tentative a lieu une
  heure plus tard et la carte en indique la raison.
- **sur demande** – avec le bouton **Sauvegarder maintenant** dans la même
  carte. Sa progression apparaît dans Demandes sous le nom « Sauvegarde de la
  base de données ».
- **avant chaque mise à jour** – pour que les modifications de la base de
  données puissent elles aussi être annulées.

Les sauvegardes quotidiennes et celles faites sur demande sont comptées à part
de celles faites avant les mises à jour : les 7 dernières sont conservées, et à
côté d’elles les 3 dernières sauvegardes antérieures à une mise à jour. La
carte affiche les sept dernières sauvegardes – quand elles ont été réalisées,
leur type, la version et la taille.

Les paramètres peuvent être modifiés dans `.env` :

| Variable | À quoi elle sert |
|---|---|
| `DRAFTEN_DAILY_BACKUPS` | combien de sauvegardes quotidiennes et de sauvegardes sur demande conserver (7 par défaut) ; `0` désactive la sauvegarde quotidienne, une sauvegarde sur demande est tout de même réalisée |
| `DRAFTEN_BACKUP_AT`, `DRAFTEN_TIMEZONE` | l’heure de la sauvegarde quotidienne et son fuseau horaire (par défaut `01:00`, `Europe/Prague`) ; une heure définie dans l’interface l’emporte |
| `DRAFTEN_BACKUPS` | combien de sauvegardes antérieures à une mise à jour conserver (3 par défaut) |

### Sans l’updater

Les sauvegardes quotidiennes et le bouton sont le travail de l’updater. Quand
aucun updater ne tourne sur l’installation, la même sauvegarde est faite par la
commande :

```
./draften backup
```

Pour une sauvegarde quotidienne, lancez-la depuis cron, par exemple à une heure
du matin (remplacez le chemin par le répertoire de votre installation) :

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

## Les sauvegardes de `backups/` ne sont pas hors du serveur

Elles se trouvent sur le même disque que la base de données – si vous perdez le
disque ou le serveur, vous les perdez aussi. Copiez le dossier `backups/` avec
`.env` ailleurs, comme vos autres sauvegardes, ou sauvegardez tout le serveur
après la sauvegarde quotidienne (c’est-à-dire après 01:00 ou l’heure que vous
avez définie).

Les sauvegardes de `backups/` ne sont pas concernées par la
[conservation des données](/fr/admin/data-storage) : un dump conserve ce que
contenait la base de données au moment où il a été réalisé.

## Restauration

Chaque dump de `backups/` porte dans son nom l’heure et la version qui tournait
à ce moment-là : `<heure>-<version>.backup.sql.gz` pour les sauvegardes
quotidiennes et celles faites sur demande, `<heure>-<version>.sql.gz` pour
celles faites avant une mise à jour. Arrêtez les workers, chargez le dump et
démarrez la version indiquée dans son nom :

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

Tout ce qui s’est passé dans draften après la création du dump est perdu.

Sur un nouveau serveur, installez d’abord draften et placez dans `.env` la
`MASTER_KEY` en vigueur au moment du dump.

## Remplacer la clé de chiffrement

La `MASTER_KEY` peut être remplacée sans interruption de service – dans
l’interface (**Installation → Installation → Clé de chiffrement → Remplacer la
clé de chiffrement**, nécessite l’updater), ou avec la commande :

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

La nouvelle clé est d’abord inscrite dans `.env`, les conteneurs la prennent
l’un après l’autre et tout ce qui est stocké est chiffré à nouveau avec elle.
L’ancienne clé reste dans `.env` sous le nom `MASTER_KEY_PREVIOUS` tant que
`backups/` contient des dumps antérieurs au remplacement – elle seule peut les
ouvrir. draften refuse un nouveau remplacement tant qu’un tel dump existe. Les
sauvegardes quotidiennes antérieures au remplacement disparaissent au plus tard
au bout de 7 jours, les sauvegardes antérieures à une mise à jour seulement
après trois nouvelles mises à jour.

!> Après le remplacement, **copiez immédiatement le nouveau `.env` hors du
serveur.** La nouvelle clé n’apparaît jamais dans l’interface ; elle se trouve
uniquement dans `.env` sur le serveur.

## Attention

- Le volume `db-data` est la base de données en service. **Ne supprimez
  jamais** l’installation avec `docker compose down -v` sans disposer d’un dump
  récent hors du serveur.
- Le dossier `data/` ne contient pas les données de référence – seulement le
  journal et les rapports du worker.
- Vous pouvez toujours vérifier dans l’interface : la carte **État de
  l’installation** de la page Installation indique si `MASTER_KEY` est définie,
  et la carte **Sauvegardes de la base de données** quand la dernière
  sauvegarde a été réalisée. En ligne de commande, `./draften status` affiche
  la même chose.
