# Copia de seguridad y restauración

En una instalación en su propio servidor, todo lo importante está en la **base
de datos**: la configuración, las instrucciones, las fuentes de conocimiento,
los mensajes, los borradores y los secretos cifrados. Por eso se hace copia de
seguridad de la base de datos y del archivo `.env` con la `MASTER_KEY`.

## Qué copiar

1. **La base de datos**: draften la vuelca él mismo en la carpeta `backups/`
   (vea más abajo); usted se encarga de que los volcados salgan del servidor.
2. **`.env`**, sobre todo **`MASTER_KEY`**: fuera del servidor, en un lugar
   seguro. Sin ella no se pueden leer de la base de datos las claves de API, el
   acceso a los buzones ni los clientes de inicio de sesión; la copia de
   seguridad no serviría de nada. Nosotros no la tenemos.

Un volcado de la base de datos contiene el correo de los clientes. Protéjalo
igual que el propio buzón.

## Las copias de seguridad que hace draften

draften guarda un volcado de la base de datos en la carpeta `backups/` del
directorio de la instalación:

- **cada día**: a la 01:00, hora de Praga, o a la hora que configure en
  **Instalación › Instalación**, en la tarjeta **Copias de seguridad de la base
  de datos**. Si el servidor estaba apagado a esa hora, la copia se hace en
  cuanto vuelve a arrancar. Si falla, se vuelve a intentar una hora después y
  la tarjeta muestra el motivo.
- **a petición**: con el botón **Hacer copia ahora** de la misma tarjeta. Su
  progreso aparece en Historial de solicitudes como «Copia de seguridad de la
  base de datos».
- **antes de cada actualización**: para que también se puedan deshacer los
  cambios en la base de datos.

Las copias diarias y las hechas a petición se cuentan aparte de las de antes de
las actualizaciones: se conservan las 7 últimas y, además, las 3 últimas copias
de antes de una actualización. La tarjeta muestra las siete últimas copias:
cuándo se hicieron, su tipo, la versión y el tamaño.

La configuración se puede cambiar en `.env`:

| Variable | Para qué |
|---|---|
| `DRAFTEN_DAILY_BACKUPS` | cuántas copias diarias y a petición se conservan (7 de forma predeterminada); `0` desactiva la copia diaria, pero las copias a petición se siguen haciendo |
| `DRAFTEN_BACKUP_AT`, `DRAFTEN_TIMEZONE` | la hora de la copia diaria y su zona horaria (de forma predeterminada `01:00`, `Europe/Prague`); la hora configurada en la interfaz tiene prioridad |
| `DRAFTEN_BACKUPS` | cuántas copias de antes de una actualización se conservan (3 de forma predeterminada) |

### Sin el updater

Las copias diarias y el botón son trabajo del updater. Si en la instalación no
se ejecuta el updater, la misma copia la hace el comando:

```
./draften backup
```

Para una copia diaria, ejecútelo desde cron, por ejemplo a la una de la
madrugada (sustituya la ruta por el directorio de su instalación):

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

## Las copias de `backups/` no están fuera del servidor

Están en el mismo disco que la base de datos: si pierde el disco o el
servidor, también las pierde. Copie la carpeta `backups/` junto con `.env` a
otro lugar, igual que sus demás copias de seguridad, o haga la copia de
seguridad de todo el servidor después de la copia diaria (es decir, después de
la 01:00 o de la hora que haya configurado).

La [conservación de los datos](/es/admin/data-storage) no afecta a las copias
de `backups/`: un volcado conserva lo que contenía la base de datos cuando se
hizo.

## Restaurar

Cada volcado de `backups/` lleva en el nombre la hora y la versión que estaba
en ejecución entonces: `<hora>-<versión>.backup.sql.gz` en las copias diarias
y a petición, `<hora>-<versión>.sql.gz` en las de antes de una actualización.
Detenga los workers, cargue el volcado e inicie la versión que indica su
nombre:

```
docker compose stop worker
gunzip -c backups/<volcado>.sql.gz | docker compose exec -T db sh -c 'mariadb -uroot -p"$MARIADB_ROOT_PASSWORD"'
./draften update <versión> --no-backup
```

Todo lo que ocurrió en draften después de hacerse el volcado se pierde.

En un servidor nuevo, instale primero draften y ponga en `.env` la `MASTER_KEY`
del momento en que se hizo el volcado.

## Sustituir la clave de cifrado

`MASTER_KEY` se puede sustituir sin interrumpir el servicio: en la interfaz
(**Instalación › Instalación › Clave de cifrado › Sustituir la clave de
cifrado**, requiere el updater) o con el comando:

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

Primero se escribe la clave nueva en `.env`, los contenedores la toman uno a uno
y todo lo guardado se vuelve a cifrar con ella. La clave anterior permanece en
`.env` como `MASTER_KEY_PREVIOUS` mientras `backups/` contenga volcados de antes
de la sustitución: solo ella puede abrirlos. draften no permite otra
sustitución mientras exista un volcado así. Las copias diarias de antes de la
sustitución desaparecen como máximo a los 7 días; las de antes de una
actualización, solo después de tres actualizaciones más.

!> Tras la sustitución, **copie enseguida el nuevo `.env` fuera del servidor.**
La clave nueva nunca llega a la interfaz; solo está en `.env`, en el servidor.

## Atención

- El volumen `db-data` es la base de datos en uso. **Nunca** elimine la
  instalación con `docker compose down -v` si no tiene un volcado reciente
  fuera del servidor.
- La carpeta `data/` no contiene nada imprescindible: solo están ahí el registro
  y los informes del worker.
- Siempre puede comprobarlo en la interfaz: la tarjeta **Estado de la
  instalación** de la página Instalación muestra si `MASTER_KEY` está
  configurada, y la tarjeta **Copias de seguridad de la base de datos**, cuándo
  se hizo la última copia. En la línea de comandos, `./draften status` muestra
  lo mismo.
