Авторизация

РЕЗЕРВНОЕ КОПИРОВАНИЕ RASPBERRY PI С VPNKI SPACE

Уровень сложности конфигурации – 4 из 5 / Время на прочтение и реализацию – 1-2 часа

Резервное копирование для RaspberryPi описано многократно. Ввиду того, что вместо жесткого диска в Raspberry используется обычная SD карта, которая недолговечна, то осуществлять резервное копирование имеет самый прямой смысл.

В этой инструкции я раскажу как это делает мой RaspberryPi, который стоит на даче и является центром "умной дачи", состоящей из различных программных систем и оборудования.

Ничего уникального мой Raspberry не делает, однако, кое-какие особенности имеются.

Что бэкапим?

У меня есть:

  • web сервер на Joomla
  • база данных MySQL
  • всякие скрипты автоматизации
  • система Node-RED
  • кое-какие единичные картинки с нужных камер видеонаблюдения

 

Таким образом, я имею два типа источников для резервных копий:

- выбранные базы данных MySQL

- директории с нужными файлами

 

Как часто и куда сохранять?

Ввиду того, что Интернет-канал на даче у меня не слишком скоростной, да и трафик дорогой, то я выбрал для себя бэкап в два этапа:

- Ежедневно в 3:30 - на USB носитель включенный в RaspberryPi. Храниться резервные копии будут в течение 7 дней. (все что старше подлежит удалению)

- Еженедельно в 4:00 - в систему VPNKI Space по протоколу FTP. Сохраняться резервные копии на сервере будут в течение 30 дней (то есть 4 копии, а все что старше подлежит удалению).

 

 

Часть 1. Ежедневный бэкап

Собственно скриптов будет два и они весьма просты. Один будет запускаться ежедневно, второй только - по понедельникам. Начнем с первого.

 

1.1. Находясь в корне системы мы создадим папку, куда будем собирать ежедневный бэкап. (в этой инструкции пропущен раздел по монтированию этой папки на USB устройство, возможно добавлю позже)

sudo mkdir /backup

 

 

1.2. В этой директории создадим файл с названием backup_ed.sh (ed - every day, ежедневно)

sudo touch /backup/backup_ed.sh

 

1.3. Откроем файл в редакторе

sudo nano /backup/backup_ed.sh

 

Прежде чем мы поместим что-то в этот файл здесь необходимо дать некоторые комментарии.
Обратите внимание на комментарии к переменным в самом начале файла. Вы можете изменить их под свои нужды.

В моем случае бэкапить нужно три базы данных MySQL и три директории с файлами.

 

Поехали! Вставим следующий текст:

#!/bin/bash
#
# backup all data by cron every day
# Stdout and Stderr redirects to log-file
#
# Example start - ./backup_ed.sh
#

### Переменные ###
log="/var/log/backup.log" # файл лога
old="7" # дней хранения бэкапов

mysql_user="root" # имя пользователя mysql
mysql_pass="o9djflkzx90k" # пароль пользователя mysql

db1="params" # имя базы данных1, которую будем сохранять
db2="joomla" # имя базы данных2, которую будем сохранять
db3="weewx" # имя базы данных3, которую будем сохранять

dir1="/media" # папка с файлами, где лежат картинки видеонаблюдения
dir2="/var/www" # папка со скриптами и веб-сервер
dir3="/home/pi/.node-red" # папка с данными Node-RED

 

echo -e "\n" >> $log 2>&1
echo -e "### Start section BACKUP EVERY DAY ###" >> $log 2>&1
starttime=`date +%s`
echo "Time: $(date)" >> $log 2>&1

### Удаляем старый бэкапы старше 7 дней из папки /backup ###
sudo rm /backup/backup-`hostname`-`date '+%Y-%m-%d'.tar.gz -d "$old day ago"` >> $log 2>&1

### Создаем пустой архив .tar, удаляем неполные файлы бэкапов ###
sudo rm /backup/backup-`hostname`-`date '+%Y-%m-%d'`.tar  >> $log 2>&1
sudo rm /backup/backup-`hostname`-`date '+%Y-%m-%d'`.tar.gz  >> $log 2>&1
sudo tar -cf /backup/backup-`hostname`-`date '+%Y-%m-%d'`.tar -T /dev/null

