6.3.7 Автоматичне резервне копіювання

Automatic backup banner

Існує необхідність створювати резервну копію директорії згідно з графіком та зберігати її на зовнішньому сховищі?

Це можна просто виконати використовуючи KeepData у якості віддаленого хмарного сховища. Більш того, такий процес можна повністю автоматизувати.

Рішення відрізняється залежно від ОС, але загальний алгоритм полягає у запуску виконуваного файлу за розкладом. Давайте розберемо на прикладах.

Створення бекапів в Windows

У ОС Windows подібне реалізується за допомогою файлу у форматі .bat і планувальника завдань Windows.

Розглянемо покрокову інструкцію:

1. Для коректного виконання майбутнього .bat-файлу, нам знадобиться завантажити та встановити програму WinSCP. Зробити це можна на їх офіційному сайті. Виконувати будь-які дії у самій програмі при цьому не знадобиться.

2. Створіть новий текстовий файл у будь-якій зручній локації. Це буде наш новий скрипт для резервного копіювання.

3. Найважливіший крок - наповнення скрипта. Нижче наведено приклад з поясненнями. Виділені змінні необхідно заповнити Вашою інформацією:

backup.bat

@echo off

"C:\Program Files (x86)\WinSCP\WinSCP.exe" ^
  /ini=nul ^
  /command ^
    "open ftp://login:password@server.keepdata.thehost.ua/" ^
    "lcd C:\Folder\Work" ^
    "cd /backups-work/" ^
    "mkdir %%TIMESTAMP#yyyy-mm-dd%%" ^
    "cd /backups-work/%%TIMESTAMP#yyyy-mm-dd%%" ^
    "put File1" ^
    "lcd C:\" ^
    "put Folder2" ^
    "lcd C:\Users\User" ^
    "put File3" ^
    "exit"

set WINSCP_RESULT=%ERRORLEVEL%
if %WINSCP_RESULT% equ 0 (
  echo Success
) else (
  echo Error
)

exit /b %WINSCP_RESULT%

Тепер, до пояснень:

  • C:\Program Files (x86)\WinSCP\WinSCP.exe" ^ – вкажіть шлях до `.exe’ файлу WinSCP. У прикладі вказано шлях при стандартній установці.
  • "open ftp://login:password@server.keepdata.thehost.ua/" ^ – цей рядок виконує підключення до Вашого Хмарного сховища. Тут необхідно вказати логін, пароль та сервер підключення. Всі ці дані Ви можете дізнатися в Листі про відкриття послуги.
  • "lcd C:\Folder\Work" ^ – ця команда переходить виділеним шляхом на локальному ПК.
  • cd /backups-work/" ^ – ця команда переходить по виділеному шляху на Вашому Хмарному сховищі.
  • "mkdir %% TIMESTAMP # yyyy-mm-dd%%" ^ – створює директорію в KeepData з назвою у форматі рік-місяць-день.
  • cd /backups-work/%%TIMESTAMP#yyyy-mm-dd%%" ^ – переходить до вказаної директорії.
  • "put File1" ^ – завантажує в цю директорію файл File1 з поточного розташування на локальному ПК (D:\Folder\Work у цьому прикладі).
  • "lcd C:\" ^ – переходить новим шляхом на локальному ПК.
  • put Folder2" ^ – завантажує директорію Folder2 та весь її зміст з нового шляху на Хмарне сховище.
  • "lcd C:\Users\User" ^ – переходить новим шляхом на локальному ПК.
  • put File3" ^ – завантажує файл File3 з нового шляху на Хмарне сховище.

Важливо: у Windows для поділу директорій використовується символ \, у Linux ж - /. Хмарне сховище збудовано саме на архітектурі Linux. Врахуйте це при редагуванні скрипту користувача

Таким чином, ми отримали скрипт, який підключається до KeepData, створює в зазначеній директорії нову папку і завантажує три файли з різних місць на локальному ПК. Створена папка матиме ім’я аналогічне часу її створення, що полегшить подальшу роботу з наявними резервними копіями. За потреби, вказаний скрипт можна відредагувати під Ваші потреби.

4. Зберігаємо наш текстовий файл у форматі .bat. Для цього потрібно у файловому редакторі замість Зберегти натиснути Зберегти як. При збереженні вибираємо Всі файли і вказуємо повне ім’я файлу, разом із форматом .bat наприкінці:

Текстовий редактор, зберегти як

Тепер ми маємо написаний скрипт, який виконує резервне копіювання. Як цей процес автоматизувати? У цьому нам допоможе Планувальник задач Windows.

5. Відкриваємо Планувальник завдань за допомогою меню Пуск або альтернативним способом - натиснувши Win + R та виконавши taskschd.msc:

Планувальник завдань, запуск

6. Правим кліком миші по Бібліотека планувальника завдань відкриваємо контектне меню та натискаємо Створити завдання:

Планувальник задач, Створити завдання

7. Переходимо в підменю Тригери і натискаємо Створити. У відкритій формі вказуємо за яким розкладом необхідно виконувати завдання. Наприклад, щодня о 12:00:

