В этом гайде я покажу вам, как создать резервную копию баз данных и файлов сайта с помощью простого bash скрипта. Я также покажу вам, как вы можете автоматизировать процесс и настроить ротацию архивов.

 Bash скрипт

Просто скопируйте следующий скрипт на свой сервер. В моем случае это будет /opt/backup.sh

#!/bin/bash
PROJNAME=unihost.com
DBNAME=$(mysqlshow | sed 's/[|+-]//g' | grep -v Databases | grep -v information_schema | grep -v performance_schema | grep -v mysql | sed 's/^[ \t]*//;s/[ \t]*$//' | sort | sed '/./,$!d') #DB name
DATADIR=/backup #backup path
SRC=/var/www/unihost #folder to backup
PREFIX=`date +%F`

#start backup
echo "[--------------------------------[`date +%F--%H-%M`]--------------------------------]"
echo "[----------][`date +%F--%H-%M`] Run the backup script..."
mkdir -p $DATADIR/$PREFIX 2> /dev/null
echo "[++--------][`date +%F--%H-%M`] Generate a database backup..."
#MySQL dump
for DB in $DBNAME
do
mysqldump $DB > $DATADIR/$PREFIX/$DB.sql
done
if [[ $? -gt 0 ]];then
echo "[++--------][`date +%F--%H-%M`] Aborted. Generate database backup failed."
exit 1
fi
echo "[++++++----][`date +%F--%H-%M`] Copy the source code project [$PROJNAME]..."
#SRC tar
tar -czPf $DATADIR/$PREFIX/$PROJNAME.tar.gz $SRC
if [[ $? -gt 0 ]];then
echo "[++++++----][`date +%F--%H-%M`] Aborted. Copying the source code failed."
exit 1
fi
echo "[++++++++--][`date +%F--%H-%M`] Copy the source code project [$PROJNAME] successfull."
echo "[+++++++++-][`date +%F--%H-%M`] Stat datadir space (USED): `du -h $DATADIR | tail -n1`"
echo "[+++++++++-][`date +%F--%H-%M`] Free HDD space: `df -h /|tail -n1|awk '{print $4}'`"
echo "[++++++++++][`date +%F--%H-%M`] All operations completed successfully!"
exit 0

Вам нужно сменить:

PROJNAME — это просто название
DATADIR — папка для хранения бекапов
SRC — папка, которую нужно бекапить

Добавьте исполняемые права.

chmod +x /opt/backup.sh

Теперь можно запустить скрипт.

cd /opt
./backup

Все базы данных и файлы сайта успешно сохранены.

Автоматизация

Мне нужно, что бекап скрипт запускался ежедневно в 02:00. Для этого я добавлю в планировщик следующее:

crontab -e

0 2 * * * /opt/backup.sh | tee /var/log/backup.log

На этом все, автоматическое бекапирование настроено.

Ротация

Для того, чтобы автоматически удалять старые бекапы с целью освободить дисковое пространство, я создам еще один простой скрипт, который будет удалять файлы старше 14 дней и пустые папки.

nano /opt/rotate.sh

#!/bin/bash

find /backup -type f -mtime +14 -exec rm -f {} \;
find /backup -type d -empty -delete

Советую добавить этот скрипт в планировщик, перед выполнение бекапа.