### Создаем временную директорию для бэкапа MySQL ###
sudo mkdir -p /backup/mysql >> $log 2>&1

### Выполняем дамп баз данны и сохраняем в папку /backup ###
sudo mysqldump -u $mysql_user -p$mysql_pass $db1 --log-error $log > /backup/mysql/$db1-db.sql
sudo mysqldump -u $mysql_user -p$mysql_pass $db2 --log-error $log > /backup/mysql/$db2-db.sql
sudo mysqldump -u $mysql_user -p$mysql_pass $db3 --log-error $log > /backup/mysql/$db3-db.sql

### Добавляем другие директории к архиву tar ###
sudo tar rf /backup/backup-`hostname`-`date '+%Y-%m-%d'`.tar /backup/mysql/
sudo tar rf /backup/backup-`hostname`-`date '+%Y-%m-%d'`.tar $dir1
sudo tar rf /backup/backup-`hostname`-`date '+%Y-%m-%d'`.tar $dir2
sudo tar rf /backup/backup-`hostname`-`date '+%Y-%m-%d'`.tar $dir3

### Сжимаем архив ###
sudo gzip /backup/backup-`hostname`-`date '+%Y-%m-%d'`.tar
echo "Archive size : " >> $log 2>&1
sudo ls -sh backup-`hostname`-`date '+%Y-%m-%d'`.tar.gz >> $log 2>&1

### Удаляем временную папку для MySQL ###
sudo rm -rf /backup/mysql >> $log 2>&1

### Пишем в лог о завершении ###

stoptime=`date +%s`
duration=`expr ${stoptime} - ${starttime}`
echo "Stop time: $(date)" >> $log 2>&1
echo "Duration is `date +%H:%M:%S -ud @${duration}`" >> $log 2>&1

echo -e "### Stop section BACKUP EVERY DAY ###" >> $log 2>&1

 

Сохраняем файл Ctrl+X

 

1.4. Делаем этот файл исполняемым при помощи команды

sudo chmod 755 /backup/backup_ed.sh

 

 

1.5.Осталось добавить автозапуск бэкапа ежедневно в 3:30. Для этого выполните команду

sudo crontab -e

 

 

и вставьте в конец файла следующую строку

30 3 * * * /backup/backup_ed.sh > /dev/null 2>&1 # Run backup everyday at 3:30

 

 

Сохраните Сtrl+X

 

Готово. Теперь в нашей директории /backup будет накапливаться архив ежедневного бэкапа. За 7 ночей будет накоплено 7 файлов. 

В моем случае, каждый ежедневный архив занимает от 60 до 100 МБ.

В файле /var/log/backup.log сохраняется информация о ежедневном бэкапе. Конечно, лог будет расти, поэтому его необходимо делать rotate, но об этом в другой раз.

 

 

 

Часть 2. Еженедельный бэкап

Теперь создадим второй файл, который будет запускаться по понедельникам и сохранять данные на VPNKI Space по протоколу FTP. Для этого:

 

2.1. Запустите Space и активируйте доступ через FTP по этой инструкции

 

2.2. Зайдите любым ftp клиентом и создайте на Space директорию с названием /my_backups - там будут сохраняться ваши файлы резервных копий

 

2.3. Теперь вернемся к RaspberryPi и поставим утилиту для выгрузки файлов wput (аналог wget), которую мы будем использовать для передачи файлов по протоколу FTP с докачкой

sudo apt-get install wput

 


2.4. Создадим в директории /backup новый файл backup_ew.sh (ew - every week, еженедельно)

sudo touch /backup/backup_ew.sh

 

 

2.5. Откроем его в редакторе nano

sudo nano /backup/backup_ew.sh

Добавим следующий текст, но, по традиции, читаем комментарии к переменным в самом начале файла:

#!/bin/bash
#
# Send backup to VPNKI Space via FTP at 4:00 every Monday
# Stdout and Stderr redirects to log-file
#
# Example run - ./backup_ew.sh
#

