Бекап на удаленный ftp
Скрипт для бекапа сайта на удаленный сервер по FTP.
Скрипт бекапит всю рабочую директорию пофайлово (для того, чтобы сайт сразу после бекапа был доступен ан резервной площадке - бесплатного хостера), а также делает общий шифрованный архив, разбивает его на небольшие куски и кладет в директорию с текущей датой.
Скрипт проверяет, что глубина архива (число директорий с полным шифрованным архивом) не превышает заданного лимита и удаляет старое.
#!/bin/bash
dir_to_backup=/pve-data/kubernetes_volumes/wiki-data
backup_name_prefix=wiki
ftpserver=ftp.server.com
username=ftp_login
password=ftp_pass
currentdate=$(date +%d-%m-%Y_%H_%M)
remote_www_dir=/htdocs
backup_depth_days=10
encryption_password=enc_pass
tmp_dir=/pve-data/tmp
tmp_arc_dir=$tmp_dir/$backup_name_prefix_$currentdate
#Get list of directories with full encrypted backups
dirs=`echo "lftp -e 'set ssl:verify-certificate no ssl:check-hostname false net:connection-limit 4; cls --sort=date $remote_www_dir/$backup_name_prefix; bye;' ftp://$username:$password@$ftpserver" | /bin/bash`
dirs=(${dirs// / })
#check number of directories and delete oldest
if [[ ${#dirs[@]} -gt $backup_depth_days ]]; then
for ((i = $backup_depth_days; i < ${#dirs[@]}; i++))
{
echo "lftp -e 'set ssl:verify-certificate no ssl:check-hostname false net:connection-limit 4; rm -r -f ${dirs[$i]}; bye;' ftp://$username:$password@$ftpserver" | /bin/bash
}
fi
#Create tmp folder
mkdir --parents $tmp_arc_dir
#Disable URL rewrites
sed -i '/userewrite/s/1/0/' $dir_to_backup/conf/local.php
#Make ENCRYPTED archive
tar -cpf - --use-compress-program=pigz $dir_to_backup | openssl enc -aes-192-cbc -pass pass:$encryption_password -out $tmp_arc_dir/$backup_name_prefix-$currentdate.tar.gz
#Enable URL rewrites
sed -i '/userewrite/s/0/1/' $dir_to_backup/conf/local.php
#Split archive to small parts
cd $tmp_arc_dir
split -d -a 3 -b 8000000 ./$backup_name_prefix-$currentdate.tar.gz
#Calculate md5 checksum
md5sum $tmp_arc_dir/$backup_name_prefix-$currentdate.tar.gz > $tmp_arc_dir/$backup_name_prefix-$currentdate.tar.gz.md5
rm -f $tmp_arc_dir/$backup_name_prefix-$currentdate.tar.gz
#Put archive parts to remote ftp and remove tmp dir
echo "lftp -e 'set ssl:verify-certificate no ssl:check-hostname false net:connection-limit 4; mkdir $remote_www_dir/$backup_name_prefix; mkdir $remote_www_dir/$backup_name_prefix/$currentdate; mirror -c -R $tmp_arc_dir $remote_www_dir/$backup_name_prefix/$currentdate; bye;' ftp://$username:$password@$ftpserver" | /bin/bash
rm -Rf $tmp_arc_dir
#Mirror current site to remote server
echo "lftp -e 'set ssl:verify-certificate no ssl:check-hostname false net:connection-limit 4; mirror --use-pget-n=10 -c -R -e --exclude=data/tmp/captcha/ --exclude=data/cache/ $dir_to_backup $remote_www_dir; bye;' ftp://$username:$password@$ftpserver" | /bin/bash
#Disable URL rewrites
sed -i '/userewrite/s/1/0/' $dir_to_backup/conf/local.php
#replace remote conf.php with disabled rewrites
echo "lftp -e 'set ssl:verify-certificate no ssl:check-hostname false net:connection-limit 4; put -O $remote_www_dir/conf $dir_to_backup/conf/local.php; bye;' ftp://$username:$password@$ftpserver" | /bin/bash
#Enable URL rewrites
sed -i '/userewrite/s/0/1/' $dir_to_backup/conf/local.php
Восстановление из текущей живой копии у внешнего хостера
#!/bin/bash backup_name_prefix=wiki ftpserver=ftp.unaux.com username=unaux_user password=superpassword remote_www_dir=/htdocs encryption_password=superencryptionpassword echo "lftp -e 'set ssl:verify-certificate no ssl:check-hostname false net:connection-limit 4; mirror -c $remote_www_dir $dir_to_backup; bye;' ftp://$username:$password@$ftpserver" | /bin/bash
Восстановлние из полного шифрованного архива
#!/bin/bash backup_name_prefix=wiki ftpserver=ftp.unaux.com username=unaux_user password=superpassword remote_www_dir=/htdocs encryption_password=superencryptionpassword restore_dir=~/restore dirs=`echo "lftp -e 'set ssl:verify-certificate no ssl:check-hostname false net:connection-limit 4; cls --sort=date $remote_www_dir/$backup_name_prefix; bye;' ftp://$username:$password@$ftpserver" | /bin/bash` dirs=(${dirs// / }) latest_backup_dir=${dirs[0]} mkdir -p $restore_dir echo "lftp -e 'set ssl:verify-certificate no ssl:check-hostname false net:connection-limit 4; mirror -c $latest_backup_dir $restore_dir; bye;' ftp://$username:$password@$ftpserver" | /bin/bash archive_filename=`ls $restore_dir/*md5 | sed 's/.md5//'` cat $restore_dir/x* > $archive_filename openssl enc -in $archive_filename -d -aes-192-cbc -pass pass:$encryption_password | sudo tar -xzvf - -C $restore_dir
Discussion