heroku_cloud_backup 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -14,7 +14,7 @@ If you want this to run daily, you'll need to enable the Heroku cron addon:
14
14
 
15
15
  heroku addons:add cron:daily
16
16
 
17
- For Rails 3.0 and later, add this to your Gemfile:
17
+ For Rails 3 and later, add this to your Gemfile:
18
18
 
19
19
  gem 'heroku_backup_task'
20
20
  gem 'heroku_cloud_backup'
@@ -27,42 +27,53 @@ For Rails 2.1 and later, add this to your in your environment.rb:
27
27
  In your Rakefile:
28
28
 
29
29
  require "heroku_backup_task"
30
+ require "heroku_cloud_backup"
30
31
  task :cron do
31
32
  HerokuBackupTask.execute
32
- HerokuCloudBackupTask.execute
33
+ HerokuCloudBackup.execute
33
34
  end
34
35
 
35
36
  ## Usage
36
37
 
37
38
  The first thing you'll want to do is configure the addon.
38
39
 
39
- HCB_PROVIDERS (aws, rackspace, google) - Add which providers you're using. Accepts a comma delimited value with each provider so you can store backups in more than 1 provider. **Required**
40
+ HCB_PROVIDER (aws, rackspace, google) - Add which provider you're using. **Required**
40
41
 
41
- heroku config:add HCB_PROVIDERS='aws' # or 'aws, google, rackspace'
42
+ heroku config:add HCB_PROVIDER='aws' # or 'google' or 'rackspace'
42
43
 
43
- HCB_BUCKET (Defaults to "[APP NAME]-heroku-backups") - Select a bucket name to upload to. This the bucket or root directory that your files will be stored in. **Optional**
44
+ HCB_BUCKET (alphanumberic characters, dashes, period, underscore are allowed, between 3 and 255 characters long) - Select a bucket name to upload to. This the bucket or root directory that your files will be stored in. If the bucket doesn't exist, it will be created. **Required**
44
45
 
45
46
  heroku config:add HCB_BUCKET='mywebsite'
46
47
 
47
- HCB_PREFIX (Defaults to "db") - The direction prefix for where the backups are stored. This is so you can store your backups within a specific sub directory within the bucket. **Optional**
48
+ HCB_PREFIX (Defaults to "db") - The direction prefix for where the backups are stored. This is so you can store your backups within a specific sub directory within the bucket. heroku_cloud_backup will also append the ENV var of the database to the path, so you can backup multiple databases, by their ENV names. **Optional**
48
49
 
49
50
  heroku config:add HCB_PREFIX='backups/pg'
50
51
 
51
- HCB_MAX_BACKUPS (Defaults to no limit) - The number of backups to store before the script will prune out older backups. A value of 10 will allow you to store 10 of the most recent backups. Newer backups will replace older ones. **Optional**
52
+ HCB_MAX (Defaults to no limit) - The number of backups to store before the script will prune out older backups. A value of 10 will allow you to store 10 of the most recent backups. Newer backups will replace older ones. **Optional**
52
53
 
53
- heroku config:add HCB_MAX_BACKUPS=10
54
+ heroku config:add HCB_MAX=10
54
55
 
55
- Depending on which providers you specify, you'll need to provide login credentials.
56
+ Depending on which provider you specify, you'll need to provide different login credentials.
56
57
 
57
- Currently, only Amazon Web Services is supported.
58
+ For Amazon:
58
59
 
59
- heroku config:add HCB_AWS_ACCESS_KEY_ID="your_access_key"
60
- heroku config:add HCB_AWS_SECRET_ACCESS_KEY="your_secret"
60
+ heroku config:add HCB_KEY1="aws_access_key_id"
61
+ heroku config:add HCB_KEY2="aws_secret_access_key"
62
+
63
+ For Rackspace:
64
+
65
+ heroku config:add HCB_KEY1="rackspace_username"
66
+ heroku config:add HCB_KEY2="rackspace_api_key"
67
+
68
+ For Google Storage:
69
+
70
+ heroku config:add HCB_KEY1="google_storage_secret_access_key"
71
+ heroku config:add HCB_KEY2="google_storage_access_key_id"
61
72
 
62
73
  You can run this manually like this:
63
74
 
64
- rake heroku_backup
65
- rake heroku:cloud_backup
75
+ heroku rake heroku_backup
76
+ heroku rake heroku:cloud_backup
66
77
 
67
78
  ## Note on Patches/Pull Requests
68
79
 
@@ -76,4 +87,4 @@ You can run this manually like this:
76
87
 
77
88
  ### Copyright
78
89
 
79
- Copyright (c) 2011 Jack Chu. See LICENSE for details.
90
+ Copyright (c) 2011 Jack Chu. See LICENSE for details.
@@ -1,7 +1,7 @@
1
1
  require 'heroku_cloud_backup'
2
2
 
3
3
  namespace :heroku do
