
Наша взаимовыгодная связь https://banwar.org/
У минулій статті було розглянуто спрощений варіант бекапа сайту з можливістю завантажити бекап на сервер FTP.
Згодом у мене виникла потреба зробити більш поліпшену версію скрипта для створення бекапа всього сервера (файли декількох сайтів і їх БД), а також завантажувати на FTP все це господарство c допомогою cURL, так як на сервері не було встановлено FTP клієнт і встановити його НЕ було можливості. Також потрібно було видаляти на FTP сервері старі бекапи, щоб не засмічувати місце на диску.
Бекап сайтів і Баз Даних
Почнемо з налаштувань. Зазначимо доступи до БД під якими будемо архівувати Базу Даних:
MUSER = "root" MPASS = "superpassword" MHOST = "localhost"Задамо шлях до каталогу в якому будемо архівувати дані з сайтами і куди будемо зберігати тимчасові архіви, до вивантаження на FTP:
SITEDIR = / var / www / sites
BACKUP = / var / www / backup
SITEDIR - все директорії з сайтами які лежать всередині цього каталогу будуть архівувати в окремі архіви. Наприклад є каталоги /var/www/sites/site1.ru і /var/www/sites/site2.ru - відповідно ми отримаємо два архіву site1.ru.tar.gz і site2.ru.tar.gz
Далі встановлюємо поточну дату, щоб позначати бекапи і було зрозуміло за який день вони зроблені:
NOW = $ (date +% Y% m% d)Вказуємо шлях до бінарники:
TAR = "$ (which tar)" GZIP = "$ (which gzip)" MYSQL = "$ (which mysql)" MYSQLDUMP = "$ (which mysqldump)"Тепер створимо в директорії для бекапів BACKUP тимчасову директорію з поточною датою, туди будемо складати проміжні архіви з БД і з файлами сайтів, перед тим як завантажимо їх у загальний архів.
mkdir $ BACKUP / $ NOWДалі зберігаємо в змінну LS список всіх сайтів з вказаною нами директорії SITEDIR, щоб по черзі їх заархівувати.
LS = "$ (cd $ SITEDIR; ls)" for site in $ LS do cd $ SITEDIR; $ TAR -czf $ BACKUP / $ NOW / $ site.tar.gz $ site doneСинтаксис "$ (...)" вказує що нам потрібно виконати команду всередині дужок і результат виконання привласнити змінної LS. Після цього проходимо по директоріях циклом в якому спочатку переходимо в цю директорію, а потім архівуємо вміст. В директорію ми заходили для того щоб були короткі шляхи в архівах виду:
site1.ru/index.html site1.ru/css site1.ru/css/style.cssа не такого виду:
/var/www/sites/site1.ru/index.html /var/www/sites/site1.ru/css /var/www/sites/site1.ru/css/style.cssПісля того як ми загнали всі сайти в окремі архіви, потрібно тепер їх заархівувати в один загальний архів для даних сайту.
ARCHIVESITE = $ BACKUP / server- $ NOW.tar.gz cd $ BACKUP / $ NOW; $ TAR -zcvf $ ARCHIVESITE ./У ARCHIVESITE - вказуємо що це архів з даними (server) і додаємо дату бекапа. Потім переходимо в директорію NOW і додаємо їх в архів.
Тепер можна очистити директорію NOW, для проміжних бекапов баз даних.
rm -rf $ BACKUP / $ NOW / *У разом у нас вийшов один архів з даними (файлами) сайтів який поки лежить в директорії ARCHIVESITE. До нього трохи пізніше повернемося коли будемо завантажувати бекапи на FTP.
Переходимо далі до бекапіть Баз Даних.
Спочатку підключаємося до MYSQL і просимо показати нам список всіх БД у даного користувача. Після цього пройдемося циклом за цими базами і заархівіруем їх і складемо в директорію BACKUP / NOW
DBS = "$ ($ MYSQL -u $ MUSER -h $ MHOST -p $ MPASS -Bse 'show databases')" for db in $ DBS do if [$ db! = 'Information_schema'] then FILE = $ BACKUP / $ NOW / $ db.sql.gz $ MYSQLDUMP --add-drop-table --allow-keywords -q -c -u $ MUSER -h $ MHOST -p $ MPASS $ db $ i | $ GZIP -9> $ FILE fi doneТакож ми можемо відсікти непотрібні нам БД, наприклад information_schema які є службовими і вміст їх нас не цікавить.
Збираємо всі архіви з БД в один загальний і додаємо дату бекапа
ARCHIVEDB = $ BACKUP / mysql- $ NOW.tar.gz cd $ BACKUP / $ NOW; $ TAR -zcvf $ ARCHIVEDB ./У ARCHIVEDB - вказуємо що це архів з Базою Даних (mysql) і додаємо дату бекапа.
Директорію NOW (і все що в ній є) можна видаляти вона нам більше не потрібна:
rm -rf $ BACKUP / $ NOWПісля всього цього у нас залишилося два архіву з файлами і даними:
ARCHIVESITE = $ BACKUP / server- $ NOW.tar.gz ARCHIVEDB = $ BACKUP / mysql- $ NOW.tar.gzЗавантаження даних на FTP
Тепер все це справа потрібно завантажити як то на FTP, для цих цілей ми будемо використовувати cURL.
Почнемо знову ж з налаштувань:
FTPD = "dir / to / backup" # директорія всередині FTP (спочатку і в кінці без слеша) FTPU = "user" # ім'я користувача FTPP = "password" # пароль FTPS = "site3.ru" # сервер FTPЗадаємо кількість резервних копій яке потрібно зберігати на FTP:
DAYS = 5 # денні бекапи не рахуючи поточного MONTHS = 3 # місячні бекапи на перше число місяця не рахуючи поточногоВказуємо шлях до curl:
CURL = "$ (which curl)"Далі переходимо в каталог з нашими бекапіть:
cd $ BACKUPІ завантажуємо їх на FTP в зазначену в настройках директорію:
$ CURL -u $ FTPU: $ FTPP ftp: // $ FTPS / $ FTPD / -T "{server- $ NOW.tar.gz, mysql- $ NOW.tar.gz}" -sДля видалення зайвих бекапов (яким понад 5 днів) запитуємо список всіх файлів в директорії на FTP:
LIST = "$ ($ CURL -u $ FTPU: $ FTPP ftp: // $ FTPS / $ FTPD / -s -l)"Перебираємо всі файли в циклі і дивимося щоб це були файли типу server- {date} .tar.gz і mysql- {date} .tar.gz. Якщо дата не збігається з дозволеною (останні N днів і 1 число останніх N місяців) ми їх видаляємо:
for li in $ LIST do EXIST = 0 if [ "$ li" = "." ] || [ "$ Li" = ".."] then continue fi for day in `seq 0 $ DAYS` do d =" $ (date +% Y% m% d -d "$ day days ago") "if [" server- $ d.tar.gz "=" $ li "] || [ "Mysql- $ d.tar.gz" = "$ li"] then EXIST = 1 continue fi done for month in `seq 0 $ MONTHS` do d =" $ (date +% Y% m01 -d "$ month month ago ")" if [ "server- $ d.tar.gz" = $ li] || [ "Mysql- $ d.tar.gz" = $ li] then EXIST = 1 continue fi done if [$ EXIST -eq 0] then $ CURL -u $ FTPU: $ FTPP ftp: // $ FTPS / $ FTPD / -s -X "DELE $ li" fi doneІ очищаємо директорію BACKUP:
rm -rf $ BACKUP / *На цьому все. У прикладі можете завантажити робочий скрипт, тільки не забувайте вказати свої актуальні доступи і додати цей скрипт в крон для щоденного запуску.
Якщо є пропозиції щодо поліпшення або зауваження - пишіть в коментарях
Завантажити робочий приклад