Планувальник завдань, Тригери

8. Аналогічно переходимо в підменю Дії і знову натискаємо Створити. У відкритій формі вибираємо Запуск програми та вказуємо шлях до нашого скрипту, вручну або за допомогою кнопки Огляд:

Планувальник завдань, Дії

Порада: у підменю Умови та Параметри можна додатково налаштувати Ваше завдання, наприклад, дозволити їй запускатися тільки при підключенні до певної мережі.

9. Завдання створено. Воно буде виконуватись згідно з вказаним розкладом. Вкрай бажано відразу ж протестувати його виконання за допомогою ручного запуску - клікнувши на завдання правою кнопкою миші і натиснувши Виконати. У разі, якщо тестове виконання закінчилося безуспішно - зверніться до нашої Служби підтримки надавши максимум інформації, включаючи текст Вашого скрипту.

Створення бекапів в Linux

У Linux процес аналогічний, з поправкою на інструментарій та залежності ОС. Також скриптів для виконання бекапу буде два – для безпосередньо файлів і для баз даних.

Залежністю до роботи виконуваного файлу створення бекапу в Linux є консольний FTP-клієнт LFTP.

Давайте розглянемо інструкцію з налаштування за допомогою покрокового прикладу:

1. Встановіть LFTP.

  • Встановити в Ubuntu/Debian можна так:
sudo apt update
sudo apt install lftp
  • У CentOS/AlmaLinux/RockyLinux:
sudo yum install lftp

2. У Linux нам знадобиться два скрипти - для резервування певних директорій та для резервування певних баз даних. У нашому прикладі вони називаються backup-dir.sh та backup-mysql.sh, їх створені присвячені кроки 3 та 4 цієї інструкції. Якщо Вам необхідний лише один - створюйте лише один. Створення майбутніх виконуваних файлів у форматі .sh у потрібній директорії виконується так:

touch backup-dir.sh
touch backup-mysql.sh

3. Почнемо зі скрипта який резервує файли потрібної директорії, у цьому прикладі він зветься backup-dir.sh. Відкриємо його будь-яким текстовим редаткором, наприклад, за допомогою nano backup-dir.sh. Нижче наведено приклад скрипта з поясненнями. Виділені змінні необхідно заповнити Вашою інформацією:

backup-dir.sh
#!/bin/bash
echo "Directory Backuper by TheHost"

#Визначення змінних та параметрів доступу до FTP-сервера
TMP_PATH="/tmp"
BACKUP_DIRS="/home/user/data /home/user/data2 /home/user/data3"
FTP_HOST="ftp://server.keepdata.thehost.ua"
FTP_USER="ftp_user"
FTP_PASS="ftp_password"

#Створення нової резервної копії локально, у тимчасовій директорії
DATE=`date +%Y-%m-%d`
DATE_TIME=`date +%Y-%m-%d-%H-%M-%S`
mkdir -p "$TMP_PATH/DIR_BACKUP-$DATE"
cd $TMP_PATH/DIR_BACKUP-$DATE
GZIPFILE="backup-$DATE_TIME.tgz"
echo -n "Creating archive $GZIPFILE... "
tar -czf $GZIPFILE $BACKUP_DIRS && echo "OK" || echo -e "Failed!\a"

#Завантаження створеного архіву на FTP-сховище
echo -n "Checking $FTP_HOST for today's archive... "
if [[ -z "`lftp -u $FTP_USER,$FTP_PASS -e "cd $DATE && renlist backup-$DATE-*.tgz; bye" $FTP_HOST 2>/dev/null`" ]]; then
  echo "not found"
  echo "Uploading archive to $FTP_HOST"
  lftp -u $FTP_USER,$FTP_PASS -e "cd $DATE || mkdir $DATE; cd /$DATE && put $GZIPFILE; bye" $FTP_HOST >/dev/null 2>&1;
else
  echo "already exist!";
fi

#Видалення тимчасової директорії
cd $TMP_PATH
rm -rf $TMP_PATH/DIR_BACKUP-$DATE

echo "Done."
exit 0

Незважаючи на громіздкий вид скрипту, модифікувати в ньому потрібно зовсім небагато. А саме:

  • TMP_PATH="/tmp" – встановлює тимчасову директорію для зберігання створеної резервної копії перед її завантаженням на віддалений сервер. Можна залишити стандартне значення /tmp.
  • BACKUP_DIRS="/home/user/data /home/user/data2 /home/user/data3" – які саме директорії будуть резервуватися до архіву. Можна вказати одну.
  • FTP_HOST="ftp://server.keepdata.thehost.ua" – адреса Вашого Хмарного сховища.
  • FTP_USER="ftp_user" – FTP-користувач Вашого Хмарного сховища.
  • FTP_PASS="ftp_password" – пароль FTP-користувача Вашого Хмарного сховища.

Такий скрипт буде при запуску створювати архів у форматі .tgz директорій зазначених у BACKUP_DIRS=, зберігати їх у TMP_PATH= локально і потім намагатися завантажити архів на віддалене FTP-сховище, в ньому створену директорію з назвою у вигляді поточної дати. У разі успішного виконання він видалить локальну копію архіву. Після редагування скрипта збережіть файл, обов’язково у форматі .sh.

