backup 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitignore +5 -0
- data/LICENSE +20 -0
- data/README.rdoc +237 -0
- data/Rakefile +59 -0
- data/VERSION +1 -0
- data/backup.gemspec +64 -0
- data/generators/backup_rake_tasks/backup_rake_tasks_generator.rb +56 -0
- data/generators/backup_rake_tasks/templates/README.rdoc +25 -0
- data/generators/backup_rake_tasks/templates/s3.rake +119 -0
- data/generators/backup_rake_tasks/templates/ssh.rake +114 -0
- data/lib/backup.rb +14 -0
- data/lib/backup/assets.rb +31 -0
- data/lib/backup/base.rb +46 -0
- data/lib/backup/connection/base.rb +13 -0
- data/lib/backup/connection/s3.rb +30 -0
- data/lib/backup/connection/ssh.rb +16 -0
- data/lib/backup/custom.rb +55 -0
- data/lib/backup/mysql.rb +38 -0
- data/lib/backup/sqlite3.rb +27 -0
- data/lib/backup/transfer/base.rb +13 -0
- data/lib/backup/transfer/s3.rb +30 -0
- data/lib/backup/transfer/ssh.rb +24 -0
- metadata +90 -0
data/.document
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 meskyanichi
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,237 @@
|
|
1
|
+
= Backup
|
2
|
+
|
3
|
+
Backup is a gem/plugin that enables you to very easily create backups and transfer these to Amazon S3 or another server using SSH.
|
4
|
+
It currently supports MySQL, SQLite3 and basic Assets (documents, images, etc) inside a folder. The files will get tar'd / gzip'd and get a timestamp-prefix.
|
5
|
+
After the backup file has been created, it can be transferred to either Amazon S3 or any remote server through SSH.
|
6
|
+
|
7
|
+
== Installation
|
8
|
+
|
9
|
+
=== Add Repository Source(s)
|
10
|
+
|
11
|
+
gem sources -a http://gemcutter.org
|
12
|
+
gem sources -a http://gems.github.com
|
13
|
+
|
14
|
+
=== Gem
|
15
|
+
|
16
|
+
# Gem Cutter
|
17
|
+
sudo gem install backup
|
18
|
+
|
19
|
+
# GitHub
|
20
|
+
sudo gem install meskyanichi-backup
|
21
|
+
|
22
|
+
=== Plugin
|
23
|
+
|
24
|
+
./script/plugin install git://github.com/meskyanichi/backup.git
|
25
|
+
|
26
|
+
|
27
|
+
=== Dependencies
|
28
|
+
|
29
|
+
# This will automatically install when installing the Backup gem.
|
30
|
+
# If you are using the Plugin, instead of the gem, be sure to install the aws-s3 gem.
|
31
|
+
sudo gem install aws-s3
|
32
|
+
|
33
|
+
|
34
|
+
== Getting started
|
35
|
+
|
36
|
+
Well, this is ridiculously easy to set up! So let's do this.
|
37
|
+
First install either the gem or plugin.
|
38
|
+
|
39
|
+
If you are using the gem version you "must" add the following line to your environment.rb file
|
40
|
+
|
41
|
+
==== config/environment.rb
|
42
|
+
|
43
|
+
# For GemCutter Version
|
44
|
+
config.gem "backup", :lib => "backup", :version => "0.1.0", :source => "http://gemcutter.org"
|
45
|
+
|
46
|
+
# For GitHub Version
|
47
|
+
config.gem "meskyanichi-backup", :lib => "backup", :version => "0.1.0", :source => "http://gems.github.com"
|
48
|
+
|
49
|
+
Once that's done, run the following command from the "root" of your Rails App
|
50
|
+
|
51
|
+
./script/generate backup_rake_tasks
|
52
|
+
|
53
|
+
|
54
|
+
This will generate two rake tasks and a README inside your "#{RAILS_ROOT}/lib/tasks/backup" folder.
|
55
|
+
- README.rdoc
|
56
|
+
- s3.rake
|
57
|
+
- ssh.rake
|
58
|
+
|
59
|
+
Open and read the README.rdoc if you want. It will explain everything very quickly, though, I doubt there is much to explain!
|
60
|
+
Then (or otherwise) open the "s3.rake" and "ssh.rake" rake task files. These include all the rake tasks/combinations that are (currently!) available.
|
61
|
+
Above each task inside these files is a description, explaining what you must do, again, "very" straight forward. Stupidly Easy to set up, thankfully!
|
62
|
+
|
63
|
+
After you've set up the tasks you wish to utilize (obviously you don't need to use all of them, you can simply just choose to use one of them),
|
64
|
+
they are all generated so you can basically just fill in the configuration values and be done with it. You obviously don't have to fill in the configuration
|
65
|
+
for any rake tasks you are not going to use.
|
66
|
+
|
67
|
+
That's it! So you have now done two things:
|
68
|
+
- Configured the Rake Files (just filled in the empty values)
|
69
|
+
- And at the same time, these are the executable rake tasks you will be using to create a backup
|
70
|
+
|
71
|
+
Just run one of the configured rake tasks to perform a backup!
|
72
|
+
|
73
|
+
== Example
|
74
|
+
|
75
|
+
So let me give an example of what one of these rake tasks will look like:
|
76
|
+
|
77
|
+
==== Rake Task for Backing up a Sqlite3 file to S3
|
78
|
+
|
79
|
+
task :sqlite3 => :environment do
|
80
|
+
Backup::Sqlite3.new({
|
81
|
+
:file => 'production.sqlite3',
|
82
|
+
|
83
|
+
:use => :s3,
|
84
|
+
:s3 => {
|
85
|
+
:access_key_id => 'your-s3-id',
|
86
|
+
:secret_access_key => 'your-s3-password',
|
87
|
+
:bucket => 'your-bucket-to-backup-to'
|
88
|
+
}
|
89
|
+
}).run
|
90
|
+
end
|
91
|
+
|
92
|
+
So this is one of the rake that's that the generator provides. Simple, isn't it?
|
93
|
+
Just fill in the values and run:
|
94
|
+
|
95
|
+
rake backup:s3:sqlite3
|
96
|
+
|
97
|
+
==== Rake Task for Backing up a Sqlite3 file to another server through SSH
|
98
|
+
|
99
|
+
task :sqlite3 => :environment do
|
100
|
+
Backup::Sqlite3.new({
|
101
|
+
:file => 'production.sqlite3',
|
102
|
+
|
103
|
+
:use => :ssh,
|
104
|
+
:ssh => {
|
105
|
+
:user => "root",
|
106
|
+
:ip => "123.45.678.90", # OR my-domain.com
|
107
|
+
:path => "/var/backups/etc"
|
108
|
+
}
|
109
|
+
}).run
|
110
|
+
end
|
111
|
+
|
112
|
+
Again, quick and easy. Now just execute this Backing/SSH transfer by running:
|
113
|
+
|
114
|
+
rake backing:ssh:sqlite3
|
115
|
+
|
116
|
+
|
117
|
+
See below what the requirements are when using S3 or SSH.
|
118
|
+
|
119
|
+
== Requirements
|
120
|
+
|
121
|
+
=== Using Amazon S3
|
122
|
+
|
123
|
+
This obviously requires you to have access to an Amazon S3 account.
|
124
|
+
These accounts are free and you only get charged for what you actually "use".
|
125
|
+
So no transfers = no cost. And aside of that, S3 is EXTREMELY cheap!
|
126
|
+
|
127
|
+
You can get an account here: http://aws.amazon.com/s3
|
128
|
+
|
129
|
+
Once you have an account you must install the AWS S3 gem, like so:
|
130
|
+
|
131
|
+
sudo gem install aws-s3
|
132
|
+
|
133
|
+
Backup makes use of the "aws-s3" gem to connect to Amazon S3. This is a dependency and will be installed when installing the Backup gem.
|
134
|
+
If you are using the plugin, you will need to manually install it.
|
135
|
+
|
136
|
+
=== Using SSH
|
137
|
+
|
138
|
+
If you're using SSH then there is one thing you must do. You must provide the machine that's going to "receive" your backups
|
139
|
+
your machine's (the senders) ssh-key. This is basically what you did with GitHub so you could push data to your GitHub repository
|
140
|
+
without getting prompted for a password.
|
141
|
+
|
142
|
+
=== Setting Up A Key For SSH
|
143
|
+
|
144
|
+
Setting up SSH Keychains is quite simple.
|
145
|
+
|
146
|
+
SSH to the "production" server and run the following command:
|
147
|
+
ssh-keygen -t rsa
|
148
|
+
|
149
|
+
It will prompt you 3 times, first it will ask what you wish to call the filename.
|
150
|
+
|
151
|
+
Just hit enter every time, do "not" fill in a password.
|
152
|
+
|
153
|
+
This will generate two files in the ~/.ssh/ directory, namely:
|
154
|
+
- id_rsa
|
155
|
+
- id_rsa.pub
|
156
|
+
|
157
|
+
So, now that the files are generated, holding the authorization keys, you can use these on any server you wish to login to without using a password.
|
158
|
+
The procedure accomplishing this is easy.
|
159
|
+
|
160
|
+
First, we will ensure there is a .ssh directory on the "backup" server by running the following command:
|
161
|
+
ssh root@your_ip mkdir -p .ssh
|
162
|
+
|
163
|
+
Once that's in place, we will append our newly (or already existing) key to the backup servers' .ssh/authorized_keys file.
|
164
|
+
cat ~/.ssh/id_rsa.pub | ssh root@server.com 'cat >> .ssh/authorized_keys'
|
165
|
+
|
166
|
+
Done. Now the key, generated on your "production" server, has been inserted inside the ".ssh/authorized_keys" file on the Backup server.
|
167
|
+
You should now be set to run all SSH rake tasks that have been configured to work with that particular Backup server.
|
168
|
+
|
169
|
+
==== Note: If the "authorized_keys" file does not yet exist, it will be automatically be created.
|
170
|
+
|
171
|
+
|
172
|
+
== Periodical Backups (using the "rake tasks" and a "cron")
|
173
|
+
|
174
|
+
Assuming you will want to run these backups (rake tasks) periodically.
|
175
|
+
What I currently use to run them is the "javan-whenever" gem. This is a very simple, easy to use gem
|
176
|
+
that makes it EXTREMELY simple to manage cron, using Ruby syntax. To understand what I mean, see the example below!
|
177
|
+
|
178
|
+
|
179
|
+
=== Javan's Whenever Gem Example
|
180
|
+
|
181
|
+
With this gem you can basically get periodic backup execution as easy as this:
|
182
|
+
|
183
|
+
every 2.hours do
|
184
|
+
rake "backup:s3:sqlite3"
|
185
|
+
end
|
186
|
+
|
187
|
+
Obviously this will update the crontab to make SQLite3 backups and store them on Amazon S3 every 2 hours.
|
188
|
+
If you want to do multiple backups, like perhaps backup your MySQL database, along with your assets:
|
189
|
+
|
190
|
+
every 2.hours do
|
191
|
+
rake "backup:s3:mysql"
|
192
|
+
rake "backup:s3:assets"
|
193
|
+
end
|
194
|
+
|
195
|
+
So yes, I highly recommend using the javan-whenever gem for this. It's very easy to write and maintain the crontab this way.
|
196
|
+
For more information on this gem and on how to use it: http://github.com/javan/whenever
|
197
|
+
Also, Ryan Bates has created a screencast for this gem, see it here: http://railscasts.com/episodes/164-cron-in-ruby
|
198
|
+
It's awesome, go check it out!
|
199
|
+
|
200
|
+
|
201
|
+
== Resources
|
202
|
+
|
203
|
+
So let me sum up the resources
|
204
|
+
|
205
|
+
==== My Backup Gem
|
206
|
+
sudo gem install backup
|
207
|
+
or
|
208
|
+
sudo gem install meskyanichi-backup
|
209
|
+
|
210
|
+
==== AWS-S3 Gem
|
211
|
+
sudo gem install aws-s3
|
212
|
+
|
213
|
+
==== Whenever Gem
|
214
|
+
sudo gem install javan-whenever
|
215
|
+
http://railscasts.com/episodes/164-cron-in-ruby
|
216
|
+
|
217
|
+
==== Amazon S3 Account Creation
|
218
|
+
http://aws.amazon.com/s3
|
219
|
+
|
220
|
+
|
221
|
+
==== Notes:
|
222
|
+
|
223
|
+
If you are going to use Amazon S3 to store your backups, be sure to install "AWS-S3".
|
224
|
+
|
225
|
+
If you want a nice and super easy way of managing the crontab and do periodical backups, install "Whenever".
|
226
|
+
|
227
|
+
Watch the Whenever Gem Screencast by Ryan Bates: http://railscasts.com/episodes/164-cron-in-ruby
|
228
|
+
|
229
|
+
|
230
|
+
== Requests
|
231
|
+
|
232
|
+
If anyone wishes to see support for PostgreSQL or any other database format, please send me a message!
|
233
|
+
|
234
|
+
|
235
|
+
== Copyright
|
236
|
+
|
237
|
+
Copyright (c) 2009 Michael van Rooijen | Final Creation. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "backup"
|
8
|
+
gem.summary = %Q{Backup is a gem/plugin that enables you to very easily create backups and transfer these to Amazon S3 or another server with SSH.}
|
9
|
+
gem.description = %Q{Backup is a gem/plugin that enables you to very easily create backups and transfer these to Amazon S3 or another server with SSH.
|
10
|
+
It currently supports MySQL, SQLite3 and basic Assets (documents, images, etc). The files will get tar'd / gzip'd and get a timestamp.
|
11
|
+
After creation, these files can be transferred to either Amazon S3 or any remote server through SSH.}
|
12
|
+
gem.email = "meskyan@gmail.com"
|
13
|
+
gem.homepage = "http://github.com/meskyanichi/backup"
|
14
|
+
gem.authors = ["meskyanichi"]
|
15
|
+
gem.add_dependency "aws-s3"
|
16
|
+
# gem.files.include 'generators/**/*'
|
17
|
+
# gem.files.include 'lib/**/*'
|
18
|
+
end
|
19
|
+
rescue LoadError
|
20
|
+
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
21
|
+
end
|
22
|
+
|
23
|
+
require 'rake/testtask'
|
24
|
+
Rake::TestTask.new(:test) do |test|
|
25
|
+
test.libs << 'lib' << 'test'
|
26
|
+
test.pattern = 'test/**/*_test.rb'
|
27
|
+
test.verbose = true
|
28
|
+
end
|
29
|
+
|
30
|
+
begin
|
31
|
+
require 'rcov/rcovtask'
|
32
|
+
Rcov::RcovTask.new do |test|
|
33
|
+
test.libs << 'test'
|
34
|
+
test.pattern = 'test/**/*_test.rb'
|
35
|
+
test.verbose = true
|
36
|
+
end
|
37
|
+
rescue LoadError
|
38
|
+
task :rcov do
|
39
|
+
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
task :test => :check_dependencies
|
44
|
+
|
45
|
+
task :default => :test
|
46
|
+
|
47
|
+
require 'rake/rdoctask'
|
48
|
+
Rake::RDocTask.new do |rdoc|
|
49
|
+
if File.exist?('VERSION')
|
50
|
+
version = File.read('VERSION')
|
51
|
+
else
|
52
|
+
version = ""
|
53
|
+
end
|
54
|
+
|
55
|
+
rdoc.rdoc_dir = 'rdoc'
|
56
|
+
rdoc.title = "backup #{version}"
|
57
|
+
rdoc.rdoc_files.include('README*')
|
58
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
59
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
data/backup.gemspec
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{backup}
|
8
|
+
s.version = "0.1.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["meskyanichi"]
|
12
|
+
s.date = %q{2009-10-03}
|
13
|
+
s.description = %q{Backup is a gem/plugin that enables you to very easily create backups and transfer these to Amazon S3 or another server with SSH.
|
14
|
+
It currently supports MySQL, SQLite3 and basic Assets (documents, images, etc). The files will get tar'd / gzip'd and get a timestamp.
|
15
|
+
After creation, these files can be transferred to either Amazon S3 or any remote server through SSH.}
|
16
|
+
s.email = %q{meskyan@gmail.com}
|
17
|
+
s.extra_rdoc_files = [
|
18
|
+
"LICENSE",
|
19
|
+
"README.rdoc"
|
20
|
+
]
|
21
|
+
s.files = [
|
22
|
+
".document",
|
23
|
+
".gitignore",
|
24
|
+
"LICENSE",
|
25
|
+
"README.rdoc",
|
26
|
+
"Rakefile",
|
27
|
+
"VERSION",
|
28
|
+
"backup.gemspec",
|
29
|
+
"generators/backup_rake_tasks/backup_rake_tasks_generator.rb",
|
30
|
+
"generators/backup_rake_tasks/templates/README.rdoc",
|
31
|
+
"generators/backup_rake_tasks/templates/s3.rake",
|
32
|
+
"generators/backup_rake_tasks/templates/ssh.rake",
|
33
|
+
"lib/backup.rb",
|
34
|
+
"lib/backup/assets.rb",
|
35
|
+
"lib/backup/base.rb",
|
36
|
+
"lib/backup/connection/base.rb",
|
37
|
+
"lib/backup/connection/s3.rb",
|
38
|
+
"lib/backup/connection/ssh.rb",
|
39
|
+
"lib/backup/custom.rb",
|
40
|
+
"lib/backup/mysql.rb",
|
41
|
+
"lib/backup/sqlite3.rb",
|
42
|
+
"lib/backup/transfer/base.rb",
|
43
|
+
"lib/backup/transfer/s3.rb",
|
44
|
+
"lib/backup/transfer/ssh.rb"
|
45
|
+
]
|
46
|
+
s.homepage = %q{http://github.com/meskyanichi/backup}
|
47
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
48
|
+
s.require_paths = ["lib"]
|
49
|
+
s.rubygems_version = %q{1.3.5}
|
50
|
+
s.summary = %q{Backup is a gem/plugin that enables you to very easily create backups and transfer these to Amazon S3 or another server with SSH.}
|
51
|
+
|
52
|
+
if s.respond_to? :specification_version then
|
53
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
54
|
+
s.specification_version = 3
|
55
|
+
|
56
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
57
|
+
s.add_runtime_dependency(%q<aws-s3>, [">= 0"])
|
58
|
+
else
|
59
|
+
s.add_dependency(%q<aws-s3>, [">= 0"])
|
60
|
+
end
|
61
|
+
else
|
62
|
+
s.add_dependency(%q<aws-s3>, [">= 0"])
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
class BackupRakeTasksGenerator < Rails::Generator::Base
|
2
|
+
|
3
|
+
# This method gets initialized when the generator gets run.
|
4
|
+
# It will receive an array of arguments inside @args
|
5
|
+
def initialize(runtime_args, runtime_options = {})
|
6
|
+
super
|
7
|
+
extract_args
|
8
|
+
set_defaults
|
9
|
+
confirm_input
|
10
|
+
end
|
11
|
+
|
12
|
+
# Processes the file generation/templating
|
13
|
+
# This will automatically be run after the initialize method
|
14
|
+
def manifest
|
15
|
+
record do |m|
|
16
|
+
m.directory "lib/tasks/"
|
17
|
+
m.directory "lib/tasks/backup"
|
18
|
+
m.file "README.rdoc", "lib/tasks/backup/README.rdoc"
|
19
|
+
m.file "s3.rake", "lib/tasks/backup/s3.rake"
|
20
|
+
m.file "ssh.rake", "lib/tasks/backup/ssh.rake"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# Creates a new Hash Object containing the user input
|
25
|
+
# The user input will be available through @input and input
|
26
|
+
def extract_args
|
27
|
+
@input = Hash.new
|
28
|
+
@args.each do |arg|
|
29
|
+
if arg.include?(":") then
|
30
|
+
@input[:"#{arg.slice(0, arg.index(":"))}"] = arg.slice((arg.index(":") + 1)..-1)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# Input Method that's available inside the generated templates
|
36
|
+
# because instance variable are not available, so we access them through methods
|
37
|
+
def input
|
38
|
+
@input
|
39
|
+
end
|
40
|
+
|
41
|
+
# Sets defaults for user input when left blank by the user
|
42
|
+
# for each parameter
|
43
|
+
def set_defaults
|
44
|
+
end
|
45
|
+
|
46
|
+
# Confirms whether the model and attachment arguments were passed in
|
47
|
+
# Raises an error if not
|
48
|
+
def confirm_input
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def input_error
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
* Backup's Generated Rake Tasks
|
2
|
+
http://github.com/meskyanichi/backup
|
3
|
+
|
4
|
+
Quite simple, the generator has now generated all (currently!) possible backup options in the form of rake tasks!
|
5
|
+
Just open the desired backup-method's file (S3 or SHH or BOTH!). The basic structure of every task is already setup correctly.
|
6
|
+
Above each task you will find a description about the settings of each task. Please be sure to read this first before asking questions.
|
7
|
+
|
8
|
+
All in all this is extremely straight forward, there is no need to setup anything else inside your Rails Application other than installing the plugin,
|
9
|
+
running (this) generator and changing the values inside the rake task files.
|
10
|
+
|
11
|
+
Here is a list of the current rake tasks that are available:
|
12
|
+
|
13
|
+
backup:s3:mysql
|
14
|
+
backup:s3:sqlite3
|
15
|
+
backup:s3:assets
|
16
|
+
backup:s3:custom
|
17
|
+
backup:ssh:mysql
|
18
|
+
backup:ssh:sqlite3
|
19
|
+
backup:ssh:assets
|
20
|
+
backup:ssh:custom
|
21
|
+
|
22
|
+
|
23
|
+
So now you have rake tasks for all your essential backups.
|
24
|
+
What I like to do is use a cronjob manager gem to manage my cronjobs to trigger these rake tasks.
|
25
|
+
javan-whenever is a good gem for doing this! Try it, or any other method you can think of to trigger these rake tasks periodically.
|
@@ -0,0 +1,119 @@
|
|
1
|
+
namespace :backup do
|
2
|
+
namespace :s3 do
|
3
|
+
|
4
|
+
# => rake backup:s3:mysql
|
5
|
+
# Fill in your mysql credentials to allow Backup to create a mysql dump, and which database to make a dump from.
|
6
|
+
# Specify that you want to use :s3
|
7
|
+
# Fill in your Amazon S3 Account's Credentials (access_key_id, secret_access_key)
|
8
|
+
# Specify which bucket you wish to store your files to.
|
9
|
+
# If you wish to put specific files in subfolders inside the bucket, you may do so by doing something like this:
|
10
|
+
# :bucket => "my_bucket/subfolder1/subfolder2" etc.
|
11
|
+
task :mysql => :environment do
|
12
|
+
Backup::Mysql.new({
|
13
|
+
:mysql => {
|
14
|
+
:user => "",
|
15
|
+
:password => "",
|
16
|
+
:database => ""
|
17
|
+
},
|
18
|
+
|
19
|
+
:use => :s3,
|
20
|
+
:s3 => {
|
21
|
+
:access_key_id => '',
|
22
|
+
:secret_access_key => '',
|
23
|
+
:bucket => 'mybucket/backups/etc'
|
24
|
+
}
|
25
|
+
}).run
|
26
|
+
end
|
27
|
+
|
28
|
+
# => rake backup:s3:sqlite3
|
29
|
+
# Specify which sqlite3 file you wish to back up. This will generally be "production.sqlite3". (and this is the default, so you can remove the :file attribute if it is)
|
30
|
+
# Specify that you want to use :s3
|
31
|
+
# Fill in your Amazon S3 Account's Credentials (access_key_id, secret_access_key)
|
32
|
+
# Specify which bucket you wish to store your files to.
|
33
|
+
# If you wish to put specific files in subfolders inside the bucket, you may do so by doing something like this:
|
34
|
+
# :bucket => "my_bucket/subfolder1/subfolder2" etc.
|
35
|
+
task :sqlite3 => :environment do
|
36
|
+
Backup::Sqlite3.new({
|
37
|
+
:file => 'production.sqlite3', # "production.sqlite3" is default, can remove the whole :file attribute or change it's value
|
38
|
+
|
39
|
+
:use => :s3,
|
40
|
+
:s3 => {
|
41
|
+
:access_key_id => '',
|
42
|
+
:secret_access_key => '',
|
43
|
+
:bucket => 'mybucket/backups/etc'
|
44
|
+
}
|
45
|
+
}).run
|
46
|
+
end
|
47
|
+
|
48
|
+
# => rake backup:s3:assets
|
49
|
+
# Specify which directory (:path) (and all it's underlaying files and folders) you wish to backup.
|
50
|
+
# Specify that you want to use :s3
|
51
|
+
# Fill in your Amazon S3 Account's Credentials (access_key_id, secret_access_key)
|
52
|
+
# Specify which bucket you wish to store your files to.
|
53
|
+
# If you wish to put specific files in subfolders inside the bucket, you may do so by doing something like this:
|
54
|
+
# :bucket => "my_bucket/subfolder1/subfolder2" etc.
|
55
|
+
task :assets => :environment do
|
56
|
+
Backup::Assets.new({
|
57
|
+
:path => "#{RAILS_ROOT}/public/assets",
|
58
|
+
|
59
|
+
:use => :s3,
|
60
|
+
:s3 => {
|
61
|
+
:access_key_id => '',
|
62
|
+
:secret_access_key => '',
|
63
|
+
:bucket => 'mybucket/backups/etc'
|
64
|
+
}
|
65
|
+
}).run
|
66
|
+
end
|
67
|
+
|
68
|
+
# => rake backup:s3:custom
|
69
|
+
# This is a more complex implementation of the Backup gem.
|
70
|
+
# Might you be using a database type that is currently not supported, then you can manually create an SQL dump
|
71
|
+
# using the :command attribute. This will take either a single string, or an array of strings, depending on how many
|
72
|
+
# commands you wish to execute.
|
73
|
+
#
|
74
|
+
# Single Command
|
75
|
+
# :command => "my command"
|
76
|
+
# Multiple Commands
|
77
|
+
# :command => ["my command 1", "my command 2", "my command 3"] etc.
|
78
|
+
#
|
79
|
+
# This means you have full control over where the sql dump should be placed. But, depending on your decision, you must
|
80
|
+
# set the correct path to the file(s) (sql dumps) that have been generated.
|
81
|
+
#
|
82
|
+
# Path To File(s) Directory
|
83
|
+
# :path => "#{RAILS_ROOT}/db"
|
84
|
+
#
|
85
|
+
# Finally, you must specify which file(s) should be backed up.
|
86
|
+
# The :file attribute can take either a single string, or an array of strings to add multiple files.
|
87
|
+
#
|
88
|
+
# Select a single file to backup from the :path directory you specified
|
89
|
+
# :file => "foobar1.sql"
|
90
|
+
# Select multiple files to backup from the :path directory you specified
|
91
|
+
# :file => ["foobar1.sql", "foobar2.sql"] etc
|
92
|
+
#
|
93
|
+
# When you specify you would like to backup multiple files, it will automatically archive these as a "tar" for you and then compress it.
|
94
|
+
#
|
95
|
+
# By default, after the backup has been pushed to S3, it will remove the original files (created from your :command attribute)
|
96
|
+
# If you wish to keep these files, then add the following line:
|
97
|
+
# :keep_original_files => true
|
98
|
+
# This is set to 'false' by default, as you most likely don't want to keep these files on your production server.
|
99
|
+
#
|
100
|
+
# Just use the ":use => :s3" as usual to tell it you would like to back up these files using S3.
|
101
|
+
# And then, like in the example below, provide the S3 credentials/details to be able to connect to the server you wish to back these files up to.
|
102
|
+
task :custom => :environment do
|
103
|
+
Backup::Custom.new({
|
104
|
+
:command => ["mysqldump --quick -u root --password='' foobar > #{RAILS_ROOT}/db/foobar1.sql",
|
105
|
+
"mysqldump --quick -u root --password='' foobar > #{RAILS_ROOT}/db/foobar2.sql"],
|
106
|
+
|
107
|
+
:path => "#{RAILS_ROOT}/db",
|
108
|
+
:file => ["foobar1.sql","foobar2.sql"],
|
109
|
+
|
110
|
+
:use => :s3,
|
111
|
+
:s3 => {
|
112
|
+
:access_key_id => '',
|
113
|
+
:secret_access_key => '',
|
114
|
+
:bucket => 'mybucket/backups/etc'
|
115
|
+
}
|
116
|
+
}).run
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
namespace :backup do
|
2
|
+
namespace :ssh do
|
3
|
+
|
4
|
+
# => rake backup:ssh:mysql
|
5
|
+
# Fill in your mysql credentials to allow Backup to create a mysql dump, and which database to make a dump from.
|
6
|
+
# Specify that you want to use :ssh
|
7
|
+
# Specify what user should connect through SSH, to what address (be it IP or an URL) and the absolute path on the backup-server
|
8
|
+
# to where Backup should store the backups.
|
9
|
+
task :mysql => :environment do
|
10
|
+
Backup::Mysql.new({
|
11
|
+
:mysql => {
|
12
|
+
:user => "",
|
13
|
+
:password => "",
|
14
|
+
:database => ""
|
15
|
+
},
|
16
|
+
|
17
|
+
:use => :ssh,
|
18
|
+
:ssh => {
|
19
|
+
:user => "root",
|
20
|
+
:ip => "mydomain.com", # or: 123.45.678.90
|
21
|
+
:path => "/var/backups/etc"
|
22
|
+
}
|
23
|
+
}).run
|
24
|
+
end
|
25
|
+
|
26
|
+
# => rake backup:ssh:sqlite3
|
27
|
+
# Specify which sqlite3 file you wish to back up. This will generally be "production.sqlite3". (and this is the default, so you can remove the :file attribute if it is)
|
28
|
+
# If your sqlite3 file is not located inside the #{RAILS_ROOT}/db folder, then add a :path => "#{RAILS_ROOT}/path/to/db/folder"
|
29
|
+
# Specify that you want to use :ssh
|
30
|
+
# Specify what user should connect through SSH, to what address (be it IP or an URL) and the absolute path on the backup-server
|
31
|
+
# to where Backup should store the backups.
|
32
|
+
task :sqlite3 => :environment do
|
33
|
+
Backup::Sqlite3.new({
|
34
|
+
:file => 'production.sqlite3', # "production.sqlite3" is default, can remove the whole :file attribute or change it's value
|
35
|
+
|
36
|
+
:use => :ssh,
|
37
|
+
:ssh => {
|
38
|
+
:user => "root",
|
39
|
+
:ip => "mydomain.com", # or: 123.45.678.90
|
40
|
+
:path => "/var/backups/etc"
|
41
|
+
}
|
42
|
+
}).run
|
43
|
+
end
|
44
|
+
|
45
|
+
# => rake backup:ssh:assets
|
46
|
+
# Specify which directory (:path) (and all it's underlaying files and folders) you wish to backup.
|
47
|
+
# Specify that you want to use :ssh
|
48
|
+
# Specify what user should connect through SSH, to what address (be it IP or an URL) and the absolute path on the backup-server
|
49
|
+
# to where Backup should store the backups.
|
50
|
+
task :assets => :environment do
|
51
|
+
Backup::Assets.new({
|
52
|
+
:path => "#{RAILS_ROOT}/public/assets",
|
53
|
+
|
54
|
+
:use => :ssh,
|
55
|
+
:ssh => {
|
56
|
+
:user => "root",
|
57
|
+
:ip => "mydomain.com", # or: 123.45.678.90
|
58
|
+
:path => "/var/backups/etc"
|
59
|
+
}
|
60
|
+
}).run
|
61
|
+
end
|
62
|
+
|
63
|
+
# => rake backup:ssh:custom
|
64
|
+
# This is a more complex implementation of the Backup gem.
|
65
|
+
# Might you be using a database type that is currently not supported, then you can manually create an SQL dump
|
66
|
+
# using the :command attribute. This will take either a single string, or an array of strings, depending on how many
|
67
|
+
# commands you wish to execute.
|
68
|
+
#
|
69
|
+
# Single Command
|
70
|
+
# :command => "my command"
|
71
|
+
# Multiple Commands
|
72
|
+
# :command => ["my command 1", "my command 2", "my command 3"] etc.
|
73
|
+
#
|
74
|
+
# This means you have full control over where the sql dump should be placed. But, depending on your decision, you must
|
75
|
+
# set the correct path to the file(s) (sql dumps) that have been generated.
|
76
|
+
#
|
77
|
+
# Path To File(s) Directory
|
78
|
+
# :path => "#{RAILS_ROOT}/db"
|
79
|
+
#
|
80
|
+
# Finally, you must specify which file(s) should be backed up.
|
81
|
+
# The :file attribute can take either a single string, or an array of strings to add multiple files.
|
82
|
+
#
|
83
|
+
# Select a single file to backup from the :path directory you specified
|
84
|
+
# :file => "foobar1.sql"
|
85
|
+
# Select multiple files to backup from the :path directory you specified
|
86
|
+
# :file => ["foobar1.sql", "foobar2.sql"] etc
|
87
|
+
#
|
88
|
+
# When you specify you would like to backup multiple files, it will automatically archive these as a "tar" for you and then compress it.
|
89
|
+
#
|
90
|
+
# By default, after the backup has been pushed to your backup server using SSH, it will remove the original files (created from your :command attribute)
|
91
|
+
# If you wish to keep these files, then add the following line:
|
92
|
+
# :keep_original_files => true
|
93
|
+
# This is set to 'false' by default, as you most likely don't want to keep these files on your production server.
|
94
|
+
#
|
95
|
+
# Just use the ":use => :ssh" as usual to tell it you would like to back up these files using SSH.
|
96
|
+
# And then, like in the example below, provide the SSH details to be able to connect to the server you wish to back these files up to.
|
97
|
+
task :custom => :environment do
|
98
|
+
Backup::Custom.new({
|
99
|
+
:command => ["mysqldump --quick -u root --password='' foobar > #{RAILS_ROOT}/db/foobar1.sql",
|
100
|
+
"mysqldump --quick -u root --password='' foobar > #{RAILS_ROOT}/db/foobar2.sql"],
|
101
|
+
|
102
|
+
:path => "#{RAILS_ROOT}/db",
|
103
|
+
:file => ["foobar1.sql", "foobar2.sql"],
|
104
|
+
|
105
|
+
:use => :ssh,
|
106
|
+
:ssh => {
|
107
|
+
:user => "root",
|
108
|
+
:ip => "mydomain.com", # or: 123.45.678.90
|
109
|
+
:path => "/var/backups/etc"
|
110
|
+
}
|
111
|
+
}).run
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
data/lib/backup.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'backup/base'
|
2
|
+
require 'backup/sqlite3'
|
3
|
+
require 'backup/mysql'
|
4
|
+
require 'backup/assets'
|
5
|
+
require 'backup/custom'
|
6
|
+
require 'backup/transfer/base'
|
7
|
+
require 'backup/transfer/s3'
|
8
|
+
require 'backup/transfer/ssh'
|
9
|
+
require 'backup/connection/base'
|
10
|
+
require 'backup/connection/s3'
|
11
|
+
require 'backup/connection/ssh'
|
12
|
+
|
13
|
+
module Backup
|
14
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Backup
|
2
|
+
class Assets < Backup::Base
|
3
|
+
|
4
|
+
def initialize(options = {})
|
5
|
+
super(default_options.merge(options))
|
6
|
+
setup_paths("assets/#{self.class.name.downcase.gsub('::','-')}", 'tar.gz')
|
7
|
+
end
|
8
|
+
|
9
|
+
def run
|
10
|
+
archive
|
11
|
+
compress
|
12
|
+
transfer
|
13
|
+
remove_temp_files
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def archive
|
19
|
+
%x{ tar -cf #{File.join(options[:backup_path], options[:backup_file])} #{options[:path]} }
|
20
|
+
end
|
21
|
+
|
22
|
+
def compress
|
23
|
+
%x{ gzip --best #{File.join(options[:backup_path], options[:backup_file])} }
|
24
|
+
end
|
25
|
+
|
26
|
+
def default_options
|
27
|
+
{ :path => "#{RAILS_ROOT}/public/assets", :file => "assets" }
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
data/lib/backup/base.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
module Backup
|
2
|
+
class Base
|
3
|
+
|
4
|
+
attr_accessor :options, :backup_time
|
5
|
+
|
6
|
+
def initialize(options = {})
|
7
|
+
self.options = options
|
8
|
+
self.backup_time = Time.now.strftime("%Y%m%d%H%M%S")
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def setup_paths(path, type = nil)
|
14
|
+
%x{ mkdir -p #{RAILS_ROOT}/tmp/backups/#{path} }
|
15
|
+
options[:backup_path] = "#{RAILS_ROOT}/tmp/backups/#{path}"
|
16
|
+
|
17
|
+
if options[:file].is_a?(Array)
|
18
|
+
options[:backup_file] = "#{backup_time}-#{options[:file].first}.#{type}"
|
19
|
+
else
|
20
|
+
options[:backup_file] = "#{backup_time}-#{options[:file]}.#{type}"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def transfer
|
25
|
+
case options[:use]
|
26
|
+
when :s3 then Backup::Transfer::S3.new(options)
|
27
|
+
when :ssh then Backup::Transfer::SSH.new(options)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def remove_temp_files
|
32
|
+
%x{ rm #{File.join(options[:backup_path], "*")} }
|
33
|
+
end
|
34
|
+
|
35
|
+
def remove_original_file
|
36
|
+
if options[:file].is_a?(Array)
|
37
|
+
options[:file].each do |file|
|
38
|
+
%x{ rm #{File.join(options[:path], file)} }
|
39
|
+
end
|
40
|
+
else
|
41
|
+
%x{ rm #{File.join(options[:path], options[:file])} }
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Backup
|
2
|
+
module Connection
|
3
|
+
class S3 < Backup::Connection::Base
|
4
|
+
|
5
|
+
def initialize(options = {})
|
6
|
+
super(options)
|
7
|
+
end
|
8
|
+
|
9
|
+
def connect
|
10
|
+
AWS::S3::Base.establish_connection!(
|
11
|
+
:access_key_id => options[:s3][:access_key_id],
|
12
|
+
:secret_access_key => options[:s3][:secret_access_key]
|
13
|
+
)
|
14
|
+
end
|
15
|
+
|
16
|
+
def service
|
17
|
+
AWS::S3::Service
|
18
|
+
end
|
19
|
+
|
20
|
+
def bucket
|
21
|
+
AWS::S3::Bucket
|
22
|
+
end
|
23
|
+
|
24
|
+
def object
|
25
|
+
AWS::S3::S3Object
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Backup
|
2
|
+
module Connection
|
3
|
+
class SSH < Backup::Connection::Base
|
4
|
+
|
5
|
+
def initialize(options = {})
|
6
|
+
super(options)
|
7
|
+
end
|
8
|
+
|
9
|
+
def store
|
10
|
+
%x{ ssh #{options[:ssh][:user]}@#{options[:ssh][:ip]} mkdir -p #{options[:ssh][:path]} }
|
11
|
+
%x{ scp #{File.join(options[:backup_path], options[:backup_file])} #{options[:ssh][:user]}@#{options[:ssh][:ip]}:#{options[:ssh][:path]} }
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Backup
|
2
|
+
class Custom < Backup::Base
|
3
|
+
|
4
|
+
def initialize(options = {})
|
5
|
+
super(default_options.merge(options))
|
6
|
+
setup_paths("db/#{self.class.name.downcase.gsub('::','-')}", options[:file].is_a?(Array) ? 'tar.gz' : 'gz')
|
7
|
+
end
|
8
|
+
|
9
|
+
def run
|
10
|
+
command
|
11
|
+
archive
|
12
|
+
compress
|
13
|
+
transfer
|
14
|
+
remove_temp_files
|
15
|
+
remove_original_file unless options[:keep_original_files].eql?(true)
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def command
|
21
|
+
if options[:command].is_a?(Array)
|
22
|
+
options[:command].each do |command|
|
23
|
+
%x{ #{command} }
|
24
|
+
end
|
25
|
+
else
|
26
|
+
%x{ #{options[:command]} }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def archive
|
31
|
+
if options[:file].is_a?(Array)
|
32
|
+
files = options[:file].map {|file| File.join(options[:path], file)}
|
33
|
+
%x{ tar -cf #{File.join(options[:backup_path], options[:backup_file])} #{files.join(' ')} }
|
34
|
+
else
|
35
|
+
%x{ tar -cf #{File.join(options[:backup_path], options[:backup_file])} #{File.join(options[:path], options[:file])} }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def compress
|
40
|
+
if options[:file].is_a?(Array)
|
41
|
+
%x{ gzip --best #{File.join(options[:backup_path], options[:backup_file])} }
|
42
|
+
else
|
43
|
+
%x{ gzip -cv #{File.join(options[:path], options[:file])} --best > #{File.join(options[:backup_path], options[:backup_file])} }
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def default_options
|
48
|
+
{ :path => "",
|
49
|
+
:file => "",
|
50
|
+
:command => "",
|
51
|
+
:keep_original_files => false }
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
data/lib/backup/mysql.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
module Backup
|
2
|
+
class Mysql < Backup::Base
|
3
|
+
|
4
|
+
def initialize(options = {})
|
5
|
+
super(default_options.merge(options))
|
6
|
+
setup_paths("db/#{self.class.name.downcase.gsub('::','-')}", :gz)
|
7
|
+
end
|
8
|
+
|
9
|
+
def run
|
10
|
+
make_mysql_dump
|
11
|
+
compress
|
12
|
+
transfer
|
13
|
+
remove_temp_files
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def compress
|
19
|
+
%x{ gzip -cv #{File.join(options[:path], options[:file])} --best > #{File.join(options[:backup_path], options[:backup_file])} }
|
20
|
+
end
|
21
|
+
|
22
|
+
def make_mysql_dump
|
23
|
+
# => /usr/local/mysql/bin/mysqldump on Mac OS X 10.6
|
24
|
+
%x{ mysqldump --quick -u #{options[:mysql][:user]} --password='#{options[:mysql][:password]}' #{options[:mysql][:database]} > #{File.join(options[:path], options[:file])} }
|
25
|
+
end
|
26
|
+
|
27
|
+
def default_options
|
28
|
+
{:path => "#{RAILS_ROOT}/tmp/backups/db/#{self.class.name.downcase.gsub('::','-')}",
|
29
|
+
:file => "production.sql",
|
30
|
+
:mysql => {
|
31
|
+
:user => "",
|
32
|
+
:password => "",
|
33
|
+
:database => ""
|
34
|
+
}}
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Backup
|
2
|
+
class Sqlite3 < Backup::Base
|
3
|
+
|
4
|
+
def initialize(options = {})
|
5
|
+
super(default_options.merge(options))
|
6
|
+
setup_paths("db/#{self.class.name.downcase.gsub('::','-')}", :gz)
|
7
|
+
end
|
8
|
+
|
9
|
+
def run
|
10
|
+
compress
|
11
|
+
transfer
|
12
|
+
remove_temp_files
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def compress
|
18
|
+
%x{ gzip -cv #{File.join(options[:path], options[:file])} --best > #{File.join(options[:backup_path], options[:backup_file])} }
|
19
|
+
end
|
20
|
+
|
21
|
+
def default_options
|
22
|
+
{ :path => "#{RAILS_ROOT}/db",
|
23
|
+
:file => "production.sqlite3" }
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'aws/s3'
|
2
|
+
|
3
|
+
module Backup
|
4
|
+
module Transfer
|
5
|
+
class S3 < Backup::Transfer::Base
|
6
|
+
|
7
|
+
def initialize(options)
|
8
|
+
super(default_options.merge(options))
|
9
|
+
|
10
|
+
s3 = Backup::Connection::S3.new(options)
|
11
|
+
s3.connect
|
12
|
+
s3.object.store(
|
13
|
+
options[:backup_file],
|
14
|
+
open(File.join(options[:backup_path], options[:backup_file])),
|
15
|
+
options[:s3][:bucket] )
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def default_options
|
21
|
+
{:s3 => {
|
22
|
+
:access_key_id => '',
|
23
|
+
:secret_access_key => '',
|
24
|
+
:bucket => ''
|
25
|
+
}}
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Backup
|
2
|
+
module Transfer
|
3
|
+
class SSH < Backup::Transfer::Base
|
4
|
+
|
5
|
+
def initialize(options)
|
6
|
+
super(default_options.merge(options))
|
7
|
+
|
8
|
+
ssh = Backup::Connection::SSH.new(options)
|
9
|
+
ssh.store
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def default_options
|
15
|
+
{:ssh => {
|
16
|
+
:user => "",
|
17
|
+
:ip => "",
|
18
|
+
:path => "/var/backups/"
|
19
|
+
}}
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
metadata
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: backup
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- meskyanichi
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-10-03 00:00:00 +02:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: aws-s3
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0"
|
24
|
+
version:
|
25
|
+
description: |-
|
26
|
+
Backup is a gem/plugin that enables you to very easily create backups and transfer these to Amazon S3 or another server with SSH.
|
27
|
+
It currently supports MySQL, SQLite3 and basic Assets (documents, images, etc). The files will get tar'd / gzip'd and get a timestamp.
|
28
|
+
After creation, these files can be transferred to either Amazon S3 or any remote server through SSH.
|
29
|
+
email: meskyan@gmail.com
|
30
|
+
executables: []
|
31
|
+
|
32
|
+
extensions: []
|
33
|
+
|
34
|
+
extra_rdoc_files:
|
35
|
+
- LICENSE
|
36
|
+
- README.rdoc
|
37
|
+
files:
|
38
|
+
- .document
|
39
|
+
- .gitignore
|
40
|
+
- LICENSE
|
41
|
+
- README.rdoc
|
42
|
+
- Rakefile
|
43
|
+
- VERSION
|
44
|
+
- backup.gemspec
|
45
|
+
- generators/backup_rake_tasks/backup_rake_tasks_generator.rb
|
46
|
+
- generators/backup_rake_tasks/templates/README.rdoc
|
47
|
+
- generators/backup_rake_tasks/templates/s3.rake
|
48
|
+
- generators/backup_rake_tasks/templates/ssh.rake
|
49
|
+
- lib/backup.rb
|
50
|
+
- lib/backup/assets.rb
|
51
|
+
- lib/backup/base.rb
|
52
|
+
- lib/backup/connection/base.rb
|
53
|
+
- lib/backup/connection/s3.rb
|
54
|
+
- lib/backup/connection/ssh.rb
|
55
|
+
- lib/backup/custom.rb
|
56
|
+
- lib/backup/mysql.rb
|
57
|
+
- lib/backup/sqlite3.rb
|
58
|
+
- lib/backup/transfer/base.rb
|
59
|
+
- lib/backup/transfer/s3.rb
|
60
|
+
- lib/backup/transfer/ssh.rb
|
61
|
+
has_rdoc: true
|
62
|
+
homepage: http://github.com/meskyanichi/backup
|
63
|
+
licenses: []
|
64
|
+
|
65
|
+
post_install_message:
|
66
|
+
rdoc_options:
|
67
|
+
- --charset=UTF-8
|
68
|
+
require_paths:
|
69
|
+
- lib
|
70
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: "0"
|
75
|
+
version:
|
76
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
77
|
+
requirements:
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: "0"
|
81
|
+
version:
|
82
|
+
requirements: []
|
83
|
+
|
84
|
+
rubyforge_project:
|
85
|
+
rubygems_version: 1.3.5
|
86
|
+
signing_key:
|
87
|
+
specification_version: 3
|
88
|
+
summary: Backup is a gem/plugin that enables you to very easily create backups and transfer these to Amazon S3 or another server with SSH.
|
89
|
+
test_files: []
|
90
|
+
|