Бекап файлів, бази даних і налаштувань сервера в Dropbox

Уже кілька років як з'явилася можливість будь-якому смертному бажаючому орендувати не тільки shared-хостинг, але і «повноцінний» сервер з root-доступом і можливістю налаштувати його так, як хочеться самому. Налаштувати, наприклад, крім web-сервера ще й купу інших сервісів.
Так само вчинив і я кілька років тому. Спочатку орендував один сервер, потім інший, і переносив настройки ручками, знаходячи потрібні файли в директорії / etc.
 
За пару років на моєму сервері осіло кілька блогів друзів, і навіть поштовий сервер, так як давно не хочу, щоб моя пошта була у Google. Насчет збереження даних замислювався після кожної статті на Хабре, але все було якось не до цього. І, як кажуть, адміни діляться на три категорії: на тих, хто не робить бекапи, на тих, хто вже робить і на тих, хто навіть перевіряє восстанавливаемость з бекапів. Так вийшло і зі мною, хоч хостер і дуже хороший, але сталася у них аварія з жорсткими дисками. Та така, що тиждень вони намагалися відновити диски і попередні оцінки були дуже невтішними. А бекапов у мене не було. Який настрій у мене було в ті дні можете самі уявити.
 
Але через кілька днів технікам хостера вдалося-таки відновити дані і запустити всі віртуальні сервера на тій ноді. А я задумався про бекапе. Думав я так — бекап повинен бути не на тому ж сервері (природно!), Бажано, щоб він був у мене на комп'ютері, але не в одному екземплярі. Я обдумав і установку FTP на домашній комп'ютер і навіть відправку архівів листами, але всі ці варіанти мене не влаштовували. І я зрозумів, що треба спробувати Dropbox, яким я до того часу користувався вже пару років, а безкоштовних гигов у мене було близько 18-ти.
 
 

Переваги бекапа в Dropbox:

 
     
  • Незалежність від домашньої інфраструктури і каналу в Інтернет
  •  
  • Множинні копії (відразу на все що синхронізуються ПК)
  •  
  • Крім власного зберігання бекапи зберігаються і в хмарі
  •  
 

