backy_rb 0.1.3 → 0.1.5
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/.backyrc.example +17 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +134 -1
- data/README.md +69 -11
- data/{backy.gemspec → backy_rb.gemspec} +5 -2
- data/bin/backy +4 -0
- data/dummy/psql/Gemfile +0 -34
- data/lib/backy/cli.rb +88 -0
- data/lib/backy/configuration.rb +65 -2
- data/lib/backy/db.rb +1 -0
- data/lib/backy/list.rb +1 -1
- data/lib/backy/logger.rb +27 -0
- data/lib/backy/pg_dump.rb +60 -6
- data/lib/backy/pg_restore.rb +73 -7
- data/lib/backy/version.rb +1 -1
- data/lib/{backy.rb → backy_rb.rb} +15 -0
- metadata +53 -61
- data/dummy/psql/.gitattributes +0 -7
- data/dummy/psql/.gitignore +0 -22
- data/dummy/psql/.ruby-version +0 -1
- data/dummy/psql/Gemfile.lock +0 -207
- data/dummy/psql/README.md +0 -24
- data/dummy/psql/Rakefile +0 -6
- data/dummy/psql/app/assets/config/manifest.js +0 -2
- data/dummy/psql/app/assets/images/.keep +0 -0
- data/dummy/psql/app/assets/stylesheets/application.css +0 -15
- data/dummy/psql/app/controllers/application_controller.rb +0 -2
- data/dummy/psql/app/controllers/concerns/.keep +0 -0
- data/dummy/psql/app/controllers/posts_controller.rb +0 -59
- data/dummy/psql/app/helpers/application_helper.rb +0 -2
- data/dummy/psql/app/helpers/posts_helper.rb +0 -2
- data/dummy/psql/app/models/application_record.rb +0 -3
- data/dummy/psql/app/models/concerns/.keep +0 -0
- data/dummy/psql/app/models/post.rb +0 -2
- data/dummy/psql/app/views/layouts/application.html.erb +0 -15
- data/dummy/psql/app/views/posts/_form.html.erb +0 -27
- data/dummy/psql/app/views/posts/_post.html.erb +0 -12
- data/dummy/psql/app/views/posts/edit.html.erb +0 -10
- data/dummy/psql/app/views/posts/index.html.erb +0 -14
- data/dummy/psql/app/views/posts/new.html.erb +0 -9
- data/dummy/psql/app/views/posts/show.html.erb +0 -10
- data/dummy/psql/bin/bundle +0 -109
- data/dummy/psql/bin/rails +0 -4
- data/dummy/psql/bin/rake +0 -4
- data/dummy/psql/bin/setup +0 -33
- data/dummy/psql/config/application.rb +0 -43
- data/dummy/psql/config/boot.rb +0 -3
- data/dummy/psql/config/credentials.yml.enc +0 -1
- data/dummy/psql/config/database.yml +0 -87
- data/dummy/psql/config/environment.rb +0 -5
- data/dummy/psql/config/environments/development.rb +0 -62
- data/dummy/psql/config/environments/production.rb +0 -75
- data/dummy/psql/config/environments/test.rb +0 -50
- data/dummy/psql/config/locales/en.yml +0 -33
- data/dummy/psql/config/master.key +0 -1
- data/dummy/psql/config/puma.rb +0 -43
- data/dummy/psql/config/routes.rb +0 -7
- data/dummy/psql/config.ru +0 -6
- data/dummy/psql/db/migrate/20230330203226_create_posts.rb +0 -10
- data/dummy/psql/db/schema.rb +0 -23
- data/dummy/psql/db/seeds.rb +0 -8
- data/dummy/psql/log/.keep +0 -0
- data/dummy/psql/public/404.html +0 -67
- data/dummy/psql/public/422.html +0 -67
- data/dummy/psql/public/500.html +0 -66
- data/dummy/psql/public/apple-touch-icon-precomposed.png +0 -0
- data/dummy/psql/public/apple-touch-icon.png +0 -0
- data/dummy/psql/public/favicon.ico +0 -0
- data/dummy/psql/public/robots.txt +0 -1
- data/dummy/psql/tmp/.keep +0 -0
- data/dummy/psql/tmp/pids/.keep +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 22c60d417618b6d91862bf0de81b3dc88cdd61af8bc5854f498ffc6bad749727
|
4
|
+
data.tar.gz: cbf338342040184c61bcbeffbec63c6a9479e4f370beea2e217cac3b2a1e0c53
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 45ccce1e737f6e34b4e0f4f6b686974dc7341ae1c29e4a0bbe70582ef597502160edb6e5beee657d8df58e82b3f4900f85570a5fe67f37eb974c98641453202d
|
7
|
+
data.tar.gz: 8565246f494bb1302aa947a8ef8623aa4f5d7b2c225931a8342ec46eb24d27e904bcf5183a680baff0299c19ceaf863888260bce8f52caf7f7b73b74cc2cae70
|
data/.backyrc.example
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# ~/.backyrc
|
2
|
+
defaults:
|
3
|
+
use_parallel: true
|
4
|
+
s3:
|
5
|
+
access_key_id: "YOUR_AWS_ACCESS_KEY_ID"
|
6
|
+
secret_access_key: "YOUR_AWS_SECRET_ACCESS_KEY"
|
7
|
+
region: "eu-central-1"
|
8
|
+
bucket: "your-s3-bucket-name"
|
9
|
+
database:
|
10
|
+
adapter: "postgresql"
|
11
|
+
host: "localhost"
|
12
|
+
port: 5432
|
13
|
+
username: "your-db-username"
|
14
|
+
password: "your-db-password"
|
15
|
+
database_name: "your-database-name"
|
16
|
+
local:
|
17
|
+
backup_path: "/path/to/your/local/backup/directory"
|
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -9,11 +9,66 @@ PATH
|
|
9
9
|
GEM
|
10
10
|
remote: https://rubygems.org/
|
11
11
|
specs:
|
12
|
+
actioncable (7.0.5)
|
13
|
+
actionpack (= 7.0.5)
|
14
|
+
activesupport (= 7.0.5)
|
15
|
+
nio4r (~> 2.0)
|
16
|
+
websocket-driver (>= 0.6.1)
|
17
|
+
actionmailbox (7.0.5)
|
18
|
+
actionpack (= 7.0.5)
|
19
|
+
activejob (= 7.0.5)
|
20
|
+
activerecord (= 7.0.5)
|
21
|
+
activestorage (= 7.0.5)
|
22
|
+
activesupport (= 7.0.5)
|
23
|
+
mail (>= 2.7.1)
|
24
|
+
net-imap
|
25
|
+
net-pop
|
26
|
+
net-smtp
|
27
|
+
actionmailer (7.0.5)
|
28
|
+
actionpack (= 7.0.5)
|
29
|
+
actionview (= 7.0.5)
|
30
|
+
activejob (= 7.0.5)
|
31
|
+
activesupport (= 7.0.5)
|
32
|
+
mail (~> 2.5, >= 2.5.4)
|
33
|
+
net-imap
|
34
|
+
net-pop
|
35
|
+
net-smtp
|
36
|
+
rails-dom-testing (~> 2.0)
|
37
|
+
actionpack (7.0.5)
|
38
|
+
actionview (= 7.0.5)
|
39
|
+
activesupport (= 7.0.5)
|
40
|
+
rack (~> 2.0, >= 2.2.4)
|
41
|
+
rack-test (>= 0.6.3)
|
42
|
+
rails-dom-testing (~> 2.0)
|
43
|
+
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
44
|
+
actiontext (7.0.5)
|
45
|
+
actionpack (= 7.0.5)
|
46
|
+
activerecord (= 7.0.5)
|
47
|
+
activestorage (= 7.0.5)
|
48
|
+
activesupport (= 7.0.5)
|
49
|
+
globalid (>= 0.6.0)
|
50
|
+
nokogiri (>= 1.8.5)
|
51
|
+
actionview (7.0.5)
|
52
|
+
activesupport (= 7.0.5)
|
53
|
+
builder (~> 3.1)
|
54
|
+
erubi (~> 1.4)
|
55
|
+
rails-dom-testing (~> 2.0)
|
56
|
+
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
57
|
+
activejob (7.0.5)
|
58
|
+
activesupport (= 7.0.5)
|
59
|
+
globalid (>= 0.3.6)
|
12
60
|
activemodel (7.0.5)
|
13
61
|
activesupport (= 7.0.5)
|
14
62
|
activerecord (7.0.5)
|
15
63
|
activemodel (= 7.0.5)
|
16
64
|
activesupport (= 7.0.5)
|
65
|
+
activestorage (7.0.5)
|
66
|
+
actionpack (= 7.0.5)
|
67
|
+
activejob (= 7.0.5)
|
68
|
+
activerecord (= 7.0.5)
|
69
|
+
activesupport (= 7.0.5)
|
70
|
+
marcel (~> 1.0)
|
71
|
+
mini_mime (>= 1.1.0)
|
17
72
|
activesupport (7.0.5)
|
18
73
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
19
74
|
i18n (>= 1.6, < 2)
|
@@ -37,18 +92,84 @@ GEM
|
|
37
92
|
aws-sigv4 (1.5.2)
|
38
93
|
aws-eventstream (~> 1, >= 1.0.2)
|
39
94
|
brakeman (5.4.1)
|
95
|
+
builder (3.2.4)
|
40
96
|
concurrent-ruby (1.2.2)
|
97
|
+
crass (1.0.6)
|
98
|
+
date (3.3.3)
|
41
99
|
diff-lcs (1.5.0)
|
42
|
-
|
100
|
+
erubi (1.12.0)
|
101
|
+
faker (3.2.0)
|
102
|
+
i18n (>= 1.8.11, < 2)
|
103
|
+
globalid (1.1.0)
|
104
|
+
activesupport (>= 5.0)
|
105
|
+
i18n (1.14.1)
|
43
106
|
concurrent-ruby (~> 1.0)
|
44
107
|
jmespath (1.6.2)
|
45
108
|
json (2.6.3)
|
46
109
|
language_server-protocol (3.17.0.3)
|
110
|
+
loofah (2.21.3)
|
111
|
+
crass (~> 1.0.2)
|
112
|
+
nokogiri (>= 1.12.0)
|
113
|
+
mail (2.8.1)
|
114
|
+
mini_mime (>= 0.1.1)
|
115
|
+
net-imap
|
116
|
+
net-pop
|
117
|
+
net-smtp
|
118
|
+
marcel (1.0.2)
|
119
|
+
method_source (1.0.0)
|
120
|
+
mini_mime (1.1.2)
|
47
121
|
minitest (5.18.0)
|
122
|
+
net-imap (0.3.6)
|
123
|
+
date
|
124
|
+
net-protocol
|
125
|
+
net-pop (0.1.2)
|
126
|
+
net-protocol
|
127
|
+
net-protocol (0.2.1)
|
128
|
+
timeout
|
129
|
+
net-smtp (0.3.3)
|
130
|
+
net-protocol
|
131
|
+
nio4r (2.5.9)
|
132
|
+
nokogiri (1.15.2-arm64-darwin)
|
133
|
+
racc (~> 1.4)
|
134
|
+
nokogiri (1.15.2-x86_64-linux)
|
135
|
+
racc (~> 1.4)
|
48
136
|
parallel (1.22.1)
|
49
137
|
parser (3.2.1.1)
|
50
138
|
ast (~> 2.4.1)
|
51
139
|
pg (1.5.3)
|
140
|
+
puma (6.3.0)
|
141
|
+
nio4r (~> 2.0)
|
142
|
+
racc (1.7.1)
|
143
|
+
rack (2.2.7)
|
144
|
+
rack-test (2.1.0)
|
145
|
+
rack (>= 1.3)
|
146
|
+
rails (7.0.5)
|
147
|
+
actioncable (= 7.0.5)
|
148
|
+
actionmailbox (= 7.0.5)
|
149
|
+
actionmailer (= 7.0.5)
|
150
|
+
actionpack (= 7.0.5)
|
151
|
+
actiontext (= 7.0.5)
|
152
|
+
actionview (= 7.0.5)
|
153
|
+
activejob (= 7.0.5)
|
154
|
+
activemodel (= 7.0.5)
|
155
|
+
activerecord (= 7.0.5)
|
156
|
+
activestorage (= 7.0.5)
|
157
|
+
activesupport (= 7.0.5)
|
158
|
+
bundler (>= 1.15.0)
|
159
|
+
railties (= 7.0.5)
|
160
|
+
rails-dom-testing (2.0.3)
|
161
|
+
activesupport (>= 4.2.0)
|
162
|
+
nokogiri (>= 1.6)
|
163
|
+
rails-html-sanitizer (1.6.0)
|
164
|
+
loofah (~> 2.21)
|
165
|
+
nokogiri (~> 1.14)
|
166
|
+
railties (7.0.5)
|
167
|
+
actionpack (= 7.0.5)
|
168
|
+
activesupport (= 7.0.5)
|
169
|
+
method_source
|
170
|
+
rake (>= 12.2)
|
171
|
+
thor (~> 1.0)
|
172
|
+
zeitwerk (~> 2.5)
|
52
173
|
rainbow (3.1.1)
|
53
174
|
rake (13.0.6)
|
54
175
|
regexp_parser (2.7.0)
|
@@ -93,10 +214,17 @@ GEM
|
|
93
214
|
language_server-protocol (~> 3.17.0.2)
|
94
215
|
rubocop (~> 1.48.1)
|
95
216
|
rubocop-performance (~> 1.16.0)
|
217
|
+
thor (1.2.2)
|
96
218
|
timecop (0.9.6)
|
219
|
+
timeout (0.3.2)
|
97
220
|
tzinfo (2.0.6)
|
98
221
|
concurrent-ruby (~> 1.0)
|
99
222
|
unicode-display_width (2.4.2)
|
223
|
+
websocket-driver (0.7.5)
|
224
|
+
websocket-extensions (>= 0.1.0)
|
225
|
+
websocket-extensions (0.1.5)
|
226
|
+
zeitwerk (2.6.8)
|
227
|
+
zlib (3.0.0)
|
100
228
|
|
101
229
|
PLATFORMS
|
102
230
|
arm64-darwin-22
|
@@ -106,7 +234,10 @@ DEPENDENCIES
|
|
106
234
|
aws-sdk-s3 (~> 1.117)
|
107
235
|
backy_rb!
|
108
236
|
brakeman (~> 5.4)
|
237
|
+
faker (>= 3.1)
|
109
238
|
pg
|
239
|
+
puma
|
240
|
+
rails (>= 4.0)
|
110
241
|
rake (~> 13.0)
|
111
242
|
rspec (~> 3.0)
|
112
243
|
rubocop (~> 1.44)
|
@@ -114,7 +245,9 @@ DEPENDENCIES
|
|
114
245
|
rubocop-rake (~> 0.6.0)
|
115
246
|
rubocop-rspec (~> 2.18)
|
116
247
|
standard (~> 1.3)
|
248
|
+
thor (~> 1.2)
|
117
249
|
timecop (~> 0.9.6)
|
250
|
+
zlib (~> 3.0)
|
118
251
|
|
119
252
|
BUNDLED WITH
|
120
253
|
2.4.8
|
data/README.md
CHANGED
@@ -4,26 +4,84 @@
|
|
4
4
|
|
5
5
|
Introducing "Backy" - the ultimate database backup gem for Ruby on Rails applications! Safeguard your valuable data with ease, speed, and reliability. Developed with the Rails community in mind, Backy provides a comprehensive solution for handling your database backups, ensuring your information is safe and sound.
|
6
6
|
|
7
|
-
##
|
7
|
+
## Features
|
8
8
|
|
9
|
-
|
9
|
+
- Database backup and restore.
|
10
|
+
- Integration with AWS S3 for storing backups.
|
11
|
+
- Support for both standalone usage and as part of a Rails application.
|
12
|
+
- Automatic configuration inference when used within a Rails application.
|
13
|
+
- Logging with colored output.
|
14
|
+
- Command Line Interface (CLI) for easy management.
|
15
|
+
|
16
|
+
## Installation Rails
|
10
17
|
|
11
|
-
gem 'backy'
|
12
18
|
|
13
|
-
|
19
|
+
Add this line to your application's Gemfile:
|
14
20
|
|
15
21
|
```ruby
|
16
|
-
|
17
|
-
config.s3_access_key = ""
|
18
|
-
config.s3_secret = ""
|
19
|
-
config.s3_bucket = ""
|
20
|
-
config.s3_region = ""
|
21
|
-
end
|
22
|
+
gem 'backy'
|
22
23
|
```
|
23
24
|
|
25
|
+
And then execute:
|
26
|
+
|
27
|
+
$ bundle
|
28
|
+
|
29
|
+
Or install it yourself as:
|
30
|
+
|
31
|
+
$ gem install backy_rb
|
32
|
+
|
33
|
+
|
24
34
|
## Usage
|
25
35
|
|
26
|
-
|
36
|
+
### Standalone
|
37
|
+
|
38
|
+
To use Backy in a standalone environment, you can utilize the provided CLI.
|
39
|
+
|
40
|
+
$ backy [command] [options]
|
41
|
+
|
42
|
+
Available commands include:
|
43
|
+
|
44
|
+
* `download`: Download a file from S3
|
45
|
+
* `dump`: Dump the database
|
46
|
+
* `help [COMMAND]`: Describe available commands or one specific command
|
47
|
+
* `list`: List all dumps
|
48
|
+
* `push`: Push dump to S3 and delete local file
|
49
|
+
* `restore`: Restore a database from a dump
|
50
|
+
* `upload`: Upload a specific file to S3
|
51
|
+
|
52
|
+
### In a Rails Application
|
53
|
+
|
54
|
+
Backy seamlessly integrates with Rails applications. When included in a Rails app, Backy can automatically infer configurations from the Rails environment.
|
55
|
+
|
56
|
+
#### Rake Tasks
|
57
|
+
Backy provides Rake tasks for easy integration:
|
58
|
+
|
59
|
+
```
|
60
|
+
bin/rails backy:dump
|
61
|
+
bin/rails backy:restore
|
62
|
+
```
|
63
|
+
|
64
|
+
## Configuration
|
65
|
+
|
66
|
+
Backy can be configured through a .backyrc YAML file. Place this file in your home directory or the root of your Rails application.
|
67
|
+
|
68
|
+
Example `.backyrc`:
|
69
|
+
|
70
|
+
```yaml
|
71
|
+
defaults:
|
72
|
+
use_parallel: true
|
73
|
+
s3:
|
74
|
+
access_key_id: YOUR_ACCESS_KEY
|
75
|
+
secret_access_key: YOUR_SECRET_KEY
|
76
|
+
region: YOUR_REGION
|
77
|
+
bucket: YOUR_BUCKET
|
78
|
+
database:
|
79
|
+
host: DB_HOST
|
80
|
+
port: DB_PORT
|
81
|
+
username: DB_USERNAME
|
82
|
+
password: DB_PASSWORD
|
83
|
+
database_name: DB_NAME
|
84
|
+
```
|
27
85
|
|
28
86
|
## Development
|
29
87
|
|
@@ -24,8 +24,8 @@ Gem::Specification.new do |spec|
|
|
24
24
|
(File.expand_path(f) == __FILE__) || f.start_with?(*%w[bin/ test/ spec/ features/ .git .circleci appveyor])
|
25
25
|
end
|
26
26
|
end
|
27
|
-
|
28
|
-
spec.executables =
|
27
|
+
|
28
|
+
spec.executables = ["backy"]
|
29
29
|
spec.require_paths = ["lib"]
|
30
30
|
|
31
31
|
spec.add_development_dependency "rspec", "~> 3.0"
|
@@ -36,6 +36,9 @@ Gem::Specification.new do |spec|
|
|
36
36
|
spec.add_development_dependency "rubocop-performance", "~> 1.15"
|
37
37
|
spec.add_development_dependency "rubocop-rake", "~> 0.6.0"
|
38
38
|
spec.add_development_dependency "timecop", "~> 0.9.6"
|
39
|
+
spec.add_development_dependency "zlib", "~> 3.0"
|
40
|
+
spec.add_development_dependency "rails", ">= 4.0"
|
41
|
+
spec.add_development_dependency "faker", ">= 3.1"
|
39
42
|
|
40
43
|
spec.add_dependency "activerecord", ">= 4.0"
|
41
44
|
spec.add_dependency "activesupport", ">= 4.0"
|
data/bin/backy
ADDED
data/dummy/psql/Gemfile
CHANGED
@@ -1,34 +0,0 @@
|
|
1
|
-
source "https://rubygems.org"
|
2
|
-
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
|
3
|
-
|
4
|
-
ruby "3.2.0"
|
5
|
-
|
6
|
-
# Bundle edge Rails instead: gem "rails", github: "rails/rails", branch: "main"
|
7
|
-
gem "rails", "~> 7.0.4", ">= 7.0.4.2"
|
8
|
-
|
9
|
-
# The original asset pipeline for Rails [https://github.com/rails/sprockets-rails]
|
10
|
-
gem "sprockets-rails"
|
11
|
-
|
12
|
-
# Use postgresql as the database for Active Record
|
13
|
-
gem "pg", "~> 1.1"
|
14
|
-
|
15
|
-
# Use the Puma web server [https://github.com/puma/puma]
|
16
|
-
gem "puma", "~> 5.0"
|
17
|
-
|
18
|
-
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
|
19
|
-
gem "tzinfo-data", platforms: %i[mingw mswin x64_mingw jruby]
|
20
|
-
|
21
|
-
# Backy <3
|
22
|
-
gem "backy", path: "../../"
|
23
|
-
|
24
|
-
group :development, :test do
|
25
|
-
# See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem
|
26
|
-
gem "debug", platforms: %i[mri mingw x64_mingw]
|
27
|
-
end
|
28
|
-
|
29
|
-
group :development do
|
30
|
-
# Speed up commands on slow machines / big apps [https://github.com/rails/spring]
|
31
|
-
# gem "spring"
|
32
|
-
end
|
33
|
-
|
34
|
-
gem "faker", "~> 3.1"
|
data/lib/backy/cli.rb
CHANGED
@@ -0,0 +1,88 @@
|
|
1
|
+
require "thor"
|
2
|
+
require "yaml"
|
3
|
+
|
4
|
+
module Backy
|
5
|
+
class CLI < Thor
|
6
|
+
def initialize(*args)
|
7
|
+
Logger.log("Initializing Backy CLI...")
|
8
|
+
super
|
9
|
+
Backy.setup
|
10
|
+
end
|
11
|
+
|
12
|
+
desc "dump", "Dump the database"
|
13
|
+
def dump
|
14
|
+
Backy::PgDump.new.call
|
15
|
+
Logger.success("Database dumped successfully.")
|
16
|
+
end
|
17
|
+
|
18
|
+
desc "push", "Push dump to S3 and delete local file"
|
19
|
+
def push
|
20
|
+
file_name = Backy::PgDump.new.call
|
21
|
+
save_to_s3(file_name)
|
22
|
+
File.delete(file_name) if File.exist?(file_name)
|
23
|
+
Logger.sucess("Dump pushed to S3 and local file deleted.")
|
24
|
+
end
|
25
|
+
|
26
|
+
desc "upload", "Upload a specific file to S3"
|
27
|
+
method_option :file, aliases: "-f", desc: "File to upload"
|
28
|
+
def upload
|
29
|
+
file_name = options[:file]
|
30
|
+
validate_file!(file_name)
|
31
|
+
save_to_s3(file_name)
|
32
|
+
Logger.success("File uploaded to S3.")
|
33
|
+
end
|
34
|
+
|
35
|
+
desc "download", "Download a file from S3"
|
36
|
+
method_option :file, aliases: "-f", desc: "File to download"
|
37
|
+
def download
|
38
|
+
file_name = options[:file]
|
39
|
+
validate_file!(file_name, should_exist: false)
|
40
|
+
load_from_s3_if_missing(file_name)
|
41
|
+
Logger.success("File downloaded from S3.")
|
42
|
+
end
|
43
|
+
|
44
|
+
desc "list", "List all dumps"
|
45
|
+
def list
|
46
|
+
list = Backy::List.new.call
|
47
|
+
list.each { |item| say "#{item.local? ? "local" : " "} #{item.remote? ? "remote" : " "} : #{item.dump_file}", :yellow }
|
48
|
+
say_instructions_if_any(list)
|
49
|
+
end
|
50
|
+
|
51
|
+
desc "restore", "Restore a database from a dump"
|
52
|
+
method_option :file, aliases: "-f", desc: "File to restore from"
|
53
|
+
def restore
|
54
|
+
file_name = find_file_for_restore(options[:file])
|
55
|
+
pg_restore(load_from_s3_if_missing(file_name)) if file_name
|
56
|
+
Logger.success("Database restored from #{file_name}.")
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
def validate_file!(file_name, should_exist: true)
|
62
|
+
if file_name.nil? || (should_exist ? !File.exist?(file_name) : File.exist?(file_name))
|
63
|
+
Logger.error("Invalid file specified.")
|
64
|
+
exit 1
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def find_file_for_restore(template_file_name)
|
69
|
+
file_name = Backy::List.new.call.reverse.find { |item| item.dump_file.starts_with?(template_file_name) }&.dump_file if template_file_name.present?
|
70
|
+
Logger.info "Please set the file to restore from." if file_name.nil?
|
71
|
+
file_name
|
72
|
+
end
|
73
|
+
|
74
|
+
def say_instructions_if_any(list)
|
75
|
+
return unless list.any?
|
76
|
+
Logger.info("\nTo restore a backup, run:")
|
77
|
+
Logger.log(" backy restore --file FILE_NAME")
|
78
|
+
end
|
79
|
+
|
80
|
+
def load_from_s3_if_missing(file_name)
|
81
|
+
Backy::S3Load.new(file_name: file_name).call
|
82
|
+
end
|
83
|
+
|
84
|
+
def save_to_s3(file_name)
|
85
|
+
Backy::S3Save.new(file_name: file_name).call
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
data/lib/backy/configuration.rb
CHANGED
@@ -12,9 +12,19 @@ module Backy
|
|
12
12
|
:s3_bucket,
|
13
13
|
:app_name,
|
14
14
|
:environment,
|
15
|
+
:use_parallel,
|
15
16
|
:log_file
|
16
17
|
)
|
17
18
|
|
19
|
+
def load
|
20
|
+
local_config_file = File.join(Dir.pwd, '.backyrc')
|
21
|
+
global_config_file = File.join(Dir.home, '.backyrc')
|
22
|
+
|
23
|
+
config_file = File.exist?(local_config_file) ? local_config_file : global_config_file
|
24
|
+
Logger.log("Loading configuration from #{config_file}...") if File.exist?(config_file)
|
25
|
+
load_from_file(config_file) if File.exist?(config_file)
|
26
|
+
end
|
27
|
+
|
18
28
|
def pg_host
|
19
29
|
@pg_host ||= ENV["PG_HOST"]
|
20
30
|
end
|
@@ -51,8 +61,29 @@ module Backy
|
|
51
61
|
@s3_bucket ||= ENV["S3_BUCKET"]
|
52
62
|
end
|
53
63
|
|
64
|
+
def use_parallel
|
65
|
+
@use_parallel ||= ENV["BACKY_USE_PARALLEL"] == "true"
|
66
|
+
end
|
67
|
+
|
68
|
+
def use_parallel?
|
69
|
+
use_parallel && pigz_installed && multicore
|
70
|
+
end
|
71
|
+
|
72
|
+
# Detect if pigz binary is available
|
73
|
+
# If it is, use it to speed up the dump
|
74
|
+
# pigz is a parallel gzip implementation
|
75
|
+
# https://zlib.net/pigz/
|
76
|
+
def pigz_installed
|
77
|
+
@pigz_installed ||= system("which pigz > /dev/null 2>&1")
|
78
|
+
end
|
79
|
+
|
80
|
+
# Determine if the system is multicore
|
81
|
+
def multicore
|
82
|
+
@multicore ||= Etc.nprocessors > 1
|
83
|
+
end
|
84
|
+
|
54
85
|
def app_name
|
55
|
-
@app_name ||= "backy"
|
86
|
+
@app_name ||= ENV["APP_NAME"].presence || "backy"
|
56
87
|
end
|
57
88
|
|
58
89
|
def environment
|
@@ -60,7 +91,39 @@ module Backy
|
|
60
91
|
end
|
61
92
|
|
62
93
|
def log_file
|
63
|
-
@log_file ||=
|
94
|
+
@log_file ||= default_log_file
|
95
|
+
end
|
96
|
+
|
97
|
+
private
|
98
|
+
|
99
|
+
def default_log_file
|
100
|
+
if Gem.win_platform?
|
101
|
+
# Windows default path
|
102
|
+
File.join(Dir.home, "AppData", "Local", "#{app_name}", "log", "#{app_name}.log")
|
103
|
+
else
|
104
|
+
# Unix-like systems default path
|
105
|
+
File.join(Dir.home, ".local", "share", "#{app_name}", "log", "#{app_name}.log")
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def load_from_file(file_path)
|
110
|
+
configuration = YAML.load_file(file_path)
|
111
|
+
|
112
|
+
@s3_access_key = configuration.dig("defaults", "s3", "access_key_id")
|
113
|
+
@s3_secret = configuration.dig("defaults", "s3", "secret_access_key")
|
114
|
+
@s3_region = configuration.dig("defaults", "s3", "region")
|
115
|
+
@s3_bucket = configuration.dig("defaults", "s3", "bucket")
|
116
|
+
|
117
|
+
@pg_host = configuration.dig("defaults", "database", "host")
|
118
|
+
@pg_port = configuration.dig("defaults", "database", "port")
|
119
|
+
@pg_username = configuration.dig("defaults", "database", "username")
|
120
|
+
@pg_password = configuration.dig("defaults", "database", "password")
|
121
|
+
@pg_database = configuration.dig("defaults", "database", "database_name")
|
122
|
+
|
123
|
+
@app_name = configuration.dig("defaults", "app_name") || "backy"
|
124
|
+
@environment = configuration.dig("defaults", "environment") || "development"
|
125
|
+
@log_file = configuration.dig("defaults", "log", "file") || default_log_file
|
126
|
+
@use_parallel = configuration.dig("defaults", "use_parallel") || false
|
64
127
|
end
|
65
128
|
end
|
66
129
|
end
|
data/lib/backy/db.rb
CHANGED
@@ -11,6 +11,7 @@ module Backy
|
|
11
11
|
def_delegator "Backy.configuration", :pg_database, :database
|
12
12
|
def_delegator "Backy.configuration", :pg_username, :username
|
13
13
|
def_delegator "Backy.configuration", :pg_password, :password
|
14
|
+
def_delegator "Backy.configuration", :use_parallel?, :use_parallel?
|
14
15
|
|
15
16
|
def pg_password_env
|
16
17
|
password.present? ? "PGPASSWORD='#{password}' " : ""
|
data/lib/backy/list.rb
CHANGED
@@ -5,7 +5,7 @@ module Backy
|
|
5
5
|
remotes = Set.new(S3List.new.call)
|
6
6
|
|
7
7
|
(locals + remotes).sort.map do |dump_file|
|
8
|
-
OpenStruct.new(local?:
|
8
|
+
OpenStruct.new(local?: locals.include?(dump_file), remote?: remotes.include?(dump_file), dump_file: dump_file)
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
data/lib/backy/logger.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'thor'
|
2
|
+
|
3
|
+
module Backy
|
4
|
+
class Logger
|
5
|
+
# Logs a message with the specified color using Thor's shell
|
6
|
+
def self.log(message, color = nil)
|
7
|
+
thor_shell = Thor::Base.shell.new
|
8
|
+
thor_shell.say("[#{Time.now.strftime("%Y-%m-%d %H:%M:%S")}] #{message}", color)
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.success(message)
|
12
|
+
log(message, :green)
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.info(message)
|
16
|
+
log(message, :blue)
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.warn(message)
|
20
|
+
log(message, :yellow)
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.error(message)
|
24
|
+
log(message, :red)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|