Tenho certeza de que isso foi respondido em partes e fragmentos em muitos sites, mas de alguma forma eu não consigo fazer isso (como um todo) funcionar de forma confiável.
cenário: Eu tenho um servidor que gostaria de fazer backups incrementais em (estou pensando diariamente).
Os arquivos e diretórios que eu quero fazer backup estão localizados nos diretórios: /home/
e /srv/samba/
.
O backup deve ser .tar.gz para o diretório /mnt/backup/
, e o nome do arquivo deve ser algo como inc_backup_yyyymmdd.tar.gz
.
Após o .tar.gz ser criado com sucesso, o arquivo deve ser enviado para um servidor externo usando ssh.
Neste momento, o servidor cria um backup COMPLETO uma vez por semana e eu o envio manualmente para fora do site em intervalos aleatórios (o tamanho de .tar.gz é de cerca de 60 GB, então demora um pouco ...).
Idealmente eu gostaria de .tar.gz APENAS arquivos e pastas regulares. Arquivos começando com. e ~ devem ser excluídos, assim como os diretórios que começam com.
Existe uma exceção :
Nas pastas /home/[user]/
e /srv/samba/[someshare]/
eu tenho pastas ".recycle", que devem ser incluídas no backup, mas as exclusões de arquivo devem ser aplicadas.
Por exemplo,
/home/user/.hiddendirectory/ (excluded)
/home/user/.hiddendirectory/myfile.txt (excluded)
/home/user/myfile.txt (included)
/home/user/.myfile.txt (excluded)
/home/user/~myfile.txt (excluded)
/home/user/mydirectory/myfile.txt (included)
/home/user/.recycle/ (included)
/home/user/.recycle/~tmpfile (excluded)
/home/user/.recycle/.myfile (excluded)
/home/user/.recycle/myfile.txt (included)
Eu começo usando o find:
Please note that the following commands include non-standard operators (-not, -or), so if used, please ensure your system supports them
find /home -not -path '*/\.*' ! \( -name '.*' -or -name '~*' \) -mtime -1
Isto parece encontrar os arquivos e pastas que eu preciso. Mas imediatamente que eu canalizo isso para o tar, parece ignorar todas as exclusões?
find /home -not -path '*/\.*' ! \( -name '.*' -or -name '~*' \) -mtime -1 -print0 | tar -zcvf /tmp/testbackup1.tar.gz --null -T -
Parece que obtenho o resultado correto usando o seguinte:
find /home -not -path '*/\.*' ! \( -name '.*' -or -name '~*' \) -mtime -1 -print0 | tar -Avf /tmp/testbackup1.tar | gzip -c /tmp/testbackup1.tar > testbackup1.tar.gz
... mas isso parece muito complicado e resulta em um tarball vazio, embora o alcatrão tenha tamanho significativo? E nada disso leva em consideração a inclusão do .recycle.
Um bônus seria um tar.gz criptografado para maior segurança.
Enviar o arquivo usando o SSH é a parte fácil.
Meus pensamentos são colocar isso em um arquivo de script, que é executado por Cron.
O script seria:
O backup completo (no local) seria executado uma vez por mês e também lidaria com a limpeza de arquivos de backup antigos (2 meses).
Então, no final, eu teria dois backups completos e aproximadamente 60 backups incrementais. Depois que um backup completo for eliminado, os backups incrementais (referentes a isso) também serão excluídos. E todos os arquivos de backup estarão localizados no site e fora do site.
Qualquer conselho (até mesmo abordagens totalmente novas) é muito apreciado!
Obrigado antecipadamente!