backuper 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +2 -0
- data/README.rdoc +43 -0
- data/Rakefile +2 -0
- data/VERSION +1 -0
- data/backuper.gemspec +42 -0
- data/lib/backuper.rb +78 -0
- metadata +72 -0
data/.gitignore
ADDED
data/README.rdoc
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
= About
|
2
|
+
|
3
|
+
Backuper is a simple server backup tool written in Ruby. It is aimed to backup a Rails application (file assets and database) to a remote SSH server (using rsync).
|
4
|
+
|
5
|
+
= Installation
|
6
|
+
|
7
|
+
sudo gem install backuper
|
8
|
+
|
9
|
+
= Configuration
|
10
|
+
|
11
|
+
Configure and run the backup :
|
12
|
+
|
13
|
+
Backuper.new do
|
14
|
+
set :source_path, '/var/apps/blop/current/shared/system'
|
15
|
+
set :local_backup_base_path, '/var/backups/blop'
|
16
|
+
set :remote_backup_ssh_info, 'username@host:/path/to/backups/blop'
|
17
|
+
set :max_kept_backups, 30
|
18
|
+
set :mysql_params, YAML::load(File.read('config/database.yml'))['production']
|
19
|
+
end
|
20
|
+
|
21
|
+
Put this in a script (e.g., *app/backup.rb*).
|
22
|
+
|
23
|
+
Don't forget to set up the public keys, it won't work with password authentication.
|
24
|
+
|
25
|
+
= Scheduling
|
26
|
+
|
27
|
+
Add a line to your crontab with *crontab -e* to run the script.
|
28
|
+
|
29
|
+
Or use whenever :
|
30
|
+
|
31
|
+
require 'backuper'
|
32
|
+
|
33
|
+
every 12.hours do
|
34
|
+
command "script"
|
35
|
+
end
|
36
|
+
|
37
|
+
= Credits
|
38
|
+
|
39
|
+
(c) 2009 Aurélien Malisart
|
40
|
+
http://aurelien.malisart.be
|
41
|
+
|
42
|
+
This is open source software released under GNU GPLv3 license.
|
43
|
+
http://www.gnu.org/copyleft/gpl.html
|
data/Rakefile
ADDED
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.0.1
|
data/backuper.gemspec
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{backuper}
|
8
|
+
s.version = File.read('VERSION')
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Aur\303\251lien Malisart"]
|
12
|
+
s.date = %q{2009-10-28}
|
13
|
+
s.description = %q{simple server backup tool}
|
14
|
+
s.email = %q{aurelien.malisart@gmail.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"README.rdoc"
|
17
|
+
]
|
18
|
+
s.files = [
|
19
|
+
".gitignore",
|
20
|
+
"README.rdoc",
|
21
|
+
"Rakefile",
|
22
|
+
"VERSION",
|
23
|
+
"backuper.gemspec",
|
24
|
+
"lib/backuper.rb"
|
25
|
+
]
|
26
|
+
s.homepage = %q{http://github.com/aurels/backuper}
|
27
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
28
|
+
s.require_paths = ["lib"]
|
29
|
+
s.rubygems_version = %q{1.3.5}
|
30
|
+
s.summary = %q{simple server backup tool}
|
31
|
+
|
32
|
+
if s.respond_to? :specification_version then
|
33
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
34
|
+
s.specification_version = 3
|
35
|
+
|
36
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
37
|
+
else
|
38
|
+
end
|
39
|
+
else
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
data/lib/backuper.rb
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
class Backuper
|
2
|
+
|
3
|
+
attr_accessor :source_path, :local_backup_base_path, :remote_backup_ssh_info,
|
4
|
+
:remote_backup_base_path, :max_kept_backups, :mysql_params
|
5
|
+
|
6
|
+
def initialize(&block)
|
7
|
+
instance_eval(&block)
|
8
|
+
|
9
|
+
mysql_params['host'] ||= 'localhost'
|
10
|
+
mysql_params['username'] ||= 'root'
|
11
|
+
|
12
|
+
system "mkdir -p #{local_backup_base_path}"
|
13
|
+
|
14
|
+
perform_files_backup
|
15
|
+
perform_database_backup
|
16
|
+
perform_remote_sync
|
17
|
+
end
|
18
|
+
|
19
|
+
def set(attribute, value)
|
20
|
+
instance_variable_set("@#{attribute}", value)
|
21
|
+
end
|
22
|
+
|
23
|
+
def perform_files_backup
|
24
|
+
timestamp = "#{Time.now.strftime('%Y-%-m-%d-%s')}"
|
25
|
+
local_current_backup_path = "#{local_backup_base_path}/files/#{timestamp}"
|
26
|
+
local_latest_backup_path = Dir["#{local_backup_base_path}/files/*"].last
|
27
|
+
system "mkdir -p #{local_current_backup_path}"
|
28
|
+
|
29
|
+
# Local backup
|
30
|
+
|
31
|
+
if File.exist?("#{local_latest_backup_path}")
|
32
|
+
puts "Performing local backup with hard links to pervious version"
|
33
|
+
system "rsync -az --delete --link-dest=#{local_latest_backup_path} #{source_path} #{local_current_backup_path}"
|
34
|
+
else
|
35
|
+
puts "Performing initial local backup"
|
36
|
+
system "rsync -az #{source_path} #{local_current_backup_path}"
|
37
|
+
end
|
38
|
+
|
39
|
+
# Cleanup of old versions
|
40
|
+
|
41
|
+
Dir["#{local_backup_base_path}/files/*"].reverse.each_with_index do |backup_version, index|
|
42
|
+
if index >= max_kept_backups
|
43
|
+
system "rm -rf #{backup_version}"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def perform_database_backup
|
49
|
+
return if mysql_params['database'] == '' || !(mysql_params['adapter'] =~ /mysql/)
|
50
|
+
|
51
|
+
timestamp = "#{Time.now.strftime('%Y-%-m-%d-%s')}"
|
52
|
+
local_current_backup_path = "#{local_backup_base_path}/mysql/#{timestamp}.sql"
|
53
|
+
local_latest_backup_path = Dir["#{local_backup_base_path}/mysql/*.sql"].last
|
54
|
+
|
55
|
+
unless File.exist?("#{local_backup_base_path}/mysql")
|
56
|
+
system "mkdir #{local_backup_base_path}/mysql"
|
57
|
+
end
|
58
|
+
|
59
|
+
# Local backup
|
60
|
+
|
61
|
+
puts "Performing local backup of database #{mysql_params['database']} as user #{mysql_params['username']}"
|
62
|
+
system "mysqldump #{mysql_params['database']} --user=#{mysql_params['username']} --password=#{mysql_params['password']} > #{local_current_backup_path}"
|
63
|
+
|
64
|
+
# Cleanup of old versions
|
65
|
+
|
66
|
+
Dir["#{local_backup_base_path}/mysql/*"].reverse.each_with_index do |backup_version, index|
|
67
|
+
if index >= max_kept_backups
|
68
|
+
system "rm -rf #{backup_version}"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def perform_remote_sync
|
74
|
+
puts "Performing remote backup sync"
|
75
|
+
system "rsync -azH --delete #{local_backup_base_path} #{remote_backup_ssh_info}"
|
76
|
+
puts "Done"
|
77
|
+
end
|
78
|
+
end
|
metadata
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: backuper
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 13
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 2
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 2.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- "Aur\xC3\xA9lien Malisart"
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2009-10-28 00:00:00 +01:00
|
19
|
+
default_executable:
|
20
|
+
dependencies: []
|
21
|
+
|
22
|
+
description: simple server backup tool
|
23
|
+
email: aurelien.malisart@gmail.com
|
24
|
+
executables: []
|
25
|
+
|
26
|
+
extensions: []
|
27
|
+
|
28
|
+
extra_rdoc_files:
|
29
|
+
- README.rdoc
|
30
|
+
files:
|
31
|
+
- .gitignore
|
32
|
+
- README.rdoc
|
33
|
+
- Rakefile
|
34
|
+
- VERSION
|
35
|
+
- backuper.gemspec
|
36
|
+
- lib/backuper.rb
|
37
|
+
has_rdoc: true
|
38
|
+
homepage: http://github.com/aurels/backuper
|
39
|
+
licenses: []
|
40
|
+
|
41
|
+
post_install_message:
|
42
|
+
rdoc_options:
|
43
|
+
- --charset=UTF-8
|
44
|
+
require_paths:
|
45
|
+
- lib
|
46
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
47
|
+
none: false
|
48
|
+
requirements:
|
49
|
+
- - ">="
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
hash: 3
|
52
|
+
segments:
|
53
|
+
- 0
|
54
|
+
version: "0"
|
55
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
56
|
+
none: false
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
hash: 3
|
61
|
+
segments:
|
62
|
+
- 0
|
63
|
+
version: "0"
|
64
|
+
requirements: []
|
65
|
+
|
66
|
+
rubyforge_project:
|
67
|
+
rubygems_version: 1.4.1
|
68
|
+
signing_key:
|
69
|
+
specification_version: 3
|
70
|
+
summary: simple server backup tool
|
71
|
+
test_files: []
|
72
|
+
|