4
- desc "Example showing PostgreSQL database backups from Heroku to Amazon S3"
4
+ desc "Transfer PostgreSQL database backups from Heroku to the cloud"
5
5
  task :cloud_backup => :environment do
6
6
  HerokuCloudBackup.execute
7
7
  end
@@ -1,3 +1,3 @@
1
1
  module HerokuCloudBackup
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
@@ -12,15 +12,15 @@ module HerokuCloudBackup
12
12
  def log(message)
13
13
  puts "[#{Time.now}] #{message}"
14
14
  end
15
-
15
+
16
16
  def backups_url
17
17
  ENV["PGBACKUPS_URL"]
18
18
  end
19
-
19
+
20
20
  def client
21
21
  @client ||= PGBackups::Client.new(ENV["PGBACKUPS_URL"])
22
22
  end
23
-
23
+
24
24
  def databases
25
25
  if db = ENV["HEROKU_BACKUP_DATABASES"]
26
26
  db.split(",").map(&:strip)
@@ -28,7 +28,7 @@ module HerokuCloudBackup
28
28
  ["DATABASE_URL"]
29
29
  end
30
30
  end
31
-
31
+
32
32
  def backup_name(to_url)
33
33
  # translate s3://bucket/email/foo/bar.dump => foo/bar
34
34
  parts = to_url.split('/')
@@ -38,45 +38,56 @@ module HerokuCloudBackup
38
38
  def execute
39
39
  log "heroku:backup started"
40
40
 
41
- @bucket_name = ENV['HCB_BUCKET'] || "#{ENV['APP_NAME']}-heroku-backups"
41
+ @bucket_name = ENV['HCB_BUCKET'] || raise(HerokuCloudBackup::Errors::NotFound.new("Please provide a 'HCB_BUCKET' config variable."))
42
42
  @backup_path = ENV['HCB_PREFIX'] || "db"
43
- @providers = ENV['HCB_PROVIDERS'] || raise(HerokuCloudBackup::Errors::NotFound.new("Please provide a 'HCB_PROVIDERS' config variable."))
43
+ @provider = ENV['HCB_PROVIDER'] || raise(HerokuCloudBackup::Errors::NotFound.new("Please provide a 'HCB_PROVIDER' config variable."))
44
+ @key1 = ENV['HCB_KEY1'] || raise(HerokuCloudBackup::Errors::NotFound.new("Please provide a 'HCB_KEY1' config variable."))
45
+ @key2 = ENV['HCB_KEY2'] || raise(HerokuCloudBackup::Errors::NotFound.new("Please provide a 'HCB_KEY2' config variable."))
46
+
44
47
  b = client.get_latest_backup
45
48
  raise HerokuCloudBackup::Errors::NoBackups.new("You don't have any pgbackups. Please run heroku pgbackups:capture first.") if b.empty?
46
49
 
47
- @providers.split(',').each do |provider|
48
- case provider
50
+ begin
51
+ case @provider
49
52
  when 'aws'
50
- @hcb_aws_access_key_id = ENV['HCB_AWS_ACCESS_KEY_ID'] || raise(HerokuCloudBackup::Errors::NotFound.new("Please provide a 'HCB_AWS_ACCESS_KEY_ID' config variable."))
51
- @hcb_aws_secret_access_key = ENV['HCB_AWS_SECRET_ACCESS_KEY'] || raise(HerokuCloudBackup::Errors::NotFound.new("Please provide a 'HCB_AWS_SECRET_ACCESS_KEY' config variable."))
52
- begin
53
- @connection = Fog::Storage.new(
54
- :provider => 'AWS',
55
- :aws_access_key_id => @hcb_aws_access_key_id,
56
- :aws_secret_access_key => @hcb_aws_secret_access_key
57
- )
58
- rescue
59
- raise HerokuCloudBackup::Errors::ConnectionError.new("There was an error connecting to your provider.")
60
- end
53
+ @connection = Fog::Storage.new(
54
+ :provider => 'AWS',
55
+ :aws_access_key_id => @key1,
56
+ :aws_secret_access_key => @key2
57
+ )
58
+ when 'rackspace'
59
+ connection = Fog::Storage.new(
60
+ :provider => 'Rackspace',
61
+ :rackspace_username => @key1,
62
+ :rackspace_api_key => @key2
63
+ )
64
+ when 'google'
65
+ connection = Fog::Storage.new(
66
+ :provider => 'Google',
67
+ :google_storage_secret_access_key => @key1,
68
+ :google_storage_access_key_id => @key2
69
+ )
61
70
  else
62
- raise HerokuCloudBackup::Errors::InvalidProvider.new("One or more of your providers were invalid. Valid values are 'aws', 'rackspace', or 'google'")
71
+ raise HerokuCloudBackup::Errors::InvalidProvider.new("Your provider was invalid. Valid values are 'aws', 'rackspace', or 'google'")
63
72
  end
73
+ rescue
74
+ raise HerokuCloudBackup::Errors::ConnectionError.new("There was an error connecting to your provider.")
75
+ end
64
76
 
