Простые скрипты для резервного копирования сайта на виртуальном хостинге или VPS

Это скрипт для бэкапа будет работать на любой VPS/VDS или выделенном сервер под управлением Linux, FreeBSD. Но почему я делаю ударение на слове виртуальный хостинг? А потому что в виртуальном хостинге не установлены многие утилиты и вы можете рассчитывать только на утилиты и скрипты из базовой поставки дистрибутива. Вам вряд ли позволят доустановить нужные утилиты, а если и позволят - я бы на вашем месте не стал этого делать, потому что ответственность за любой косяк ляжет на ваши плечи, а не на техподдержку хостера.

Например, посмотрите на код для пересылки файла по FTP, сразу напрашивается использовать утилиту wput, но wput не установлена на виртуальном тарифе хостера.

Вывод большую часть скриптов для бекапа, которые есть в интернете, вы не сможете использовать. Ниже я представляю, свой вариант скрипта именно для бекапа виртуальных хостингов с использованием протокола FTP, без установки дополнительных программ или модулей.

Dmytro Yakovenko 2022/04/03 Обновление:

  1. Добавлен скрипт для VPS с ротацией бэкапов файлов
  2. Добавлен скрипт для VPS с ротацией директорий бэкапов

Скрипт использует только утилиты, которые входят в стандартную поставку дистрибутива и/или установленного хостером программного обеспечения: встроенный FTP клиент, bash, mysqldump.

В ходе тестирования скрипта оказалось, что ftp клиент (обычно располагающийся по пути /usr/bin/ftp) не установлен у менгих хостинг провайдеров, по этому скрипт будет работать не везде.

Работоспособность скрипта проверен для виртуальных тарифов хостинг-провайдеров:

Ниже список хостинг провайдеров у которых скрипт НЕ будет работать, так как нет ftp клиента, которого можно запустить из консоли виртуального хостинга. Варианты решения: 1) внешний скрипт должен забирать файлы бэкапов 2) копировать файлы используя другую утилиту, например scp, sftp для протокола SSH:

  1. Hostinger — дешёвый премиум хостинг с конструктором сайтов и профессиональной онлайн поддержкой.
  2. Компания «Хостинг «Украина»» отличается полностью автоматизированным сервисом по предоставлению хостинга и регистрации доменных имен. И при этом у них реально работает техподдержка.
template_script_backup_site
#!/bin/bash
 
# Author: Хостинг Консультант https://dieg.info
# Description: Бэкап сайта на виртуальном хостинге, с сохранением
# на удаленном FTP хранилище
 
 
# Название проекта, используется для формирования имен и
# создания папки на FTP хранилище
SITENAME="sitename"
# Путь к директории виртуального хоста
SITEDIR="/var/www/yoursite"
# Папка для локального бэкапа
DIRBACKUP="/home/backup"
#NOW=$(date +"%Y-%m-%d") # Формат даты для имен
NOW=$(date +"%Y-%m-%d-%H-%M-%S")
 
### FTP server Setup ###
FTPS="example.com" # Сервер FTP
FTPU="user" # Имя пользователя FTP
FTPP="password" # Пароль FTP
FTPD=$SITENAME # Папка на FTP
 
### MySQL Setup ###
MYSQLU="user" # Пользователь MySQL
MYSQLP="password" # Пароль пользователя MySQL
DBNAME="dbname" # Название базы MySQL
 
# Создаем бэкап базы данных MySQL. 2>/dev/null
/usr/bin/mysqldump -u $MYSQLU -p$MYSQLP $DBNAME > $SITEDIR/$SITENAME-$DBNAME-$NOW.sql
# Создаем бэкап сайта локально.
/bin/tar -czf $DIRBACKUP/$SITENAME-$NOW.tar.gz $SITEDIR 
# Удаляем бэкап MySQL
/bin/rm -f $SITEDIR/$SITENAME-$DBNAME-$NOW.sql
 
# Подключаемся и копируем файл на ftp сервер
/usr/bin/ftp -n -i -p $FTPS <<INPUT_END
user $FTPU $FTPP
mkdir $FTPD
cd $FTPD
lcd $DIRBACKUP
mput $SITENAME-$NOW.tar.gz
quit
INPUT_END
 
# Удаляем локальный бэкап
/bin/rm -f $DIRBACKUP/$SITENAME-$NOW.tar.gz
  1. Скачиваем скрипт выше и загружаем в удобную вам директорию (обычно в корень с сайтами). Для примера назовем файл backup.sh и загрузим в директорию /var/www
  2. Делаем файл исполняемым:
    chmod +x backup.sh
  3. Создаем директорию для временных файлов и задаем к ней путь в переменной DIRBACKUP.
  4. Задаем переменную SITENAME и заполняем переменные для доступа к MySQL и FTP серверу.
  5. Тестируем полученные скрипт из консоли:
    ./backup.sh
  6. Настраиваем Cron для запуска скрипта
    # crontab -e
    
    0 1 * * * /var/www/backup.sh

    Архив с бэкапом будет отправляться в час ночи, каждый день на указанный ftp.

Внимание CRON!