### Переменные / Variables ###
log="/var/log/backup.log" # Логфайл
vpnki_username="aivanov" # Ваше имя VPNKI
vpnki_password="$1$90Ikjlkiusori0988777wygew" # Ваш API ключ VPNKI
days_to_store="30" # Период в днях хранения резервных копий

echo -e "\n" >> $log 2>&1
echo -e "### Start section BACKUP EVERY WEEK ###" >> $log 2>&1
starttime=`date +%s` >> $log 2>&1
echo "Start time: $(date)" >> $log 2>&1

cd /backup

### Сохраняем архивированный файл в VPNKI Space ###
today_backup="backup-`hostname`-`date '+%Y-%m-%d'`.tar.gz" >> $log 2>&1
if [ -e $today_backup ]
    then
    sudo wput --basename=/backup/ /backup/$today_backup ftp://$vpnki_username:$Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript./my_backups/
    echo "$today_backup sent into VPNKI Space" >> $log 2>&1

    ### Ищем старые бэкапы старше 30 дней и удаляем их ###
    wget -q --no-remove-listing ftp://$vpnki_username:$Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript./my_backups/

    while read line; do
      if echo "$line" | grep -q backup-`hostname`
        then
          IFS=', ' read -r -a array <<< "$line"
          filename="${array[8]}"

          fullname=$(echo $filename | cut -f 1 -d '.')
          extension1=$(echo $filename | cut -f 2 -d '.')
          extension2=$(echo $filename | cut -f 3 -d '.')

          name=$(echo $fullname | cut -f1 -d-)
          hostname=$(echo $fullname | cut -f2 -d-)
          year=$(echo $fullname | cut -f3 -d-)
          month=$(echo $fullname | cut -f4 -d-)
          day=$(echo $fullname | cut -f5 -d-)

          backup_date=`date -d $year$month$day '+%Y-%m-%d'`
          last_store_date=`date '+%Y-%m-%d' -d "$days_to_store day ago"`

          if [[ $backup_date < $last_store_date ]];
            then
              old_backup=$name-$hostname-$year-$month-$day.$extension1.$extension2
              echo "This backup is old and will be deleted - $old_backup" >> $log 2>&1
              sudo wdel -q ftp://$vpnki_username:$Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript./my_backups/$old_backup >> $log 2>&1
          fi

      fi
    done < /backup/.listing

    ### Удаляем локальные временные файлы ###
    sudo rm /backup/index.* >> $log 2>&1
    sudo rm /backup/.listing >> $log 2>&1

    else
        echo "ERROR: $today_backup not found!!!" >> $log 2>&1
fi
stoptime=`date +%s` >> $log 2>&1
duration=`expr ${stoptime} - ${starttime}` >> $log 2>&1

### Пишем в лог о завершении ###

echo "Stop time: $(date)" >> $log 2>&1
echo "Duration is `date +%H:%M:%S -ud @${duration}`" >> $log 2>&1
echo -e "### Stop section BACKUP EVERY WEEK ###" >> $log 2>&1

Сохраните Ctrl+X

 

2.6. Делаем этот файл запускающимся при помощи команды

sudo chmod 755 /backup/backup_ew.sh

 

 

2.7. Осталось добавить автозапуск бэкапа по понедельникам в 4:00. Для этого выполните команду

sudo crontab -e

 

 

и вставьте в конец файла следующую строку

0 4 * * 1 /backup/backup_ew.sh > /dev/null 2>&1 # Run backup every monday at 4:00

Сохраните Ctrl+X

 

Вот собственно и все. Теперь у вас есть бэкапы глубиной в 7 дней на локальном USB устройстве и на удаленном VPNKI Space хранятся еще 4 бэкапа глубиной в месяц.

Остались два вопроса, о которых будет в следующий раз:

  • как восстанавливаться из бэкапа?
  • как сделать ротацию файла лога обоих скриптов /var/log/backup.log ?

 

Если что-то не получилось или что-то неверно описано, то задавайте вопросы на форуме https://vpnki.ru/questions/support-forum/blog-news