Automatizando Backups no Rails 3 com astrails-safe e whenever
Autor: ZeRo | Publicado: 2011-09-09T07:26:00-07:00

Uma das tarefas vitais é o backup do banco de dados e dos arquivos de uma aplicação.Esta tarefa as vezes pode ser complicada e cansativa, para nossa sorte existe duas gems que tornam essa tarefa extremamente simples, a astrails-safe e a whenever, neste post vou exemplificar a utilização destas ótimas gems que oferecem recursos muito requisitados como backup remoto.Uma das forma de realizar backups automáticos do banco de dados é usar um script mysql dump junto com um cronjob.porem configurar o crontab não é uma tarefa simples, para facilitar esta configuração utilizaremos a gem whenever que tem uma sintaxe simples para criação de cron jobs. e utilizaremos também a gem astrails-save, que é um sistema para backups não só do banco de dados mas também dos arquivos e com suporte a CDN's como o Amazom S3 e o Rackspace Cloud Files. no caso estou utilizando Rails 3.0.4 e Ruby 1.8.7. o primeiro passo é adicionar as linhas abaixo ao Gemfile.

gem 'whenever'
gem 'astrails-safe'&nbsp;


vamos primeiro analisar o funcionamento do&nbsp;astrails-safe, sua utilização é simples:

astrails-safe [OPTIONS] CONFIG_FILE 
as [OPTIONS] são:&nbsp; -h, --help&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Mostrar a ajuda&nbsp; -v, --verbose&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; executa todos os backups configurados!&nbsp;&nbsp;-n, --dry-run&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; apenas testa, não executa.&nbsp; -L, --local&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Fazer somente backups locais, ignorando os remotos.&nbsp;o CONFIG_FILE é um arquivo&nbsp;.rb&nbsp;eu criei o arquivo "safe_config.rb" no diretório config.abaixo tem um exemplo retirado da documentação da gem, com algumas partes traduzidas.


safe do
&nbsp; local :path =&gt; "/backup/:kind/:id"

&nbsp; s3 do
&nbsp; &nbsp; key "...................."
&nbsp; &nbsp; secret "........................................"
&nbsp; &nbsp; bucket "backup.astrails.com"
&nbsp; &nbsp; path "servers/alpha/:kind/:id"
&nbsp; end

&nbsp; cloudfiles do
&nbsp; &nbsp; user "..........."
&nbsp; &nbsp; api_key "................................."
&nbsp; &nbsp; container "safe_backup"
&nbsp; &nbsp; path ":kind/" # this is default
&nbsp; &nbsp; service_net false
&nbsp; end

&nbsp; sftp do
&nbsp; &nbsp; host "sftp.astrails.com"
&nbsp; &nbsp; user "astrails"
&nbsp; &nbsp; # port 8023
&nbsp; &nbsp; password "ssh password for sftp"
&nbsp; end

&nbsp; gpg do
&nbsp; &nbsp; command "/usr/local/bin/gpg"
&nbsp; &nbsp; options &nbsp;"--no-use-agent"
&nbsp; &nbsp; # symmetric encryption key
&nbsp; &nbsp; # password "qwe"

&nbsp; &nbsp; #chave pública GPG (deve ser conhecida com GPG, ou seja, estar no chaveiro
&nbsp; &nbsp; key "backup@astrails.com"
&nbsp; end

&nbsp; keep do
&nbsp; &nbsp; local 20
&nbsp; &nbsp; s3 100
&nbsp; &nbsp; cloudfiles 100
&nbsp; &nbsp; sftp 100
&nbsp; end

&nbsp; mysqldump do
&nbsp; &nbsp; options "-ceKq --single-transaction --create-options"

&nbsp; &nbsp; user "root" #seu usuário
&nbsp; &nbsp; password "............" #sua senha
&nbsp; &nbsp; socket "/var/run/mysqld/mysqld.sock"

