# Backup, restore e recuperação operacional

## Escopo mínimo desta etapa

A recuperação operacional desta fase cobre apenas o que sustenta o produto sem improviso:

- dump do banco central MySQL/MariaDB;
- arquivos de ambiente ativos (`.env`, `.env.patch` e variantes do `APP_ENV` quando existirem);
- estado essencial configurado em `BACKUP_STATE_PATHS`.

Fica explicitamente fora do backup mínimo desta etapa:

- mídia NVR, gravações e snapshots pesados;
- sessões efêmeras;
- rate-limit efêmero;
- logs gerais não essenciais.

## Configuração mínima

No `.env` real, ajuste ao menos:

```dotenv
BACKUP_OUTPUT_DIR=storage/backups
BACKUP_RETENTION_DAYS=7
BACKUP_STATE_PATHS=storage/cache/scheduler-last-run.json,storage/cache/sso-replay,storage/logs/failed-jobs.log
```

## Backup

Preview seguro:

```bash
php scripts/backup-create.php
```

Execução real:

```bash
php scripts/backup-create.php --execute
```

Somente config + estado, útil para drill local sem banco:

```bash
php scripts/backup-create.php --only=config,state --execute --format=directory
```

## Restore

Preview seguro do restore:

```bash
php scripts/backup-restore.php --source=storage/backups/ARQUIVO_OU_DIRETORIO_DO_BACKUP
```

Execução real do restore:

```bash
php scripts/backup-restore.php --source=storage/backups/ARQUIVO_OU_DIRETORIO_DO_BACKUP --execute
```

Restore seletivo:

```bash
php scripts/backup-restore.php --source=storage/backups/ARQUIVO_OU_DIRETORIO_DO_BACKUP --only=config,state --execute
```

## Comportamento operacional

- ambos os scripts rodam em preview por padrão;
- o backup gera `manifest.json` com checksum SHA-256 de cada artefato;
- o restore valida o `manifest.json` antes de sobrescrever arquivos;
- quando houver sobrescrita de arquivos locais, o restore salva uma cópia prévia em `storage/backups/pre-restore/`;
- o backup aplica retenção simples em `BACKUP_OUTPUT_DIR`;
- o restore compara o fingerprint das migrations do release atual com o fingerprint do backup para sinalizar divergência de release.

## Dependências externas

Backup do banco:

- `mysqldump`

Restore do banco:

- `mysql`

## Fluxo recomendado

1. executar o preview do backup;
2. executar o backup real e guardar o artefato gerado;
3. executar o preview do restore no artefato escolhido;
4. somente então executar o restore real.