65
- directory = @connection.directories.get(@bucket_name)
77
+ directory = @connection.directories.get(@bucket_name) rescue Excon::Errors::Forbidden nil
66
78
 
67
- if !directory
68
- directory = @connection.directories.create(:key => @bucket_name)
69
- end
79
+ if !directory
80
+ directory = @connection.directories.create(:key => @bucket_name)
81
+ end
70
82
 
71
- public_url = b["public_url"]
72
- created_at = DateTime.parse b["created_at"]
73
- db_name = b["from_name"]
74
- name = "#{ENV['APP_NAME']}-#{created_at.strftime('%Y-%m-%d-%H%M%S')}.dump"
75
- begin
76
- directory.files.create(:key => "#{@backup_path}/#{b["from_name"]}/#{name}", :body => open(public_url))
77
- rescue Exception => e
78
- raise HerokuCloudBackup::Errors::UploadError.new(e.message)
79
- end
83
+ public_url = b["public_url"]
84
+ created_at = DateTime.parse b["created_at"]
85
+ db_name = b["from_name"]
86
+ name = "#{created_at.strftime('%Y-%m-%d-%H%M%S')}.dump"
87
+ begin
88
+ directory.files.create(:key => "#{@backup_path}/#{b["from_name"]}/#{name}", :body => open(public_url))
89
+ rescue Exception => e
90
+ raise HerokuCloudBackup::Errors::UploadError.new(e.message)
80
91
  end
81
92
 
82
93
  prune
@@ -87,13 +98,13 @@ module HerokuCloudBackup
87
98
  private
88
99
 
89
100
  def prune
90
- number_of_files = ENV['HCB_MAX_BACKUPS']
101
+ number_of_files = ENV['HCB_MAX']
91
102
  if number_of_files && number_of_files.to_i > 0
92
103
  directory = @connection.directories.get(@bucket_name)
93
104
  files = directory.files.all(:prefix => @backup_path)
94
105
  file_count = 0
95
106
  files.reverse.each do |file|
96
- if file.key =~ Regexp.new("/#{@backup_path}\/#{ENV['APP_NAME']}-\d{4}-\d{2}-\d{2}-\d{6}\.sql\.gz$/i")
107
+ if file.key =~ Regexp.new("/#{@backup_path}\/\d{4}-\d{2}-\d{2}-\d{6}\.sql\.gz$/i")
97
108
  file_count += 1
98
109
  else
99
110
  next
metadata CHANGED
@@ -1,8 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: heroku_cloud_backup
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 23
4
5
  prerelease:
5
- version: 0.0.3
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 4
10
+ version: 0.0.4
6
11
  platform: ruby
7
12
  authors:
8
13
  - Jack Chu
@@ -10,7 +15,8 @@ autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
17
 
13
- date: 2011-05-23 00:00:00 Z
18
+ date: 2011-06-08 00:00:00 -04:00
19
+ default_executable:
14
20
  dependencies:
15
21
  - !ruby/object:Gem::Dependency
16
22
  name: fog
@@ -20,6 +26,11 @@ dependencies:
20
26
  requirements:
21
27
  - - ">="
22
28
  - !ruby/object:Gem::Version
29
+ hash: 7
30
+ segments:
31
+ - 0
32
+ - 7
33
+ - 2
23
34
  version: 0.7.2
24
35
  type: :runtime
25
36
  version_requirements: *id001
@@ -31,6 +42,11 @@ dependencies:
31
42
  requirements:
32
43
  - - ">="
33
44
  - !ruby/object:Gem::Version
45
+ hash: 3
46
+ segments:
47
+ - 2
48
+ - 1
49
+ - 4
34
50
  version: 2.1.4
35
51
  type: :runtime
36
52
  version_requirements: *id002
@@ -55,6 +71,7 @@ files:
55
71
  - lib/heroku_cloud_backup/railtie.rb
56
72
  - lib/heroku_cloud_backup/tasks.rb
57
73
  - lib/heroku_cloud_backup/version.rb
74
+ has_rdoc: true
58
75
  homepage: ""
59
76
  licenses: []
60
77
 
@@ -68,17 +85,23 @@ required_ruby_version: !ruby/object:Gem::Requirement
68
85
  requirements:
69
86
  - - ">="
70
87
  - !ruby/object:Gem::Version
88
+ hash: 3
89
+ segments:
90
+ - 0
71
91
  version: "0"
72
92
  required_rubygems_version: !ruby/object:Gem::Requirement
73
93
  none: false
74
94
  requirements:
75
95
  - - ">="
76
96
  - !ruby/object:Gem::Version
97
+ hash: 3
98
+ segments:
99
+ - 0
77
100
  version: "0"
78
101
  requirements: []
79
102
 
80
103
  rubyforge_project: heroku_cloud_backup
81
- rubygems_version: 1.8.3
104
+ rubygems_version: 1.4.2
82
105
  signing_key:
83
106
  specification_version: 3
84
107
  summary: Backup pg dumps to the cloud