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/mysqlRestaurar 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 jsonVer 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-runListar Snapshots Disponíveis
Para ver os snapshots disponíveis para uma task:
backupally history --target mysql-prodSaí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 OKRestaurar 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
--pathnovo, nunca o diretório de onde os dados vieram (ex.:/var/lib/backupally/restore/<task_id>/<timestamp>/, um por restore); - nunca aponte
--pathpara 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.sqlPostgreSQL
backupally restore --target postgres-prod --snapshot snap_20260211_030000 --path /restore/
psql -U postgres -f /restore/postgres-prod/dump.sqlMongoDB
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
--verifyperiodicamente para validar backups - O key fingerprint no arquivo indica qual chave usar