четверг, 8 января 2015 г.

Backups in Ruby On Rails. Gem Backup

Каждый Ruby On Rails программист, опасающийся за сохранность своих зубов, должен задуматься о настройке резервного копирования приложения и базы данных (Backup copy, далее - бэкап).

Здесь описан процесс настройки резервного копирования Ruby On Rails приложений с помощью гема Backup (https://github.com/meskyanichi/backup).

В результате будет настроено следующее:
1. Сохранение в архив всех файлов приложения и инструкций для восстановления БД один раз в сутки;
2. Отправка архива на FTP сервер;
3. Оповещение по email о результате бэкапа.

Установка


Добавьте в gemfile строку:
gem 'backup'

Выполните
bundle install

Создание модели бэкапа


Модель бэкапа описывает, каким образом делать резервное копирование (Какие файлы и базы данных сохранять, где их сохранять, каким образом сжимать файлы, как оповещать о проделанной работе и т.д.)

Создайте простейшую модель бэкапа:
backup generate:model --trigger my_backup --archives --storages='local' --compressors='gzip' --notifiers='mail' --databases='postgresql'

--trigger - Имя триггера для модели бэкапа
--archives - Модель будет использовать tar архиватор
--storages - Места хранения бэкапов (локальное хранилище, облачное хранилище, ftp)
--compressors - (bzip2, custom, gzip)
--notifiers - способы оповещения, например, через email
--databases - используемые базы данных (в данном случае - postgresql)

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

После выполнения команды должны появиться строки:
Generated model file: '/home/username/Backup/models/my_backup.rb'.
Generated configuration file: '/home/username/Backup/config.rb'.

Конфигурационный файл можно оставить без изменений. Приступим к доработке модели.

Настройка модели бэкапа


Стандартно созданный файл модели имел следующий вид (комментарии упущены):
Backup::Model.new(:my_backup, 'Description for my_backup') do
  split_into_chunks_of 250
  
  archive :my_archive do |archive|
    archive.add "/path/to/a/file.rb"
    archive.add "/path/to/a/folder/"
    archive.exclude "/path/to/a/excluded_file.rb"
    archive.exclude "/path/to/a/excluded_folder"
  end

  database PostgreSQL do |db|
    db.name               = "my_database_name"
    db.username           = "my_username"
    db.password           = "my_password"
    db.host               = "localhost"
    db.port               = 5432
    db.socket             = "/tmp/pg.sock"
    db.skip_tables        = ["skip", "these", "tables"]
    db.only_tables        = ["only", "these", "tables"]
    db.additional_options = ["-xc", "-E=utf8"]
  end

  store_with Local do |local|
    local.path       = "~/backups/"
    local.keep       = 5
  end

  compress_with Gzip

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

    mail.from                 = "sender@email.com"
    mail.to                   = "receiver@email.com"
    mail.address              = "smtp.gmail.com"
    mail.port                 = 587
    mail.domain               = "your.host.name"
    mail.user_name            = "sender@email.com"
    mail.password             = "my_password"
    mail.authentication       = "plain"
    mail.encryption           = :starttls
  end

end

Файл нужно доработать, а именно:

1. Указать, какие каталоги нужно добавить в бэкап, а какие исключить:
archive :mayak_archive do |archive|
    archive.add "/home/username/Workspace/RubyOnRails/Appname"
end

Все предельно просто. Указываем папки и файлы, которые нужно добавить в архив с помощью archive.add.
Для исключения каталога из архива используйте archive.exclude.

2. Настроить доступ к БД:
database PostgreSQL do |db|
    db.name               = "my_database_name"
    db.username           = "my_username"
    db.password           = "my_password"
    db.host               = "localhost"
    db.port               = 5432
    db.socket             = "/var/run/postgresql"
    db.additional_options = []
end

Указываем имя базы данных, пользователя БД с паролем, адрес и порт для доступа к БД и сокет БД.

Путь к сокету БД у меня отличался от стандартного. Я указал свой: /var/run/postgresql.
Чтобы выполнить бэкап БД на удаленной машине, вместо localhost нужно указать ip адрес сервера.

Если вы хотите сохранять лишь некоторые таблицы, используйте db.skip_tables и db.only_tables.

3. Настроить оповещение по email:
Я использовал почтовый ящик gmail. Конфигурация приведена именно для него.
notify_by Mail do |mail|
    mail.on_success           = true
    mail.on_warning           = true
    mail.on_failure           = true

    mail.from                 = "my_email@gmail.com"
    mail.to                   = "4ybakut2004@gmail.com"
    mail.address              = "smtp.gmail.com"
    mail.port                 = 587
    mail.domain               = "gmail.com"
    mail.user_name            = "my_email@gmail.com"
    mail.password             = "my_password"
    mail.authentication       = "plain"
    mail.encryption           = :starttls
end

Вместо my_email@gmail.com укажите адрес, с которого будет происходить рассылка.
Вместо my_password укажите пароль к этому почтовому ящику.

4. Настроить отправление архива на FTP:
store_with FTP do |server|
    server.username     = 'ftp_username'
    server.password     = 'ftp_password'
    server.ip           = 'ftp_ip_address'
    server.port         = 21
    server.path         = '/путь/сохранения/на/ftp/сервере'
    server.keep         = 4
    server.passive_mode = false
end

Указываем данные для доступа к FTP (логин, пароль, ip адрес), путь для сохранения бэкапов и количество хранимых бэкапов.

Настройка завершена. Полный вид файла модели:
Backup::Model.new(:my_backup, 'Description for my_backup') do
  split_into_chunks_of 250

  archive :mayak_archive do |archive|
    archive.add "/home/username/Workspace/RubyOnRails/Appname"
  end

  database PostgreSQL do |db|
    db.name               = "my_database_name"
    db.username           = "my_username"
    db.password           = "my_password"
    db.host               = "localhost"
    db.port               = 5432
    db.socket             = "/var/run/postgresql"
    db.additional_options = []
  end

  store_with Local do |local|
    local.path       = "~/backups/"
    local.keep       = 5
  end

  store_with FTP do |server|
    server.username     = 'ftp_username'
    server.password     = 'ftp_password'
    server.ip           = 'ftp_ip_address'
    server.port         = 21
    server.path         = '/путь/сохранения/на/ftp/сервере'
    server.keep         = 4
    server.passive_mode = false
  end

  compress_with Gzip

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

    mail.from                 = "my_email@gmail.com"
    mail.to                   = "4ybakut2004@gmail.com"
    mail.address              = "smtp.gmail.com"
    mail.port                 = 587
    mail.domain               = "gmail.com"
    mail.user_name            = "my_email@gmail.com"
    mail.password             = "my_password"
    mail.authentication       = "plain"
    mail.encryption           = :starttls
  end

end

Запуск бэкапа


Чтобы запустить бэкап выполните команду:
bundle exec backup perform --trigger my_backup

Имя триггера укажите то, которое вы задали во время создания модели.

После этого будет создан архив приложения и БД, который поместится по указанному адресу на FTP сервере. Письмо с результатом будет отправлено на указанный почтовый ящик.

Периодическое выполнения бэкапа


Для выполнения бэкапа по расписанию можно создать cron job. Для этого я использовал гем whenever (https://github.com/javan/whenever), позволяющий легко организовывать периодические операции в rails приложениях через cron jobs.

Однако, для выполнения бэкапа на сервере, команду пришлось доработать и указать путь к gemfile:
BUNDLE_GEMFILE=/path/to/gemfile/Gemfile  bundle exec backup perform --trigger my_backup


Восстановление БД


Для чего был весь этот геморрой? Для того, чтобы восстановить базу данных в случае ее порчи/уничтожения.

Чтобы восстановить БД из бэкапа, найдите файла дампа в архиве (он будет иметь примерно такое имя - PostgreSQL.sql) и выполните команду:

psql имя_БД < файл_дампа

Подробное описание здесь
И на русском, здесь:

Комментариев нет:

Отправить комментарий