4. Тепер редагуємо скрипт для баз даних, у нас у прикладі це backup-mysql.sh. Відкриємо його будь-яким текстовим редаткором, наприклад, за допомогою nano backup-mysql.sh. Нижче наведено приклад скрипта з поясненнями. Виділені змінні необхідно заповнити Вашою інформацією:

backup-mysql.sh
#!/bin/bash
echo "Database Backuper by TheHost"

#Визначення змінних та параметрів доступу
DATABASES='database1 database2 database3'
TMP_PATH="/tmp"
BACKUP_USER="mysql_user"
BACKUP_PASS="mysql_password"
FTP_HOST="ftp://server.keepdata.thehost.ua"
FTP_USER="ftp_user"
FTP_PASS="ftp_password"

#Створення нового бекапу
DATE=`date +%Y-%m-%d`
DATE_TIME=`date +%Y-%m-%d-%H-%M-%S`
mkdir -p "$TMP_PATH/DB_BACKUP-$DATE"
cd $TMP_PATH/DB_BACKUP-$DATE
for DB in $DATABASES; do
  echo -n "Dumping $DB... "
  mysqldump -E -R -u"$BACKUP_USER" -p"$BACKUP_PASS" $DB > noc-$DATE_TIME.$DB.sql && echo "OK" || echo -e "Failed!\a"
done
GZIPDB="backup-$DATE_TIME.tgz"
echo -n "Creating archive $GZIPDB... "
tar -czf $GZIPDB --remove-files backup-$DATE_TIME.*.sql && echo "OK" || echo -e "Failed!\a"

#Завантаження бекапу на віддалений сервер
echo -n "Checking $FTP_HOST for today's archive... "
if [[ -z "`lftp -u $FTP_USER,$FTP_PASS -e "cd $DATE && renlist backup-$DATE-*.tgz; bye" $FTP_HOST 2>/dev/null`" ]]; then
  echo "not found"
  echo "Uploading archive to $FTP_HOST"
  lftp -u $FTP_USER,$FTP_PASS -e "cd $DATE || mkdir $DATE; cd /$DATE && put $GZIPDB; bye" $FTP_HOST >/dev/null 2>&1;
else
  echo "already exist!";
fi

#Видалення тимчасової директорії
cd $TMP_PATH
rm -rf $TMP_PATH/DB_BACKUP-$DATE

echo "Done."
exit 0

Пояснення:

  • DATABASES='database1 database2 database3 – список баз даних, які зачіпатимуть завдання. Вказувати через пробіл.
  • TMP_PATH="/tmp" – встановлює тимчасову директорію для зберігання створеної резервної копії перед її завантаженням на віддалений сервер. Можна залишити стандартне значення /tmp.
  • BACKUP_USER="mysql_user" – користувач для входу в MySQL.
  • BACKUP_PASS="mysql_password" – пароль вказаного користувача.
  • FTP_HOST="ftp://server.keepdata.thehost.ua" – адреса Вашого Хмарного сховища.
  • FTP_USER="ftp_user" – FTP-користувач Вашого Хмарного сховища.
  • FTP_PASS="ftp_password" – пароль FTP-користувача Вашого Хмарного сховища.

Такий скрипт буде при запуску створювати дампи баз даних DATABASES= і стискати їх в архів у форматі .tgz, зберігати його в TMP_PATH= локально і потім намагатися завантажити його на віддалене FTP-сховище, в ньому створену директорію з назвою у вигляді поточної дати. У разі успішного виконання він видалить локальну копію архіву. Після редагування скрипта збережіть файл, обов’язково у форматі .sh.

5. Надайте скриптам права на виконання:

chmod +x /path/to/backup-dir.sh
chmod +x /path/to/backup-mysql.sh

Де /path/to/ замініть шляхами до створених скриптів.

6. Скрипти створені, залишилося автоматизувати їх виконання. Для цього ми використовуємо CRON-завдання.

Відкрийте файл crontab за допомогою команди:

crontab -e

Додайте нові завдання для виконання Ваших скриптів. Наприклад:

30 3 * * * /path/to/backup-dir.sh
30 3 * * * /path/to/backup-mysql.sh

Замініть /path/to/ шляхами до створених скриптів, після чого збережіть файл. Надані приклади виконуватимуться щодня о 3:30 ночі.

Порада: ознайомитися з можливостями CRON для налаштування завдань можна у відповідній інструкції.

7. Готово! Скрипти створені та відредаговані з Вашими даними, CRON-завдання на їх виконання вже чекає на потрібну дату. Радимо також виконати мануальний скрипт для тестування. Це можна зробити наступною командою:

./path/to/backup-dir.sh

Де /path/to/ замініть шляхом до скрипту. Якщо тест виявився успішним, значить, Вами все було налаштовано правильно. Якщо ж бажаного результату не було досягнуто – зверніться до нашої Служби підтримки надавши максимум інформації, включаючи вміст Ваших скриптів.