Wolf Clan Brasil

sexta-feira, 9 de setembro de 2011

Automatizando Backups no Rails 3 com astrails-safe e whenever

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' 


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


astrails-safe [OPTIONS] CONFIG_FILE

as [OPTIONS] são:
  -h, --help           Mostrar a ajuda
  -v, --verbose        executa todos os backups configurados!
  -n, --dry-run        apenas testa, não executa.
  -L, --local          Fazer somente backups locais, ignorando os remotos.
 
o CONFIG_FILE é um arquivo .rb 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
  local :path => "/backup/:kind/:id"

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

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

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

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

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

  keep do
    local 20
    s3 100
    cloudfiles 100
    sftp 100
  end

  mysqldump do
    options "-ceKq --single-transaction --create-options"

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

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

  end

  svndump do
    repo :my_repo do
      repo_path "/home/svn/my_repo"
    end
  end

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

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

    database :blog
    database :stateofflux_com
  end

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

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

    archive "astrails-com" do
      files "/var/www/astrails.com/"
      exclude ["/var/www/astrails.com/log", "/var/www/astrails.com/tmp"]  #adicione os arquivos aos quais você não deseja que sejam salvos.
    end
  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 
#para backup somente local
astrails-safe -v safe_config.rb 
#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 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.
 
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.
  command "/diretorio_da_sua_aplicação/config/astrails-safe -L safe_config.rb" 
  #substitua o '-L' para '-v' caso queira executar backup remoto
end


para gravar as alterações no config do Crontab


whenever --update-crontab store  


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


Um comentário:

painter in phoenix disse...

Pretty tough but challenging.