Backup usando o comando find e ssh para o servidor externo

2

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:

  • Crie o arquivo de backup (lidando com o procedimento de nomeação)
  • Envie o arquivo de backup por SSH para um servidor externo
  • Excluir arquivos antigos (por exemplo, duas semanas) dos diretórios .recycle

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!

    
por Sisu 14.10.2015 / 21:51

0 respostas