capistrano-ops 0.2.3 → 0.2.4
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.
- checksums.yaml +4 -4
- data/.rubocop.yml +21 -0
- data/README.md +58 -19
- data/capistrano-ops.gemspec +5 -5
- data/lib/capistrano/ops/backup/api.rb +35 -33
- data/lib/capistrano/ops/backup/s3.rb +47 -44
- data/lib/capistrano/ops/backup.rb +4 -3
- data/lib/capistrano/ops/capistrano/v3/tasks/backup/backup_helper.rb +50 -0
- data/lib/capistrano/ops/capistrano/v3/tasks/backup/database/create.rake +18 -0
- data/lib/capistrano/ops/capistrano/v3/tasks/backup/database/pull.rake +28 -0
- data/lib/capistrano/ops/capistrano/v3/tasks/backup/storage/create.rake +18 -0
- data/lib/capistrano/ops/capistrano/v3/tasks/backup/storage/pull.rake +30 -0
- data/lib/capistrano/ops/capistrano/v3/tasks/backup.rake +10 -14
- data/lib/capistrano/ops/capistrano/v3/tasks/figaro_yml.rake +59 -60
- data/lib/capistrano/ops/capistrano/v3/tasks/invoke.rake +16 -17
- data/lib/capistrano/ops/capistrano.rb +2 -0
- data/lib/capistrano/ops/notification/api.rb +29 -25
- data/lib/capistrano/ops/notification/slack.rb +65 -59
- data/lib/capistrano/ops/notification/webhook.rb +43 -36
- data/lib/capistrano/ops/notification.rb +4 -2
- data/lib/capistrano/ops/railtie.rb +1 -1
- data/lib/capistrano/ops/tasks/pg/dump.rake +16 -19
- data/lib/capistrano/ops/tasks/pg/remove_old_dumps.rake +30 -10
- data/lib/capistrano/ops/tasks/storage/backup.rake +56 -61
- data/lib/capistrano/ops/tasks/storage/remove_old_backups.rake +48 -31
- data/lib/capistrano/ops/version.rb +2 -1
- data/lib/capistrano/ops.rb +19 -19
- metadata +30 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6897d38c35cb8b0dfb713d16d0eb0c390c431636ea5c6565e1dc457b96a29c6b
|
4
|
+
data.tar.gz: 9789f0e37f0767403324c1ca68c97759a8ebdbdb5a3e4ac6d362b76dfc5064ad
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4607175b27284ed6d19ca2fe3032dccde17f54cb62dfbfc43c614af031abf9990b873b89b1d905c74d2acb48dc4e94a3eec6b50bbff18dee0079b2a5264d04dd
|
7
|
+
data.tar.gz: 1ce1060464559ce566320e9ef7a1700d5d94ee688e6f8aea85f7dbd2548e78bfc5e6cb1f5e751b38e9b566e7411e89587d4207eb6c0349592d0cacab854e6ffc
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
AllCops:
|
2
|
+
NewCops: disable
|
3
|
+
TargetRubyVersion: 2.7
|
4
|
+
Layout/LineLength:
|
5
|
+
Max: 160
|
6
|
+
Metrics/MethodLength:
|
7
|
+
Max: 50
|
8
|
+
Metrics/ClassLength:
|
9
|
+
Max: 750
|
10
|
+
Metrics/BlockLength:
|
11
|
+
Max: 50
|
12
|
+
Metrics/ParameterLists:
|
13
|
+
Max: 6
|
14
|
+
Metrics/AbcSize:
|
15
|
+
Max: 60
|
16
|
+
Metrics/CyclomaticComplexity:
|
17
|
+
Max: 25
|
18
|
+
Metrics/PerceivedComplexity:
|
19
|
+
Max: 25
|
20
|
+
Style/Documentation:
|
21
|
+
Enabled: false
|
data/README.md
CHANGED
@@ -46,8 +46,12 @@ require 'capistrano/ops'
|
|
46
46
|
|
47
47
|
| Script | Description |
|
48
48
|
| ------------------------------------------------ | ----------------------------------------------------------------- |
|
49
|
-
| `cap <environment> backup:create` | creates backup of postgres database on the server
|
50
|
-
| `cap <environment> backup:pull` | download latest postgres backup from server
|
49
|
+
| `cap <environment> backup:create` | creates backup of postgres database on the server (deprecated) |
|
50
|
+
| `cap <environment> backup:pull` | download latest postgres backup from server (deprecated) |
|
51
|
+
| `cap <environment> backup:database:create` | creates backup of postgres database on the server |
|
52
|
+
| `cap <environment> backup:database:pull` | download latest postgres backup from server |
|
53
|
+
| `cap <environment> backup:storage:create` | creates backup of storage on the server |
|
54
|
+
| `cap <environment> backup:storage:pull` | download latest storage backup from server |
|
51
55
|
| `cap <environment> figaro_yml:compare` | compare local application.yml with server application.yml |
|
52
56
|
| `cap <environment> figaro_yml:get` | shows env vars from server application.yml configured thru figaro |
|
53
57
|
| `cap <environment> logs:rails` | display server log live |
|
@@ -55,6 +59,8 @@ require 'capistrano/ops'
|
|
55
59
|
| `cap <environment> invoke:rake TASK=<your:task>` | invoke rake task on server |
|
56
60
|
| `rake pg:dump` | creates postgres database backup |
|
57
61
|
| `rake pg:remove_old_dumps` | remove old postgres backups |
|
62
|
+
| `rake storage:backup` | creates backup of storage |
|
63
|
+
| `rake storage:remove_old_backups` | remove old storage backups |
|
58
64
|
|
59
65
|
## Usage
|
60
66
|
|
@@ -72,23 +78,26 @@ production:
|
|
72
78
|
|
73
79
|
### Optional Settings for backup task
|
74
80
|
|
75
|
-
| env
|
76
|
-
|
|
77
|
-
| NUMBER_OF_BACKUPS
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
81
|
+
| env | description | type/options |
|
82
|
+
| -------------------------- | --------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------: |
|
83
|
+
| NUMBER_OF_BACKUPS | number of backups to keep (default: 7) | `number` |
|
84
|
+
| NUMBER_OF_LOCAL_BACKUPS | number of backups to keep locally (default: nil) | `number` |
|
85
|
+
| NUMBER_OF_EXTERNAL_BACKUPS | number of backups to keep externally (default: nil) | `number` |
|
86
|
+
| BACKUPS_ENABLED | enable/disable backup task (default: Rails.env == 'production') | `boolean` |
|
87
|
+
| EXTERNAL_BACKUP_ENABLED | enable/disable external backup (default: false) (only if 'BACKUPS_ENABLED', needs additional setup) | `boolean` |
|
88
|
+
| DEFAULT_URL | notification message title (default: "#{database} Backup") | `string` |
|
89
|
+
| NOTIFICATION_TYPE | for notification (default: nil) | `string` (`webhook`/`slack`) |
|
90
|
+
| NOTIFICATION_LEVEL | for notification (default: nil) | `string` (`info`/`error`) |
|
91
|
+
| SLACK_SECRET | for slack integration | `string` (e.g. `xoxb-1234567890-1234567890-1234567890-1234567890`) |
|
92
|
+
| SLACK_CHANNEL | for slack integration | `string` (e.g. `C234567890`) |
|
93
|
+
| WEBHOOK_URL | Webhook server to send message | e.g `http://example.com` |
|
94
|
+
| WEBHOOK_SECRET | Secret to send with uses md5-hmac hexdigest in header`x-hub-signature` | --- |
|
95
|
+
| BACKUP_PROVIDER | Backup provider (default: nil) | `string` (`s3`) |
|
96
|
+
| S3_BACKUP_BUCKET | S3 bucket name for backups | `string` |
|
97
|
+
| S3_BACKUP_REGION | S3 region for backups | `string` |
|
98
|
+
| S3_BACKUP_KEY | S3 access key for backups | `string` |
|
99
|
+
| S3_BACKUP_SECRET | S3 secret key for backups | `string` |
|
100
|
+
| S3_BACKUP_ENDPOINT | S3 endpoint for backups (optional, used for other S3 compatible services) | `string` |
|
92
101
|
|
93
102
|
### use with whenever/capistrano
|
94
103
|
|
@@ -102,10 +111,12 @@ set :output, -> { '2>&1 | logger -t whenever_cron' }
|
|
102
111
|
|
103
112
|
every :day, at: '2:00 am' do
|
104
113
|
rake 'pg:dump'
|
114
|
+
rake 'storage:backup'
|
105
115
|
end
|
106
116
|
|
107
117
|
every :day, at: '3:00 am' do
|
108
118
|
rake 'pg:remove_old_dumps'
|
119
|
+
rake 'storage:remove_old_backups'
|
109
120
|
end
|
110
121
|
```
|
111
122
|
|
@@ -153,6 +164,34 @@ if you want to use notification level you have to add this to your `application.
|
|
153
164
|
NOTIFICATION_LEVEL: 'info' # default is 'error'
|
154
165
|
```
|
155
166
|
|
167
|
+
## Backups
|
168
|
+
|
169
|
+
if you want to configure the number of backups you have to add this to your `application.yml`
|
170
|
+
|
171
|
+
```ruby
|
172
|
+
NUMBER_OF_BACKUPS: 7 # default is 7 (local + external)
|
173
|
+
```
|
174
|
+
|
175
|
+
to fine tune the number of local and external backups you can use this:
|
176
|
+
|
177
|
+
```ruby
|
178
|
+
NUMBER_OF_LOCAL_BACKUPS: 7 # default is nil (local)
|
179
|
+
NUMBER_OF_EXTERNAL_BACKUPS: 7 # default is nil (local)
|
180
|
+
```
|
181
|
+
|
182
|
+
### Backup provider
|
183
|
+
|
184
|
+
if you want to use an external backup provider you have to add this to your `application.yml`
|
185
|
+
|
186
|
+
```ruby
|
187
|
+
BACKUP_PROVIDER: 's3'
|
188
|
+
S3_BACKUP_BUCKET: '<your-s3-bucket>'
|
189
|
+
S3_BACKUP_REGION: '<your-s3-region>'
|
190
|
+
S3_BACKUP_KEY: '<your-s3-key>'
|
191
|
+
S3_BACKUP_SECRET: '<your-s3-secret>'
|
192
|
+
S3_BACKUP_ENDPOINT: '<your-s3-endpoint>' # optional, used for other S3 compatible services
|
193
|
+
```
|
194
|
+
|
156
195
|
## Contributing
|
157
196
|
|
158
197
|
1. Fork it ( https://github.com/zauberware/capistrano-ops/fork )
|
data/capistrano-ops.gemspec
CHANGED
@@ -18,12 +18,12 @@ Gem::Specification.new do |s|
|
|
18
18
|
s.test_files = `git ls-files -- test/{functional,unit}/*`.split("\n")
|
19
19
|
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
20
20
|
s.require_paths = ['lib']
|
21
|
-
|
22
|
-
s.required_ruby_version = '
|
23
|
-
|
24
|
-
s.add_dependency 'rails'
|
25
|
-
s.add_dependency 'nokogiri'
|
21
|
+
|
22
|
+
s.required_ruby_version = '~> 2.7.0'
|
26
23
|
s.add_dependency 'aws-sdk-s3', '~> 1.128'
|
24
|
+
s.add_dependency 'faraday'
|
25
|
+
s.add_dependency 'nokogiri'
|
26
|
+
s.add_dependency 'rails'
|
27
27
|
s.add_development_dependency 'bundler', '~> 2.4.12'
|
28
28
|
s.add_development_dependency 'rake', '~> 10.0'
|
29
29
|
end
|
@@ -1,38 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Backup
|
2
|
-
|
3
|
-
|
4
|
+
class Api
|
5
|
+
attr_accessor :backup_provider, :provider_config
|
4
6
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
7
|
+
def initialize(provider: ENV['BACKUP_PROVIDER'], provider_config: {})
|
8
|
+
self.backup_provider = provider
|
9
|
+
self.provider_config = provider_config
|
10
|
+
end
|
9
11
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
12
|
+
def upload(backup_file, filename)
|
13
|
+
case backup_provider
|
14
|
+
when 's3'
|
15
|
+
s3 = Backup::S3.new(**provider_config)
|
16
|
+
s3.upload(backup_file, filename)
|
17
|
+
when 'scp'
|
18
|
+
p 'SCP backup not implemented yet'
|
19
|
+
when 'rsync'
|
20
|
+
p 'Rsync backup not implemented yet'
|
21
|
+
else
|
22
|
+
raise Backup::Error, 'Backup provider not configured'
|
23
|
+
end
|
24
|
+
end
|
23
25
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
end
|
26
|
+
def remove_old_backups(basename, keep)
|
27
|
+
case backup_provider
|
28
|
+
when 's3'
|
29
|
+
s3 = Backup::S3.new(**provider_config)
|
30
|
+
s3.remove_old_backups(basename, keep: keep)
|
31
|
+
when 'scp'
|
32
|
+
p 'SCP backup not implemented yet'
|
33
|
+
when 'rsync'
|
34
|
+
p 'Rsync backup not implemented yet'
|
35
|
+
else
|
36
|
+
raise Backup::Error, 'Backup provider not configured'
|
37
|
+
end
|
37
38
|
end
|
38
|
-
end
|
39
|
+
end
|
40
|
+
end
|
@@ -1,49 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Backup
|
2
|
-
|
3
|
-
|
4
|
-
|
4
|
+
require 'aws-sdk-s3'
|
5
|
+
class S3
|
6
|
+
attr_accessor :endpoint, :region, :access_key_id, :secret_access_key, :s3_client
|
5
7
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
8
|
+
def initialize(endpoint: ENV['S3_BACKUP_ENDPOINT'], region: ENV['S3_BACKUP_REGION'], access_key_id: ENV['S3_BACKUP_KEY'],
|
9
|
+
secret_access_key: ENV['S3_BACKUP_SECRET'])
|
10
|
+
self.endpoint = endpoint
|
11
|
+
self.region = region
|
12
|
+
self.access_key_id = access_key_id
|
13
|
+
self.secret_access_key = secret_access_key
|
14
|
+
config = {
|
15
|
+
region: region,
|
16
|
+
access_key_id: access_key_id,
|
17
|
+
secret_access_key: secret_access_key
|
18
|
+
}
|
19
|
+
config[:endpoint] = endpoint unless endpoint.nil?
|
20
|
+
self.s3_client = Aws::S3::Client.new(config)
|
21
|
+
end
|
19
22
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
23
|
+
def upload(backup_file, key)
|
24
|
+
begin
|
25
|
+
s3_client.put_object(
|
26
|
+
bucket: ENV['S3_BACKUP_BUCKET'],
|
27
|
+
key: key,
|
28
|
+
body: File.open(backup_file)
|
29
|
+
)
|
30
|
+
rescue StandardError => e
|
31
|
+
puts "Error uploading backup to S3: #{e.message}"
|
32
|
+
raise e
|
33
|
+
end
|
34
|
+
'File uploaded to S3'
|
35
|
+
end
|
33
36
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
end
|
37
|
+
def remove_old_backups(basename, keep: 5)
|
38
|
+
bucket = ENV['S3_BACKUP_BUCKET']
|
39
|
+
all_items = s3_client.list_objects_v2(bucket: bucket, prefix: basename).contents
|
40
|
+
count = all_items.count
|
41
|
+
if count <= keep
|
42
|
+
p 'Nothing to remove'
|
43
|
+
return
|
44
|
+
end
|
45
|
+
items = all_items.sort_by(&:last_modified).reverse.slice(keep..-1).map(&:key)
|
46
|
+
items.each do |item|
|
47
|
+
p "Removing #{item} from S3"
|
48
|
+
s3_client.delete_object(bucket: bucket, key: item)
|
49
|
+
end
|
48
50
|
end
|
49
|
-
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BackupHelper
|
4
|
+
def backup_file_name(type)
|
5
|
+
regex = type == 'storage' ? "'.{0,}\.tar.gz'" : "'.{0,}\.dump'"
|
6
|
+
@backup_file_name ||= capture "cd #{shared_path}/backups && ls -lt | grep -E -i #{regex} | head -n 1 | awk '{print $9}'"
|
7
|
+
end
|
8
|
+
|
9
|
+
def backup_file_size
|
10
|
+
@backup_file_size ||= capture "cd #{shared_path}/backups && wc -c #{@backup_file_name} | awk '{print $1}'"
|
11
|
+
end
|
12
|
+
|
13
|
+
def download_backup(backup_file, type)
|
14
|
+
puts "Downloading #{type} backup"
|
15
|
+
download! "#{shared_path}/backups/#{backup_file}"
|
16
|
+
puts "Download finished\nDeleting temporary backup..."
|
17
|
+
cleanup_backup(backup_file, "Download finished\nDeleting temporary backup...")
|
18
|
+
end
|
19
|
+
|
20
|
+
def cleanup_backup(backup_file, message)
|
21
|
+
puts message
|
22
|
+
execute "cd #{shared_path}/backups && rm #{backup_file}"
|
23
|
+
puts 'Temporary backup deleted'
|
24
|
+
end
|
25
|
+
|
26
|
+
def question(question, default = 'n', &block)
|
27
|
+
print "#{question} #{default.downcase == 'n' ? '(y/N)' : '(Y/n)'}: "
|
28
|
+
input = $stdin.gets.strip.downcase
|
29
|
+
answer = (input.empty? ? default : input).downcase.to_s
|
30
|
+
|
31
|
+
if %w[y n].include?(answer)
|
32
|
+
block.call(answer == 'y')
|
33
|
+
else
|
34
|
+
question(question, default, &block)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def prepare_env
|
39
|
+
@env = "RAILS_ENV=#{fetch(:stage)}"
|
40
|
+
@path_cmd = "PATH=$HOME/.rbenv/versions/#{RUBY_VERSION}/bin:$PATH"
|
41
|
+
@test_command = "cd #{release_path} && #{@path_cmd} && #{@env}"
|
42
|
+
end
|
43
|
+
|
44
|
+
def size_str(size)
|
45
|
+
units = %w[B KB MB GB TB]
|
46
|
+
e = (Math.log(size) / Math.log(1024)).floor
|
47
|
+
s = format('%.2f', size.to_f / 1024**e)
|
48
|
+
s.sub(/\.?0*$/, units[e])
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../backup_helper'
|
4
|
+
namespace :backup do
|
5
|
+
namespace :database do
|
6
|
+
include BackupHelper
|
7
|
+
# Default to :app role
|
8
|
+
rake_roles = fetch(:rake_roles, :app)
|
9
|
+
|
10
|
+
desc 'create a backup of the server database'
|
11
|
+
task :create do
|
12
|
+
on roles(rake_roles) do
|
13
|
+
puts 'Creating backup...'
|
14
|
+
execute "#{prepare_env} BACKUPS_ENABLED=true bundle exec rake pg:dump"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../backup_helper'
|
4
|
+
namespace :backup do
|
5
|
+
namespace :database do
|
6
|
+
include BackupHelper
|
7
|
+
# Default to :app role
|
8
|
+
rake_roles = fetch(:rake_roles, :app)
|
9
|
+
|
10
|
+
desc 'pull latest database dump from server to local'
|
11
|
+
task :pull do
|
12
|
+
on roles(rake_roles) do
|
13
|
+
puts 'Creating temporary backup...'
|
14
|
+
execute "#{prepare_env} BACKUPS_ENABLED=true EXTERNAL_BACKUP_ENABLED=false bundle exec rake pg:dump"
|
15
|
+
puts "Backup created\nPrepare download..."
|
16
|
+
backup_file = backup_file_name('database')
|
17
|
+
backup_size = backup_file_size
|
18
|
+
question("Backup size: #{size_str(backup_size.to_i)}. Continue?", 'n') do |answer|
|
19
|
+
if answer
|
20
|
+
download_backup(backup_file, 'database')
|
21
|
+
else
|
22
|
+
cleanup_backup(backup_file, "Aborting...\nDeleting temporary backup...")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../backup_helper'
|
4
|
+
namespace :backup do
|
5
|
+
namespace :storage do
|
6
|
+
include BackupHelper
|
7
|
+
# Default to :app role
|
8
|
+
rake_roles = fetch(:rake_roles, :app)
|
9
|
+
|
10
|
+
desc 'create storage dump on server'
|
11
|
+
task :create do
|
12
|
+
on roles(rake_roles) do
|
13
|
+
puts 'Creating backup...'
|
14
|
+
execute "#{prepare_env} BACKUPS_ENABLED=true EXTERNAL_BACKUP_ENABLED=false bundle exec rake storage:backup"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../backup_helper'
|
4
|
+
namespace :backup do
|
5
|
+
namespace :storage do
|
6
|
+
include BackupHelper
|
7
|
+
# Default to :app role
|
8
|
+
rake_roles = fetch(:rake_roles, :app)
|
9
|
+
desc 'pull latest storage dump from server to local'
|
10
|
+
task :pull do
|
11
|
+
on roles(rake_roles) do
|
12
|
+
puts 'Creating temporary backup...'
|
13
|
+
execute "#{prepare_env} BACKUPS_ENABLED=true EXTERNAL_BACKUP_ENABLED=false bundle exec rake storage:backup"
|
14
|
+
puts 'Backup created'
|
15
|
+
backup_file = backup_file_name('storage')
|
16
|
+
backup_size = backup_file_size
|
17
|
+
|
18
|
+
puts 'Prepare download...'
|
19
|
+
|
20
|
+
question("Backup size: #{size_str(backup_size.to_i)}. Continue?", 'n') do |answer|
|
21
|
+
if answer
|
22
|
+
download_backup(backup_file, 'storage')
|
23
|
+
else
|
24
|
+
cleanup_backup(backup_file, "Aborting...\nDeleting temporary backup...")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -1,29 +1,25 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative 'backup/backup_helper'
|
4
|
+
|
3
5
|
namespace :backup do
|
6
|
+
include BackupHelper
|
4
7
|
# Default to :app role
|
5
8
|
rake_roles = fetch(:rake_roles, :app)
|
6
9
|
|
7
|
-
desc 'create a backup of the server database'
|
10
|
+
desc 'create a backup of the server database (deprecated, use backup:database:create instead)'
|
8
11
|
task :create do
|
9
12
|
on roles(rake_roles) do
|
10
|
-
|
11
|
-
#
|
12
|
-
path_cmd = "PATH=$HOME/.rbenv/versions/#{RUBY_VERSION}/bin:$PATH"
|
13
|
-
# rubocop:enable Layout/LineLength
|
14
|
-
execute "cd #{release_path} && #{path_cmd} && #{env} BACKUPS_ENABLED=true bundle exec rake pg:dump"
|
13
|
+
warn "deprecated: use 'backup:database:create' instead, in future versions this task will be removed"
|
14
|
+
execute "#{prepare_env} BACKUPS_ENABLED=true EXTERNAL_BACKUP_ENABLED=false bundle exec rake pg:dump"
|
15
15
|
end
|
16
16
|
end
|
17
|
-
desc 'pull latest database backups from server to local'
|
17
|
+
desc 'pull latest database backups from server to local (deprecated, use backup:database:pull instead)'
|
18
18
|
task :pull do
|
19
19
|
on roles(rake_roles) do
|
20
|
-
|
21
|
-
|
22
|
-
#
|
23
|
-
download! "#{shared_path}/backups.tar.gz", 'backups.tar.gz'
|
24
|
-
execute "rm #{shared_path}/backups.tar.gz"
|
25
|
-
system 'tar -xzf backups.tar.gz'
|
26
|
-
system 'rm backups.tar.gz'
|
20
|
+
warn "deprecated: use 'backup:database:pull' instead, in future versions this task will be removed"
|
21
|
+
backup_file = backup_file_name('database')
|
22
|
+
download! "#{shared_path}/backups/#{backup_file}"
|
27
23
|
end
|
28
24
|
end
|
29
25
|
end
|