Como o Backup é Armazenado

Cada execução de uma task produz um arquivo completo e autocontido. Não há deduplicação entre runs, não há backup incremental, e não há cadeia de dependência entre arquivos: qualquer .ally restaura sozinho, com nada além dele e da chave.

Versões anteriores desta página descreviam deduplicação FastCDC e backups incrementais. Esses recursos nunca existiram no cliente. O fatiamento em blocos que havia até a 0.27 não deduplicava nada e foi removido na 0.28.0, quando o restore de arquivos passou a devolver a árvore original.

O que um run produz

origem  ──►  tar  ──►  compressão  ──►  cifra (opcional)  ──►  .ally  ──►  storage
Etapa O que acontece
tar Fileset: a árvore real, com caminho relativo à raiz, symlink, diretório vazio, permissão e mtime. Banco: o dump. Tudo em streaming, direto para o disco temporário
compressão zstd nível 3 (padrão) ou nenhuma, sobre o tar inteiro
cifra AES-256-GCM em blocos de 1 MiB (STREAM), chave de dados envelopada em RSA-4096, header como dado autenticado. Só quando key_mode do config global não é none
.ally Header de 48 bytes (magic, versão, flags, fingerprint da chave, compressão) seguido do payload

Ver Segurança e Criptografia para o envelope e o fingerprint.

O que isso significa na prática

  • Restore simples: um arquivo, um comando. Não existe "restaurar a cadeia até o full de domingo"
  • Sem estado local a proteger: perder o servidor de origem não invalida nenhum backup, porque nenhum depende de índice, catálogo ou cache de assinaturas
  • Cada run custa o tamanho inteiro: 10 backups de 2 GB ocupam 20 GB. A economia vem de compressão, exclusão e retenção, não de dedup

Como economizar espaço de verdade

Exclua o que não precisa voltar

[target]
kind = "fileset"
includes = ["/var/www"]
excludes = ["**/node_modules", "**/.git", "**/cache/**", "*.log", "*.tmp"]

Diretório excluído corta a subárvore inteira. Ver Padrões de Exclusão.

Compressão: use o padrão

[packer]
compressor = "zstd"     # padrão; "none" desliga

zstd roda sempre no nível 3 — compression_level é lido e ignorado. lz4 é aceito mas grava gzip. Dados já comprimidos (imagens, vídeo, .zip) não encolhem — exclua-os ou aceite o tamanho.

Deixe a retenção apagar o velho

[[storage]]
driver = "b2"
retention = "daily 7, weekly 4, monthly 6"

Ver Políticas de Retenção.

Meça antes de decidir

backupally measure

Mostra, por task, quanto a origem ocupa, quanto virou backup e a taxa de compressão. Ver backupally measure.

Chaves de configuração que existem mas não fazem nada

Por compatibilidade, o parser aceita estas chaves; nenhuma tem efeito:

Onde Chave Situação
[global] chunk_algo, avg_chunk_mb Obrigatórias no config global (o parser exige), ignoradas
[collector] da task chunk_algo, chunk_avg_mb, incremental Lidas e ignoradas

Deixe-as como estão nos exemplos; não configure nada esperando resultado.

Roadmap

Deduplicação e incremental continuam no roadmap como candidatos, sem data. Quando existirem, virão com formato novo e esta página será reescrita — até lá, o que está descrito acima é o que roda.

By Borlot.com.br on 04/09/2026