heroku-mongo-backup 0.1.0 → 0.1.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/lib/heroku_mongo_backup.rb +36 -35
- data/lib/heroku_mongo_backup/railtie.rb +12 -0
- data/lib/tasks/heroku_mongo_backup.rake +9 -7
- metadata +6 -5
data/lib/heroku_mongo_backup.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# encoding: UTF-8
|
2
2
|
|
3
3
|
require 'mongo'
|
4
4
|
require 'bson'
|
@@ -9,7 +9,9 @@ require 'yaml'
|
|
9
9
|
require 'rubygems'
|
10
10
|
require 's3'
|
11
11
|
|
12
|
-
module
|
12
|
+
module HerokuMongoBackup
|
13
|
+
require 'heroku_mongo_backup/railtie' if defined?(Rails)
|
14
|
+
|
13
15
|
class Backup
|
14
16
|
def chdir
|
15
17
|
Dir.chdir("tmp")
|
@@ -19,30 +21,30 @@ module Heroku::Mongo
|
|
19
21
|
end
|
20
22
|
Dir.chdir("dump")
|
21
23
|
end
|
22
|
-
|
24
|
+
|
23
25
|
def store
|
24
26
|
backup = {}
|
25
|
-
|
27
|
+
|
26
28
|
@db.collections.each do |col|
|
27
29
|
backup['system.indexes.db.name'] = col.db.name if col.name == "system.indexes"
|
28
|
-
|
30
|
+
|
29
31
|
records = []
|
30
|
-
|
32
|
+
|
31
33
|
col.find().each do |record|
|
32
34
|
records << record
|
33
35
|
end
|
34
36
|
|
35
37
|
backup[col.name] = records
|
36
38
|
end
|
37
|
-
|
39
|
+
|
38
40
|
marshal_dump = Marshal.dump(backup)
|
39
|
-
|
41
|
+
|
40
42
|
file = File.new(@file_name, 'w')
|
41
43
|
file = Zlib::GzipWriter.new(file)
|
42
44
|
file.write marshal_dump
|
43
45
|
file.close
|
44
46
|
end
|
45
|
-
|
47
|
+
|
46
48
|
def load
|
47
49
|
file = Zlib::GzipReader.open(@file_name)
|
48
50
|
obj = Marshal.load file.read
|
@@ -50,15 +52,15 @@ module Heroku::Mongo
|
|
50
52
|
|
51
53
|
obj.each do |col_name, records|
|
52
54
|
next if col_name =~ /^system\./
|
53
|
-
|
55
|
+
|
54
56
|
@db.drop_collection(col_name)
|
55
57
|
dest_col = @db.create_collection(col_name)
|
56
|
-
|
58
|
+
|
57
59
|
records.each do |record|
|
58
60
|
dest_col.insert record
|
59
61
|
end
|
60
62
|
end
|
61
|
-
|
63
|
+
|
62
64
|
# Load indexes here
|
63
65
|
col_name = "system.indexes"
|
64
66
|
dest_index_col = @db.collection(col_name)
|
@@ -69,65 +71,64 @@ module Heroku::Mongo
|
|
69
71
|
end
|
70
72
|
end
|
71
73
|
end
|
72
|
-
|
74
|
+
|
73
75
|
def connect
|
74
76
|
uri = URI.parse(@url)
|
75
77
|
connection = ::Mongo::Connection.new(uri.host, uri.port)
|
76
78
|
@db = connection.db(uri.path.gsub(/^\//, ''))
|
77
79
|
@db.authenticate(uri.user, uri.password) if uri.user
|
78
80
|
end
|
79
|
-
|
81
|
+
|
80
82
|
def s3_connect
|
81
|
-
bucket =
|
82
|
-
access_key_id = ENV['
|
83
|
-
secret_access_key = ENV['
|
83
|
+
bucket = ENV['S3_BUCKET']
|
84
|
+
access_key_id = ENV['S3_KEY_ID']
|
85
|
+
secret_access_key = ENV['S3_SECRET_KEY']
|
84
86
|
|
85
87
|
service = S3::Service.new(:access_key_id => access_key_id,
|
86
88
|
:secret_access_key => secret_access_key)
|
87
89
|
@bucket = service.buckets.find(bucket)
|
88
90
|
end
|
89
|
-
|
91
|
+
|
90
92
|
def s3_upload
|
91
93
|
object = @bucket.objects.build("backups/#{@file_name}")
|
92
94
|
object.content = open(@file_name)
|
93
95
|
object.save
|
94
96
|
end
|
95
|
-
|
97
|
+
|
96
98
|
def s3_download
|
97
99
|
open(@file_name, 'w') do |file|
|
98
100
|
object = @bucket.objects.find("backups/#{@file_name}")
|
99
101
|
file.write object.content
|
100
102
|
end
|
101
103
|
end
|
102
|
-
|
104
|
+
|
103
105
|
def initialize
|
104
|
-
# Backup settings
|
105
106
|
@file_name = Time.now.strftime("%Y-%m-%d_%H-%M-%S.gz")
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
@url =
|
115
|
-
|
107
|
+
|
108
|
+
if ENV[:RAILS_ENV] == 'production'
|
109
|
+
uri = YAML.load_file("config/mongoid.yml")['production']['uri']
|
110
|
+
else
|
111
|
+
config = YAML.load_file("config/mongoid.yml")['development']
|
112
|
+
uri = "mongodb://#{config['host']}:#{config['port']}/#{config['database']}"
|
113
|
+
end
|
114
|
+
|
115
|
+
@url = uri
|
116
|
+
|
116
117
|
puts "Using databased: #{@url}"
|
117
|
-
|
118
|
+
|
118
119
|
self.connect
|
119
120
|
self.s3_connect
|
120
121
|
end
|
121
|
-
|
122
|
+
|
122
123
|
def backup
|
123
124
|
self.chdir
|
124
125
|
self.store
|
125
126
|
self.s3_upload
|
126
127
|
end
|
127
|
-
|
128
|
+
|
128
129
|
def restore file_name
|
129
130
|
@file_name = file_name
|
130
|
-
|
131
|
+
|
131
132
|
self.chdir
|
132
133
|
self.s3_download
|
133
134
|
self.load
|
@@ -1,15 +1,17 @@
|
|
1
|
-
#
|
1
|
+
# encoding: UTF-8
|
2
2
|
|
3
3
|
namespace :mongo do
|
4
|
-
desc "
|
5
|
-
|
6
|
-
task :backup =>
|
7
|
-
|
4
|
+
desc "Backup prodution database and store it on S3.\n
|
5
|
+
Example of usage: rake mongo:backup"
|
6
|
+
task :backup => :environment do
|
7
|
+
HerokuMongoBackup::Backup.new.backup
|
8
8
|
end
|
9
9
|
|
10
|
-
|
10
|
+
desc "Restore command gets backup file from S3 server and pushes data to production db.\n
|
11
|
+
Example of usage: rake mongo:restore FILE=<backup-file.gz>"
|
12
|
+
task :restore => :environment do
|
11
13
|
if ENV['FILE']
|
12
|
-
|
14
|
+
HerokuMongoBackup::Backup.new.restore ENV['FILE']
|
13
15
|
else
|
14
16
|
puts "Please provide backup file to restore from. Thanks!"
|
15
17
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: heroku-mongo-backup
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2011-09-13 00:00:00.000000000Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &70358971982280 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70358971982280
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: mocha
|
27
|
-
requirement: &
|
27
|
+
requirement: &70358971981540 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,13 +32,14 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70358971981540
|
36
36
|
description: Rake task for backing up mongo database on heroku and push it to S3.
|
37
37
|
email: mail@alexkravets.com
|
38
38
|
executables: []
|
39
39
|
extensions: []
|
40
40
|
extra_rdoc_files: []
|
41
41
|
files:
|
42
|
+
- lib/heroku_mongo_backup/railtie.rb
|
42
43
|
- lib/heroku_mongo_backup.rb
|
43
44
|
- lib/tasks/heroku_mongo_backup.rake
|
44
45
|
homepage: https://github.com/alexkravets/heroku-mongo-backup
|