Para simplificar los backups de nuestras aplicaciones podemos usar rake. Para hacernos con el es recomendable consultar el siguiente artículo Ruby on Rails Rake Tutorial
Los scripts propios los creamos en la carpeta lib/task
Vamos a crear un conjunto de acciones (task) dentro de la categoría (namespace) rbackup.
Queremos que este script nos haga un backup de la base de datos y de algunas carpetas de public (por ejemplo la carpera upload) y que nos copie todo comprimido en un archivo accesible desde la web.
Lo primero que hacemos es crear el archivo lib/task/rbackup.rake y definir la categoria:
-
namespace :rbackup do
-
-
end
Bien, ahora vamos a definir las acciones que vamos a necesitar
-
namespace :rbackup do
-
desc "Crea los directorios tmp/backup y public/backup"
-
task :crea_dir do
-
end
-
-
desc "Copia de seguridad de la base de datos en la carpeta tmp/backup"
-
task :base_datos => :crea_dir do
-
end
-
-
desc "Crea una copia de seguridad de las carpetas indicadas"
-
task :carpetas => :crea_dir do
-
end
-
-
desc "Crea una copia de la BD y de las carpetas y las comprime en pubic/backup "
-
task :all => [:base_datos, :carpetas]do
-
end
-
end
Ejecutando rake –task y nos da información de losa task disponibles
Para ejecutar estas acciones podemos poner rake rbackup:base_datos o rake rbackup:all
Vamos a crear los task….
Este nos creará los directorios si no existen
-
task :crea_dir do
-
unless File.exist?("#{RAILS_ROOT}/public/backup")
-
puts "Creando directorio public/backup"
-
sh "mkdir #{RAILS_ROOT}/public/backup/"
-
end
-
unless File.exist?("#{RAILS_ROOT}/tmp/backup")
-
puts "Creando directorio tmp/backup"
-
sh "mkdir #{RAILS_ROOT}/tmp/backup/"
-
end
-
end
Para hacer el backup de la base de datos extraemos los datos del archivo database.yml para poder usarlos con el comando mysqldump
Como usamos YAML es necesario poner al principio del archivo require ‘yaml’
-
task :base_datos => :crea_dir do
-
@conf = YAML::load(File.open("#{RAILS_ROOT}/config/database.yml"))
-
@db = @conf[‘development’]
-
# Hacemos una copia de la base de datos en el directorio temporal
-
puts "****** Creando copia de seguridad de #{@db['database']}… ******"
-
sh "mysqldump –opt –user=#{@db['username']} –password=#{@db['password']} #{@db['database']} -h #{@db['host']} > tmp/backup/#{@db['database']}.sql"
-
end
con => :crea_dir le indicamos que tiene que ejecutar antes el task crea_dir
Nota: si no ponemos -h #{@db['host']} puede salirnos el error mysqldump error 2002
Ahora comprimimos las carpetas usando tar.
-
desc "Crea una copia de seguridad de las carpetas indicadas"
-
task :carpetas => :crea_dir do
-
@carpetas = %w(images uploads)
-
for carpeta in @carpetas
-
puts "****** Creando copia de #{carpeta}… ******"
-
system("tar cvzf ‘#{RAILS_ROOT}/tmp/backup/#{carpeta}.tar.gz’ ‘#{RAILS_ROOT}/public/#{carpeta}’")
-
# unless system(comando)
-
# flash[:error] = comando
-
# end
-
end
-
end
En la variable @carpetas ponemos las carpetas de pubic de las que queremos hacer el backup
Por ultimo hacemos un task que nos ejecute todas las acciones:
-
task :all => [:base_datos, :carpetas]do
-
puts "****** Comprimiendo y publicando…. ******"
-
system("tar cvzf ’#{RAILS_ROOT}/public/backup/#{@db['database']}#{Date.today}.tar.gz’ ‘#{RAILS_ROOT}/tmp/backup’")
-
puts "****** #{@db['database']}#{Date.today}.tar.gz creado ******"
-
puts "****** Borrando datos de tmp/backup… ******"
-
system("rm -f #{RAILS_ROOT}/tmp/backup/*")
-
end
Ya tenemos nuestro script rake terminado. Ahora podemos crear un controlador para tener acceso a los archivos generados y poder borrarlos una vez descargados.
Creamos un controlador rbackup_controller.rb y ponemos:
-
class RbackupController < ApplicationController
-
-
def index
-
@dir = Dir.new("#{RAILS_ROOT}/public/backup")
-
@archivos = Array.new
-
@dir.each do |x|
-
if x[0] != 46
-
@archivos = @archivos + ["#{x}"]
-
end
-
end
-
-
end
-
-
def borrar
-
comando = "rm -f #{RAILS_ROOT}/public/backup/#{params[:archivo]}"
-
unless system(comando)
-
flash[:error] = comando
-
end
-
redirect_to :action => ‘index’
-
end
-
end
Ahora solo queda poner en la vista del controlador:
Listado de Archivos generados<br><br>
<% for archivo in @archivos %>
<%=link_to archivo, “backup/#{archivo}”%> - <%=number_to_human_size File.size(”#{RAILS_ROOT}/public/backup/#{archivo}”)%> - <%=link_to “borrar” , {:controller=>:rbackup,:action=>:borrar,:archivo=>archivo}, :confirm =>”Desea borrarlo?”%><br>
<% end %>
y tenemos un sistema de backups básico.