Каждый хостинг провайдер предоставляет два варианта настройки запуска скриптов по расписанию: классический cron, доступный при подключении SSH, или настройку через панель управления хостингом. Выберите какой-то один способ добавления заданий (либо панель, либо SSH), так как при добавлении нового задания через Crontab в панели управления, те задачи, которые ранее были созданы по SSH, будут удалены!

Скрипт бэкапа будет запускаться один раз в сутки в 2:30 ночи.

Это скрипт РАБОТАТЬ НЕ будет на виртуальных тарифах, выберите другой способ резервного копирования в статье Все что нужно знать о резервировании данных в 2023.

У хостинга Украина достаточно сложная настройка Cron через панель управления. Я в работе предпочитаю писать скрипты при помощи PHP, а не bash. Если вы решите писать тоже скрипты на PHP - внимательно вычитайте их документацию по нюансам запусков PHP скриптов через Cron.

Для bash скриптов ограничение только на длину задачи, не должно превышать 255 символов и рекомендация по использованию полных (абсолютных) путей. Мой скрипт удовлетворяет этим условиям.

Для добавления скрипта в cron откройте раздел «Расписание задач (Cron)» и нажмите «Добавить задачу». И видим поля для настройки:

  1. «Задача» — укажите команду, которую нужно выполнять по расписанию (не забываем, об ограничение в 255 символов). И обращаем внимание, что они по умолчанию предлагаю наш скрипт сохранять непосредственно в каталоге сайте - то есть любой скрипт доступ для запуска любому пользователю в мире. Это не правильно! Создайте скрипт на уровень выше, то есть в директории /www/, в этом случае скрипт будет в безопасности.

Вы можете использовать этот скрипт для создание локальных резервных файлов, но он создавался для хранения в примонтированные директории, при помощи технологии FUSE (ftp, ssh).

#!/bin/bash
 
# Author: Hosting Consultant https://dieg.info
# Description: Бэкап файлов сайта, без БД
# хранение на удаленном хранилище FUSE
 
# Название проекта, используется для формирования имен
SITENAME="conf_task43.examle.com"
# Путь к директории виртуального хоста
SITEDIR="/var/www/examle.com/"
# Папка для локального бэкапа
DIRBACKUP="/home/ftp_share/ftp_backup"
NOW=$(date +"%Y-%m-%d-%H-%M-%S")
# Количество сохраняемы бэкапов (файлов)
BACKUPS=20
 
# Создаем бэкап сайта локально.
/usr/bin/tar -czf $DIRBACKUP/$SITENAME-$NOW.tar.gz $SITEDIR 
 
check=$(ls "$DIRBACKUP" | wc -l)
 
if [ $check -gt $BACKUPS ]
then
	FILEDEL=$(ls -lt "$DIRBACKUP" | awk 'END{print $9}')
#echo $DIRBACKUP/$FILEDEL
/usr/bin/rm $DIRBACKUP/$FILEDEL
#else
#   echo 'Лимит бэкапов не достигнут'
fi

Вы можете использовать этот скрипт для создание резервных файлов БД MySQL, но скрипт создавался для хранения в примонтированные директории, при помощи технологии FUSE (ftp, ssh).

#!/bin/bash
 
# Author: Hosting Consultant https://dieg.info
# Description: Бэкап только БД MySQL
# хранение на удаленном хранилище FUSE
 
# Название проекта, используется для формирования имен
SITENAME="db_task43.example.com"
NOW=$(date +"%Y-%m-%d") # Формат даты для имен
NOWF=$(date +"%Y-%m-%d-%H")
 
# Папка для локального бэкапа
DIRBACKUP="/home/ftp_share/ssh_backup/$NOW"
mkdir $DIRBACKUP
DIRLSBACKUP="/home/ftp_share/ssh_backup"
# Количество сохраняемы бэкапов (файлов)
BACKUPS=2
 
### MySQL Setup ###
MYSQLU="user" # Пользователь MySQL
MYSQLP="password" # Пароль пользователя MySQL
DBNAME="userdb" # Название базы MySQL
 
# Создаем бэкап базы данных MySQL. 2>/dev/null
/usr/bin/mysqldump --no-tablespaces -u$MYSQLU -p$MYSQLP $DBNAME > $DIRBACKUP/$SITENAME-$DBNAME-$NOWF.sql
# Архивируем
cd $DIRBACKUP
/usr/bin/tar -czf $DIRBACKUP/$SITENAME-$DBNAME-$NOWF.tar.gz $DIRBACKUP/$SITENAME-$DBNAME-$NOWF.sql
# Удаляем бэкап MySQL
/usr/bin/rm -f $DIRBACKUP/$SITENAME-$DBNAME-$NOWF.sql
 
check=$(ls "$DIRLSBACKUP" | wc -l)
 
if [ $check -gt $BACKUPS ]
then
	FILEDEL=$(ls -lt "$DIRLSBACKUP" | awk 'END{print $9}')
#echo $DIRLSBACKUP/$FILEDEL
/usr/bin/rm -Rf $DIRLSBACKUP/$FILEDEL
#else
#   echo 'Лимит бэкапов не достигнут'
fi
PQ VPS сервера в 28+ странах.