Що робить представлений мною скрипт?

 
     
  • Інкрементальний бекап файлів у вказаних папках (по перших і п'ятнадцятим числам йде повний бекап)
  •  
  • Бекап всієї бази MySQL
  •  
  • Бекап архівується за допомогою 7zip, із зазначенням пароля (вам же не треба зберігати паролі у відкритому вигляді в Dropbox'е?)
  •  

 

Як це робиться?

Коротенько, створюється «додаток» з точки зору платформи Dropbox, авторизується користувачем (тобто нами) і пишеться скрипт, який користується авторизаційними даними і заливає файли бекапа на Dropbox.
 
 

А точніше?

 
Крок 1 — створення додатка
Заходимо на сторінку App Console , натискаємо кнопку «Create app», вибираємо тип «Dropbox API app», вибираємо пункт «Files and datastores», так як ми збираємося працювати з файлами, а в наступному пункті відповідаємо «Yes — My app only needs access to files it creates », це означає, що ваш додаток буде обмежене тільки своїм окремим теку теки App, до інших файлів у нього не буде доступу. Придумуємо назву свого додатком і натискаємо «Create app».
Перед вами постане ціла сторінка налаштувань створеного додатки, але там не потрібно нічого додатково налаштовувати. Але поки не закривайте її.
 
 
Крок 2 — скачування і установка SDK
Щоб писати додатки, які будуть працювати з файлами у вашому Dropbox'е, треба зайти в розділ Core API . Там ми можемо завантажити потрібні нам SDK, почитати документацію і пройти навчальні тури.
Так як я вважаю, що кращим мовою для скріптованія для мене є Python, то я скачав собі його SDK і встановив. Установка дуже проста, все обмежується скачуванням, Розархівація самого SDK і встановленням з допомогою команд & quot; python setup.py install & quot ;, або & quot; pip install dropbox & quot ;.
 
 
Крок 3 — авторизація
Бібліотека Core API використовує OAuth v2 , але Python SDK від Dropbox'а сам подбає про те, як ним користуватися, так що вам не про що хвилюватися і не доведеться писати все з нуля.
Настав час накодо невеликий скрипт:
 
 
# Включить Dropbox SDK
import dropbox

# Вставить настоящие app_key и app_secret со страницы созданного приложения из шага 1
app_key = 'INSERT_APP_KEY'
app_secret = 'INSERT_APP_SECRET'

flow = dropbox.client.DropboxOAuth2FlowNoRedirect(app_key, app_secret)

# На данном этапе юзер авторизуется
authorize_url = flow.start()
print '1. Перейдите по ссылке: ' + authorize_url
print '2. Нажмите "Allow"'
print '3. Скопируйте авторизационный код.'
code = raw_input("Вставьте авторизационный код сюда: ").strip()

# Если вы ввели правильный код, то дальше он отсылается на сервер и получается access_token, который нам нужен
access_token, user_id = flow.finish(code)

# Для проверки авторизации выведем информацию об аккаунте
client = dropbox.client.DropboxClient(access_token)
print 'linked account: ', client.account_info()

# А сам access_token вам надо сохранить в файл для дальнейшей работы скрипта
print 'access_token: ', access_token

 
Крок 4 — створюємо тимчасову папку і файл токена
Сам скрипт backup.py у мене лежить в папці / root, в ній же є тимчасова папка backup і файл dropbox_token.txt. Вам теж потрібно створити їх і в файл записати токен з попереднього кроку. Токен складається з двох рядків, в файлі вони саме так і лежать, з переносом рядка.
 
 
Крок останній — пишемо скрипт бекапа
 Розгорнути
#!/usr/bin/python

import os
import sys
import time
import string
from os.path import getsize

curDate = time.strftime("%d.%m.%Y", time.gmtime())
curDay = time.strftime("%d", time.gmtime())
backupDelay = time.time()-86400
if curDay == "01" or curDay == "15":
  backupDelay = 0
print "curDate:", curDate

# Include the Dropbox SDK libraries
from dropbox import client, rest, session

# Get your app key and secret from the Dropbox developer website
APP_KEY = 'ключ приложения'
APP_SECRET = 'секретный код приложения'

# ACCESS_TYPE should be 'dropbox' or 'app_folder' as configured for your app
ACCESS_TYPE = 'app_folder'
sess = session.DropboxSession(APP_KEY, APP_SECRET, ACCESS_TYPE)

oauth_token = ''
oauth_token_secret = ''

f = open("dropbox_token.txt",'r')
if f:
  oauth_token = string.strip(f.readline())
  oauth_token_secret = string.strip(f.readline())
  f.close()

print "oauth token found:", oauth_token, oauth_token_secret

if oauth_token == '' or oauth_token_secret == '':
  request_token = sess.obtain_request_token()

  # Authorize the application on dropbox site
  url = sess.build_authorize_url(request_token)
  print "url:", url
  print "Please visit this website and press the 'Allow' button, then hit 'Enter' here."
  raw_input()
  # This will fail if the user didn't visit the above URL and hit 'Allow'
  access_token = sess.obtain_access_token(request_token)
  f = open("dropbox_token.txt","wb")
  f.write(access_token.key + '\n')
  f.write(access_token.secret)
  f.close()
else:
  sess.set_token(oauth_token, oauth_token_secret)

client = client.DropboxClient(sess)
print "linked account:", client.account_info()

def sync_dir(dir):
  rootdir = dir
  print "Syncing directory:", rootdir
  startTime = backupDelay
  for root, subFolders, files in os.walk(rootdir):
    for file in files:
      fname = os.path.join(root,file)
      if os.path.getmtime(fname)>startTime:
        #print root, file
        os.system("mkdir -p 'backup"+root+"'")
        os.system("cp '"+fname+"' 'backup"+fname+"'")

print "Making dump of MySQL databases..."
os.system("mysqldump --all-databases -uroot -pROOT_ПАРОЛЬ_MYSQL -r backup/backup.sql")

sync_dir("/var/www")
sync_dir("/var/spool/virtual")
sync_dir("/home/user")

backupName = 'backup_'+curDate+'.7z'

print "Creating archive with name", backupName
os.system("7z a -pПАРОЛЬ_АРХИВА "+backupName+" backup/* /etc")

f = open(backupName,'rb')
if f:
  fsize = getsize(backupName)
  uploader = client.get_chunked_uploader(f, fsize)
  print "Uploading file", fsize, "bytes..."
  while uploader.offset < fsize:
    try:
      upload = uploader.upload_chunked()
      print "."
    except rest.ErrorResponse, e:
      # perform error handling and retry logic
      print "error uploading file!"
  uploader.finish("/"+backupName)
  f.close()
  print "File uploaded successfully."

print "Deleting temp files..."
os.system("rm -r backup/*")
os.system("rm " + backupName);

 
Післямова
 
     
  • Цей скрипт я додав в crontab з запуском щодня в 4:00 ранку.
  •  
  • В скрипті є три рядки з викликом функції sync_dir, точно так же ви самі можете налаштувати, які папки вам треба бекапіть.
  •  
  • Скрипт не видаляти файли, які були видалені з папки, якщо інкрементальних разархивировать повний архів і наступні, то видалені папки / файли залишаться.
  •  
  • Видалення старих бекапов в самому Dropbox я робити не став, чищу папку сам коли згадую про це.
  •  
  • Недавно взяв собі ще пару VPS в інших країнах, а в скрипт додав тільки префікс до назви бекапов, таким чином все бекапи зливаються в одну папку, але їх можна відрізнити дуже просто.
  •  

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.