Pull to refresh

Резервное копирование Rails проектов без затей

Reading time 3 min
Views 4.4K
Как известно, люди делятся на тех кто еще не делает резервных копий, тех кто уже делает, и тех кто уже делает и проверяет возможность восстановления

К счастью, 20 минут назад, когда кривой админ рецепт Capistrano напрочь снес на «боевом» сервере каталог с загруженными картинками из статей юзеров, я уже относился к категории делающих бэкапы. Вот, заодно и проверил.

А делаем мы резервные копии через gem backup


У нас на облачном хостинге на нескольких серверах сейчас крутится порядка 20 пользовательских сайтов, которые мы же и разработали плюс одно маленькое, но гордое (и тяжелое) приложение с VoIP, RTMP, J2ME и гейшами и веб-админкой. Когда несколько месяцев назад админ при обновлении затер конфиги Asterisk PBX и потом с трясущимся подбородком и синими губами восстанавливал их из запущенного демона, стало ясно — без бэкапов дальше слишком опасно. Но делать бэкапы «в лоб» для 20 приложений, каждое из которых использовало свою базу в MySQL со своими логинами и паролями было слишком неинтересно и скучно. Это был бы длинный-длинный баш скрипт, на который бы сразу же после успешного запуска забили бы пришлось бы тратить много времени чтобы поддерживать актуальность этого скрипта.

Вот тут нам и пригодился гем backup.

Гем backup делает вот что:
  • читает свой конфиг
  • дампит указанные базы (поддерживаются разные СУБД) во временный каталог
  • тарит указанные каталоги во временный каталог
  • жмет все
  • шифрует все
  • кладет на удаленный сервер по FTP, SCP, RSync и другие
  • поддерживает цикличность в месте хранения
  • пишет мне письмо


Надо всего лишь сделать три простые вещи:

1. Поставить гем (gem install backup)

2. Написать конфиг (по умолчанию исполняемый файл гема ищет конфиг в каталоге ~/Backup/config.rb, можно это изменить дополнительными опциями). Пример конфига для одного из наших сайтов:

Backup::Model.new(:kodepru, 'kodepru_backup') do

archive :my_archive do |archive|
archive.add '/path/to/dir/www.kodep.ru'
end

database MySQL do |db|
db.name = "wwwkodepru_production"
db.username = "user"
db.password = "password"
db.host = "mysql.local"
db.port = 3306
db.additional_options = ['--quick', '--single-transaction']
end

store_with SCP do |server|
server.username = 'backup'
server.password = 'verydifficultpassword'
server.ip = 'backup.local'
server.port = 22
server.path = '~/www.kodep.ru/'
server.keep = 14
end

compress_with Gzip do |compression|
compression.best = true
compression.fast = false
end

notify_by Mail do |mail|
mail.on_success = true
mail.on_failure = true

mail.from = 'backup@kodep.ru'
mail.to = 'sysadmin@kodep.ru'
mail.address = 'smtp.kodep.ru'
mail.port = 25
mail.domain = 'kodep.ru'
mail.user_name = 'backup@kodep.ru'
mail.password = 'password_ot_pochty'
mail.authentication = 'plain'
mail.enable_starttls_auto = true
end

end


Этот конфиг говорит гему, что надо взять дамп базы wwwkodepru_production, сдампить во временный каталог, взять каталог, где лежит сайт, все это заархивировать, положить через SCP на сервер бэкапов, убедившись что хранится не более 14 последних бэкапов и отправить радостное сообщение админу.

3. Записать в крон запуск команды backup perform --trigger kodepru скажем в полночь.



PROFIT!!!

Естественно, мы не пишем этот конфиг суровой админской рукой! Есть специальная панелька, написанная на коленке на рельсах.

Кстати, что-то говорит мне что не только Rails приложения состоят из каталога с кодом и базы…

Надеюсь, кому-то будет интересно, а я, пожалуй, буду продолжать писать про наши нехитрые приемчики.
Tags:
Hubs:
+26
Comments 16
Comments Comments 16

Articles