Каждый 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'.
Конфигурационный файл можно оставить без изменений. Приступим к доработке модели.
Стандартно созданный файл модели имел следующий вид (комментарии упущены):
Файл нужно доработать, а именно:
2. Настроить доступ к БД:
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.
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 имя_БД < файл_дампаПодробное описание здесь
И на русском, здесь:
Комментариев нет:
Отправить комментарий