&nbsp; &nbsp; #liste todas as tabelas que deseja efetuar o backup
&nbsp; &nbsp; database :blog
&nbsp; &nbsp; database :servershape
&nbsp; &nbsp; database :astrails_com
&nbsp; &nbsp;# você pode ignorar algumas tabelas
&nbsp; &nbsp; database :secret_project_com do
&nbsp; &nbsp; &nbsp; skip_tables "foo"
&nbsp; &nbsp; &nbsp; skip_tables ["bar", "baz"]
&nbsp; &nbsp; end

&nbsp; end

&nbsp; svndump do
&nbsp; &nbsp; repo :my_repo do
&nbsp; &nbsp; &nbsp; repo_path "/home/svn/my_repo"
&nbsp; &nbsp; end
&nbsp; end

&nbsp; pgdump do
&nbsp; &nbsp; options "-i -x -O" &nbsp; # -i =&gt; ignorar versão, -x =&gt; não configurar privilegios (grant/revoke), -O =&gt; skip restoration of object ownership in plain text format

&nbsp; &nbsp; user "username"
&nbsp; &nbsp; password "............" &nbsp;# shouldn't be used, instead setup ident. &nbsp;Current functionality exports a password env to the shell which pg_dump uses - untested!

&nbsp; &nbsp; database :blog
&nbsp; &nbsp; database :stateofflux_com
&nbsp; end

&nbsp; #Para efetuar os backups dos arquivos
&nbsp; tar do
&nbsp; &nbsp; options "-h" # dereference symlinks
&nbsp; &nbsp; archive "git-repositories", :files =&gt; "/home/git/repositories"
&nbsp; &nbsp; archive "dot-configs", &nbsp; &nbsp; &nbsp;:files =&gt; "/home/*/.[^.]*"
&nbsp; &nbsp; archive "etc", &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;:files =&gt; "/etc", :exclude =&gt; "/etc/puppet/other"

&nbsp; &nbsp; archive "blog-astrails-com" do
&nbsp; &nbsp; &nbsp; files "/var/www/blog.astrails.com/"
&nbsp; &nbsp; &nbsp; exclude "/var/www/blog.astrails.com/log"
&nbsp; &nbsp; &nbsp; exclude "/var/www/blog.astrails.com/tmp"
&nbsp; &nbsp; end

&nbsp; &nbsp; archive "astrails-com" do
&nbsp; &nbsp; &nbsp; files "/var/www/astrails.com/"
&nbsp; &nbsp; &nbsp; exclude ["/var/www/astrails.com/log", "/var/www/astrails.com/tmp"] &nbsp;#adicione os arquivos aos quais você não deseja que sejam salvos.
&nbsp; &nbsp; end
&nbsp; end
end

apos ter o arquivo "safe_config.rb" configurado você pode executar o comando abaixo para realizar o backup:


astrails-safe -L safe_config.rb&nbsp;
#para backup somente local
astrails-safe -v safe_config.rb&nbsp;
#para executar o arquivo de configuração na integra, executando os backups local e remoto.


agora vamos tornar a execução deste comando automático e periódico através da gem&nbsp;whenever.utilize o comando abaixo para criar o arquivo de configuração, que estará no diretório config da aplicação.

wheneverize .  
caso não execute é possível que seja necessário adicionar a gem ao PATH.&nbsp;abra o arquivo criado, "schedule.rb" e adicione as linha abaixo:


every 1.days do
#Eu defini que será executado esse comando a cada 1 dia você pode alterar de acordo com sua necessidade.
&nbsp; command "/diretorio_da_sua_aplicação/config/astrails-safe -L safe_config.rb"&nbsp;
&nbsp; #substitua o '-L' para '-v' caso queira executar backup remoto
end

para gravar as alterações no config do Crontab

whenever --update-crontab store&nbsp;&nbsp;

Pronto agora a aplicação está gerando backups automáticos a cada 1 dia.