[noosfero/noosfero][master] 2 commits: Enhance existing backup task and add a restore one
Antonio Terceiro
gitlab at gitlab.com
Fri May 8 13:50:36 BRT 2015
Antonio Terceiro pushed to branch master at Noosfero / noosfero
Commits:
935a6418 by Antonio Terceiro at 2015-05-08T13:48:49Z
Enhance existing backup task and add a restore one
- `rake backup` will now create a tarball with everything that needs to
be backed up (files + database dump)
- `rake restore BACKUP=/path/to/(...).tar.gz` will restore that backup
over the current Noosfero instance.
Multi-tenant setups are not supported yet.
- - - - -
85b736c8 by Antonio Terceiro at 2015-05-08T16:50:20Z
Merge branch 'backup-restore' into 'master'
backup/restore rake tasks
see commit message
See merge request !469
- - - - -
1 changed file:
- lib/tasks/backup.rake
Changes:
=====================================
lib/tasks/backup.rake
=====================================
--- a/lib/tasks/backup.rake
+++ b/lib/tasks/backup.rake
@@ -1,8 +1,107 @@
-desc "Creates a backup of the user files stored in public/"
-task :backup do
- dirs = Dir.glob('public/images/[0-9][0-9][0-9][0-9]') + ['public/articles', 'public/thumbnails', 'public/user_themes'].select { |d| File.exists?(d) }
- tarball = 'backups/files-' + Time.now.strftime('%Y-%m-%d-%R') + '.tar'
+task :load_backup_config do
+ $config = YAML.load_file('config/database.yml')
+end
+
+task :check_backup_support => :load_backup_config do
+ if $config['production']['adapter'] != 'postgresql'
+ fail("Only PostgreSQL is supported for backups at the moment")
+ end
+end
+
+backup_dirs = [
+ 'public/image_uploads',
+ 'public/articles',
+ 'public/thumbnails',
+ 'public/user_themes',
+]
+
+desc "Creates a backup of the database and uploaded files"
+task :backup => :check_backup_support do
+ dirs = backup_dirs.select { |d| File.exists?(d) }
+
+ backup_name = Time.now.strftime('%Y-%m-%d-%R')
+ backup_file = File.join('tmp/backup', backup_name) + '.tar.gz'
+ mkdir_p 'tmp/backup'
+ dump = File.join('tmp/backup', backup_name) + '.sql'
+
+ database = $config['production']['database']
+ sh "pg_dump #{database} > #{dump}"
+
+ sh 'tar', 'caf', backup_file, dump, *dirs
+ rm_f dump
+
+ puts "****************************************************"
+ puts "Backup in #{backup_file} !"
+ puts
+ puts "To restore, use:"
+ puts "$ rake restore BACKUP=#{backup_file}"
+ puts "****************************************************"
+end
+
+def invalid_backup!(message, items=[])
+ puts "E: #{message}"
+ items.each do |i|
+ puts "E: - #{i}"
+ end
+ puts "E: Is this a backup archive created by Noosfero with \`rake backup\`?"
+ exit 1
+end
+
+desc "Restores a backup created previousy with \`rake backup\`"
+task :restore => :check_backup_support do
+ backup = ENV["BACKUP"]
+ unless backup
+ puts "usage: rake restore BACKUP=/path/to/backup"
+ exit 1
+ end
+
+ files = `tar taf #{backup}`.split
+
+ # validate files in the backup
+ invalid_files = []
+ files.each do |f|
+ if f !~ /tmp\/backup\// && (backup_dirs.none? { |d| f =~ /^#{d}\// })
+ invalid_files << f
+ end
+ end
+ if invalid_files.size > 0
+ invalid_backup!("Invalid files found in the backup archive", invalid_files)
+ end
+
+ # find database dump in the archive
+ dumps = files.select do |f|
+ File.dirname(f) == 'tmp/backup' && f =~ /\.sql$/
+ end
+ if dumps.size == 0
+ invalid_backup!("Could not find a database dump in the archive.")
+ elsif dumps.size > 1
+ invalid_backup!("Multiple database dumps found in the archive:", dumps)
+ end
+ dump = dumps.first
+
+ database = $config['production']['database']
+ username = $config['production']['username']
+
+ puts "WARNING: backups should be restored to an empty database, otherwise"
+ puts "data from the backup may not be loaded properly."
+ puts
+ puts 'You can remove the existing database and create a new one with:'
+ puts
+ puts "$ sudo -u postgres dropdb #{database}"
+ puts "$ sudo -u postgres createdb #{database} --owner #{username}"
+ puts
+ print "Are you sure you want to continue (y/N)? "
+ response = $stdin.gets.strip
+ unless ['y', 'yes'].include?(response.downcase)
+ puts "*** ABORTED."
+ exit 1
+ end
+
+ sh 'tar', 'xaf', backup
+ sh "rails dbconsole production < #{dump}"
+ rm_f dump
- mkdir_p(File.dirname(tarball))
- sh('tar', 'cf', tarball, *dirs)
+ puts "****************************************************"
+ puts "Backup restored!"
+ puts "****************************************************"
end
View it on GitLab: https://gitlab.com/noosfero/noosfero/compare/ae97efa0af7e4873720ae918c99c3fdc7810e5cf...85b736c87855217fc9d6d133f17d8d35184301fa
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listas.softwarelivre.org/pipermail/noosfero-dev/attachments/20150508/8e3d4354/attachment-0001.html>
More information about the Noosfero-dev
mailing list