backupally restore

Restaura backups a partir de snapshots armazenados.

Sintaxe

backupally restore --target <TASK_ID> --snapshot <SNAPSHOT_ID> [OPÇÕES]

Opções

Opção Descrição Padrão
-t, --target <NOME> Nome da task original (obrigatório pelo clap; com --from-storage, é só rótulo) Obrigatório
-s, --snapshot <ID> Snapshot a restaurar Obrigatório
-p, --path <DIR> Diretório de destino (fileset) ou temporário (database). Sem ele, ./restore relativo ao cwd ./restore
-c, --config <PATH> Caminho da configuração /etc/backupally/config.toml
-f, --force Pula confirmação (só afeta --apply-db; inofensivo para fileset) false
--no-backup Não faz backup local do banco antes do restore false
--dry-run Simular sem restaurar false
--apply-db Aplica direto no banco (targets de database) false
--from-storage <TASK_ID> Baixa do storage desta task antes de restaurar (desde 0.35.0, ver abaixo) -
--storage <ID> Com --from-storage: storage da task (padrão: o primeiro) -
--database <DB> Com --from-storage: banco, para task que grava por banco -

Exemplos

Restaurar MySQL

backupally restore \
  --target mysql-prod \
  --snapshot snap_20260211_030000 \
  --path /restore/mysql

Restaurar a partir do Storage (sem download manual)

backupally restore \
  --target mysql-prod \
  --snapshot mysql-prod/mysql-prod_20260919_030000.ally \
  --from-storage mysql-prod \
  --path /restore/mysql-novo \
  --force -o json

Ver Restaurar a partir do Storage abaixo para o fluxo completo.

Simulação (Dry Run)

backupally restore \
  --target mysql-prod \
  --snapshot snap_20260211_030000 \
  --path /restore/mysql \
  --dry-run

Listar Snapshots Disponíveis

Para ver os snapshots disponíveis para uma task:

backupally history --target mysql-prod

Saída:

SNAPSHOT                  DATE                 SIZE      STATUS
snap_20260211_030000      2026-02-11 03:00:00  890 MB    OK
snap_20260210_030000      2026-02-10 03:00:00  885 MB    OK
snap_20260209_030000      2026-02-09 03:00:00  882 MB    OK

Restaurar a partir do Storage (desde 0.35.0)

Fluxo: snapshot → (opcional) download → restore num diretório novo. Até a 0.34.x era preciso baixar com `storage download` e depois apontar --path para o arquivo local. --from-storage faz os dois passos num comando só (feature restore.from_storage em `--capabilities`):

backupally restore \
  --target "mysql-prod" --snapshot <key> \
  --from-storage mysql-prod --path /restore/mysql-novo --force -o json
Flag Regra
--target/-t obrigatória pelo clap; para fileset é só rótulo
--snapshot/-s com --from-storage, é o artifacts[].remote_path do `history` (a key antiga também serve quando resolve sozinha)
--from-storage <TASK_ID> task dona do storage. Baixa para <default_temp_path>/restore-<uuid>/, restaura e apaga o temporário, em sucesso ou erro
--storage <ID> opcional, padrão = primeiro [[storage]] da task
--database <DB> só para task por banco; com remote_path não é necessário — com a key antiga, sem ele sai erro pedindo --database
--path <DIR> destino. Sem ele, ./restore relativo ao cwd

O download confere o SHA-256 contra artifacts[].sha256 do history antes de extrair — divergente = erro E4004 e nada é restaurado.

Prática recomendada: restaure num diretório separado

restore --from-storage não recusa diretório existente nem vazio — ele extrai por cima, sobrescrevendo o que já está lá. O comando não protege contra restaurar em cima do original; a proteção é responsabilidade de quem chama:

  • use sempre um --path novo, nunca o diretório de onde os dados vieram (ex.: /var/lib/backupally/restore/<task_id>/<timestamp>/, um por restore);
  • nunca aponte --path para o diretório de produção nem para um prefixo dele — se o restore falhar no meio, o diretório original fica misturado com o que já foi extraído;
  • confira o conteúdo restaurado no diretório separado antes de mover para o lugar final, manualmente.

Os arquivos saem sob --path com o caminho absoluto original do backup (ex.: /restore/mysql-novo/root/dados/a.txt para um backup de /root/dados).

`restore.execute` (`-o json`)

Campo Tipo Nota
target string o --target passado
snapshot string a key passada
output_path string --path
success bool
downloaded_from objeto? {storage_id, driver, key, size_bytes, database, remote_path, sha256} — presente quando veio do storage, inclusive em erro de extração
message string? em falha

O temporário restore-<uuid> é apagado em sucesso e em qualquer erro com envelope. Em panic (binário de release roda com panic = 'abort') ele pode sobrar, e cleanup --residues não o reconhece.

Códigos de erro de `--from-storage`

Reaproveita o enum de erro existente — nenhum código novo:

Caso Código Exit
Task (--from-storage <id>) não encontrada E1003 3
Argumento inválido: key com ..// inicial, --storage inexistente, falta --database, secret não resolve E1002 3
Key não encontrada no storage E4003 12
SHA-256 do arquivo baixado diverge do registrado no history E4004 12
Falha real de transferência (rede, HTTP ≠ 404, tamanho divergente, conexão parada 120s) E2005 11
Extração falhou (arquivo corrompido, chave errada) E4002 12

Ver limitações de segurança para a contenção de path no storage local e a validação de --database.

Processo de Restauração

1. Download

Baixa o arquivo do storage configurado.

2. Verificação

Valida checksum e integridade do arquivo.

3. Descriptografia

Descriptografa usando a chave RSA/AES.

4. Descompressão

Descomprime com o algoritmo registrado no header (zstd ou gzip).

5. Extração

Extrai arquivos para o diretório de destino.

Todas as etapas rodam em streaming (0.29.0): o arquivo não é carregado inteiro, não há backup.tar temporário e o tar do sistema não é usado.

Erro Significado O que fazer
truncado no bloco N O arquivo acabou antes do bloco final — upload incompleto ou download parcial Baixe de novo; no B2, cleanup --residues lista uploads inacabados
bloco N adulterado ou chave errada Tag do bloco não confere Confira a chave (keys fingerprint) e a integridade do arquivo (storage check)
Unsupported envelope version: 2 Binário anterior à 0.29.0 lendo backup novo Atualize o binário (self-update)

Restauração de Databases

MySQL

Após restaurar, importe o dump:

backupally restore --target mysql-prod --snapshot snap_20260211_030000 --path /restore/

mysql -u root -p < /restore/mysql-prod/dump.sql

PostgreSQL

backupally restore --target postgres-prod --snapshot snap_20260211_030000 --path /restore/

psql -U postgres -f /restore/postgres-prod/dump.sql

MongoDB

backupally restore --target mongodb-prod --snapshot snap_20260211_030000 --path /restore/

mongorestore /restore/mongodb-prod/

Códigos de Saída

Código Significado
0 Sucesso
1 Snapshot não encontrado
2 Erro de download
3 Erro de descriptografia (chave inválida)
4 Erro de integridade
5 Erro de extração

Notas

  • Mantenha backup das chaves de criptografia
  • Use --verify periodicamente para validar backups
  • O key fingerprint no arquivo indica qual chave usar
By Borlot.com.br on 11/02/2026