remote_database_importer 0.1.2 → 0.1.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/CHANGELOG.md +10 -2
- data/Gemfile.lock +1 -5
- data/README.md +11 -3
- data/lib/remote_database_importer/colorize.rb +13 -0
- data/lib/remote_database_importer/config.rb +24 -16
- data/lib/remote_database_importer/operation.rb +21 -20
- data/lib/remote_database_importer/version.rb +1 -1
- data/lib/tasks/remote_database_importer.rake +1 -2
- metadata +4 -34
- data/bin/remote_database_importer +0 -14
- data/readme_images/.DS_Store +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 28a65a635e4ee78fdbce0dfce253b88a44fa190a887a8d68f928f5193d298fec
|
4
|
+
data.tar.gz: c23343009f9e8cf5d819fdf4a2dae6e88e380d30ef7591382fc900bcb1f40e04
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7b7bd6d20734483e93dcefec67a7890300f6946047003de8a12915a982063d0de086f0b372f188271b6f3c0c51b22bb6b5baac50f25034e7bb548bee5a19817e
|
7
|
+
data.tar.gz: 7cc6a60c1141353e8cdf2d910fcab0d0f9c991e56c7cc0fbda513f3461fbaa6ba1abe16f0bcb07f13a99717fed81c519b01455da6b257fa0852cede0366d9e03
|
data/CHANGELOG.md
CHANGED
@@ -1,11 +1,19 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
-
##
|
3
|
+
## 0.1.4 (2022-11-17)
|
4
|
+
- Remove colorize as a dependency
|
5
|
+
- Code refactoring
|
6
|
+
|
7
|
+
## 0.1.3 (2022-11-06)
|
8
|
+
- Remove Thor as a dependency
|
9
|
+
- Add custom commands that run after the successful import of the remote database
|
10
|
+
|
11
|
+
## 0.1.2 (2022-10-29)
|
4
12
|
|
5
13
|
- Terminate current DB sessions after dump remote database. So the chance of an open session is smaller
|
6
14
|
- Print out where the config was saved
|
7
15
|
- Print how long the import went
|
8
16
|
|
9
|
-
##
|
17
|
+
## 0.1.0 (2022-10-24)
|
10
18
|
|
11
19
|
- Initial release
|
data/Gemfile.lock
CHANGED
@@ -1,9 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
remote_database_importer (0.1.
|
5
|
-
colorize (~> 0.8)
|
6
|
-
thor (~> 1.2)
|
4
|
+
remote_database_importer (0.1.4)
|
7
5
|
tty-config (~> 0.6)
|
8
6
|
tty-spinner (~> 0.9)
|
9
7
|
|
@@ -11,7 +9,6 @@ GEM
|
|
11
9
|
remote: https://rubygems.org/
|
12
10
|
specs:
|
13
11
|
ast (2.4.2)
|
14
|
-
colorize (0.8.1)
|
15
12
|
diff-lcs (1.5.0)
|
16
13
|
json (2.6.2)
|
17
14
|
parallel (1.22.1)
|
@@ -53,7 +50,6 @@ GEM
|
|
53
50
|
standard (1.16.1)
|
54
51
|
rubocop (= 1.35.1)
|
55
52
|
rubocop-performance (= 1.14.3)
|
56
|
-
thor (1.2.1)
|
57
53
|
tty-config (0.6.0)
|
58
54
|
tty-cursor (0.7.1)
|
59
55
|
tty-spinner (0.9.3)
|
data/README.md
CHANGED
@@ -7,6 +7,7 @@ Its well possible that unexpected errors can occur.
|
|
7
7
|
## Features
|
8
8
|
- Define multiple environments (such as staging, production etc.)
|
9
9
|
- Rails intergration via rake task
|
10
|
+
- Define custom commands that should run after successful import
|
10
11
|
- Decide for yourself if the dump should be done over ssh or if pg_dump should connect to the DB port directly
|
11
12
|
- It can therefore be used for almost all hosting providers (Heroku, Kubernetes, self-hosted, etc.)
|
12
13
|
|
@@ -43,8 +44,10 @@ When you first run the rake task, it will dynamically create this file for you.
|
|
43
44
|

|
44
45
|
|
45
46
|
### DB Access
|
46
|
-
The
|
47
|
-
|
47
|
+
The dump of the remote database happens with the tool: [pg_dump](https://www.postgresql.org/docs/current/app-pgdump.html).
|
48
|
+
There are two opions for connecting to the remote databse:
|
49
|
+
- pg_dump connects directly to the databse
|
50
|
+
- pg_dump connects through a shh tunnel to the databse
|
48
51
|
|
49
52
|
The effective dump call is as follows:
|
50
53
|
```ruby
|
@@ -53,9 +56,14 @@ or
|
|
53
56
|
"pg_dump -Fc 'host=HOST dbname=DB_NAME user=DB_USER port=POSTGRES_PORT' > DB_DUMP_LOCATION"
|
54
57
|
```
|
55
58
|
|
59
|
+
### Password Input
|
60
|
+
Because this gem doesn't store passwords you will have to enter the passwords manually during the rake task.
|
61
|
+
Depending on the choosen connection model the password prompt will be for the ssh connection or the DB access.
|
62
|
+
If you choose to dump the databse over an ssh_tunnel, the easiest way will be to exchange your ssh-key with the server beforehand, so you don't have to enter a password.
|
63
|
+
|
56
64
|
## Limitations
|
57
65
|
- At the moment only Postgres databases are supported
|
58
|
-
- It has to run inside a Rails app.
|
66
|
+
- It has to run inside a Rails app.
|
59
67
|
- Not suitable for very large databases, you could run into SSH timeouts
|
60
68
|
|
61
69
|
## Contributing
|
@@ -1,32 +1,35 @@
|
|
1
1
|
module RemoteDatabaseImporter
|
2
2
|
class Config
|
3
3
|
require "tty/config"
|
4
|
-
|
4
|
+
require_relative "colorize"
|
5
5
|
|
6
|
+
attr_accessor :config
|
7
|
+
|
6
8
|
def initialize
|
7
9
|
@config = TTY::Config.new
|
8
|
-
|
9
|
-
|
10
|
-
|
10
|
+
|
11
|
+
config.filename = "remote_database_importer"
|
12
|
+
config.extname = ".yml"
|
13
|
+
config.append_path Dir.pwd
|
11
14
|
end
|
12
15
|
|
13
16
|
def read_or_create_configfile
|
14
|
-
unless
|
15
|
-
puts "==========================================================="
|
17
|
+
unless config.exist?
|
18
|
+
puts Colorize.green("===========================================================")
|
16
19
|
puts "Hi there! There is no config file yet, lets create one! 😄"
|
17
20
|
create_default_config
|
18
|
-
config_location = [
|
21
|
+
config_location = [config.filename, config.extname].join
|
19
22
|
puts "Created config file: #{config_location}"
|
20
|
-
puts "==========================================================="
|
23
|
+
puts Colorize.green("===========================================================")
|
21
24
|
end
|
22
|
-
|
25
|
+
config.read
|
23
26
|
end
|
24
27
|
|
25
28
|
def ask(question, default: nil, options: nil)
|
26
29
|
question += " (#{options.join(" / ")})" if options.present?
|
27
30
|
question += " [#{default}]" if default.present?
|
28
31
|
|
29
|
-
puts
|
32
|
+
puts Colorize.blue(question)
|
30
33
|
answer = $stdin.gets.chomp
|
31
34
|
answer.present? ? answer : default
|
32
35
|
end
|
@@ -36,20 +39,20 @@ module RemoteDatabaseImporter
|
|
36
39
|
environment_count = 1
|
37
40
|
|
38
41
|
local_db_name = ask("Whats the name of the local database you wanna import to?", default: "myawesomeapp_development")
|
39
|
-
|
42
|
+
config.set(:local_db_name, value: local_db_name)
|
40
43
|
puts
|
41
44
|
|
42
45
|
while enter_new_environments
|
43
|
-
puts "#{environment_count}. Environment"
|
46
|
+
puts Colorize.green("#{environment_count}. Environment")
|
44
47
|
env = ask("Whats the name of the #{environment_count}. environment you wanna add?", default: "staging")
|
45
48
|
puts
|
46
49
|
|
47
|
-
puts "Database settings:"
|
50
|
+
puts Colorize.green("Database settings:")
|
48
51
|
db_name = ask("Enter the DB name for the #{env} environment:", default: "myawesomeapp_#{env}")
|
49
52
|
db_user = ask("Enter the DB user for the #{env} environment:", default: "deployer")
|
50
53
|
puts
|
51
54
|
|
52
|
-
puts "Connection settings:"
|
55
|
+
puts Colorize.green("Connection settings:")
|
53
56
|
host = ask("Enter the IP or hostname of the DB server:", default: "myawesomeapp.com")
|
54
57
|
dump_type = ask("Should the DB dump happen over a ssh tunnel or can pg_dump connect to the DB port directly?", default: "pg_dump", options: ["ssh_tunnel", "pg_dump"])
|
55
58
|
|
@@ -77,7 +80,7 @@ module RemoteDatabaseImporter
|
|
77
80
|
}
|
78
81
|
}
|
79
82
|
}
|
80
|
-
|
83
|
+
config.append(env_config, to: :environments)
|
81
84
|
|
82
85
|
continue = ask("Do you wanna add another environment? (anything other than 'yes' will exit)")
|
83
86
|
if continue&.downcase == "yes"
|
@@ -87,7 +90,12 @@ module RemoteDatabaseImporter
|
|
87
90
|
end
|
88
91
|
end
|
89
92
|
|
90
|
-
|
93
|
+
puts Colorize.green("Define custom commands that run after successful import:")
|
94
|
+
custom_commands = ask("Enter semicolon separated commands that should run after importing the DB:", default: "rake db:migrate; echo 'All Done'")
|
95
|
+
puts
|
96
|
+
|
97
|
+
config.set(:custom_commands, value: custom_commands)
|
98
|
+
config.write
|
91
99
|
end
|
92
100
|
end
|
93
101
|
end
|
@@ -3,15 +3,17 @@ module RemoteDatabaseImporter
|
|
3
3
|
require "remote_database_importer/config"
|
4
4
|
require "tty/spinner/multi"
|
5
5
|
|
6
|
+
attr_accessor :config
|
7
|
+
attr_accessor :current_environment
|
8
|
+
|
6
9
|
LOG_FILE = "tmp/remote_database_importer.log"
|
7
10
|
|
8
11
|
def initialize
|
9
|
-
|
10
|
-
@config = config_handler.read_or_create_configfile
|
12
|
+
@config = RemoteDatabaseImporter::Config.new.read_or_create_configfile
|
11
13
|
end
|
12
14
|
|
13
15
|
def environments
|
14
|
-
|
16
|
+
config.fetch("environments")
|
15
17
|
end
|
16
18
|
|
17
19
|
def select_environment
|
@@ -54,9 +56,9 @@ module RemoteDatabaseImporter
|
|
54
56
|
{name: "Terminate current DB sessions", command: terminate_current_db_sessions},
|
55
57
|
{name: "Drop and create local DB", command: drop_and_create_local_db},
|
56
58
|
{name: "Restore remote DB", command: restore_db},
|
57
|
-
{name: "Run migrations", command: run_migrations},
|
58
59
|
{name: "Remove logfile", command: remove_logfile},
|
59
|
-
{name: "Remove dumpfile", command: remove_dumpfile}
|
60
|
+
{name: "Remove dumpfile", command: remove_dumpfile},
|
61
|
+
{name: "Custom commands", command: custom_commands}
|
60
62
|
]
|
61
63
|
tasks.each.with_index(1) do |task, index|
|
62
64
|
task[:spinner] = multi_spinner.register "#{index}/#{tasks.length} :spinner #{task[:name]}"
|
@@ -66,18 +68,17 @@ module RemoteDatabaseImporter
|
|
66
68
|
|
67
69
|
# terminate local db sessions, otherwise the db can't be dropped
|
68
70
|
def terminate_current_db_sessions
|
69
|
-
"psql -d #{
|
71
|
+
"psql -d #{config.fetch("local_db_name")} -c 'SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE datname = current_database() AND pid <> pg_backend_pid();' > #{LOG_FILE}"
|
70
72
|
end
|
71
73
|
|
72
74
|
def dump_remote_db
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
postgres_port = env["connection"]["postgres_port"]
|
75
|
+
host = current_environment["connection"]["host"]
|
76
|
+
db_name = current_environment["database"]["name"]
|
77
|
+
db_user = current_environment["database"]["user"]
|
78
|
+
dump_type = current_environment["connection"]["dump_type"]
|
79
|
+
ssh_user = current_environment["connection"]["ssh_user"]
|
80
|
+
ssh_port = current_environment["connection"]["ssh_port"]
|
81
|
+
postgres_port = current_environment["connection"]["postgres_port"]
|
81
82
|
|
82
83
|
if dump_type == "ssh_tunnel"
|
83
84
|
"ssh #{ssh_user}@#{host} -p #{ssh_port} 'pg_dump -Fc -U #{db_user} -d #{db_name} -h localhost -C' > #{db_dump_location}"
|
@@ -91,11 +92,7 @@ module RemoteDatabaseImporter
|
|
91
92
|
end
|
92
93
|
|
93
94
|
def restore_db
|
94
|
-
"pg_restore --jobs 8 --no-privileges --no-owner --dbname #{
|
95
|
-
end
|
96
|
-
|
97
|
-
def run_migrations
|
98
|
-
"rake db:migrate > #{LOG_FILE}"
|
95
|
+
"pg_restore --jobs 8 --no-privileges --no-owner --dbname #{config.fetch("local_db_name")} #{db_dump_location}"
|
99
96
|
end
|
100
97
|
|
101
98
|
def remove_logfile
|
@@ -106,8 +103,12 @@ module RemoteDatabaseImporter
|
|
106
103
|
"rm #{db_dump_location}"
|
107
104
|
end
|
108
105
|
|
106
|
+
def custom_commands
|
107
|
+
config.fetch("custom_commands")
|
108
|
+
end
|
109
|
+
|
109
110
|
def db_dump_location
|
110
|
-
"tmp/#{
|
111
|
+
"tmp/#{current_environment["database"]["name"]}.dump"
|
111
112
|
end
|
112
113
|
|
113
114
|
def seconds_to_human_readable_time(secs)
|
metadata
CHANGED
@@ -1,29 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: remote_database_importer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Leon Vogt
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-11-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: thor
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '1.2'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '1.2'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: tty-config
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,26 +38,11 @@ dependencies:
|
|
52
38
|
- - "~>"
|
53
39
|
- !ruby/object:Gem::Version
|
54
40
|
version: '0.9'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: colorize
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - "~>"
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0.8'
|
62
|
-
type: :runtime
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - "~>"
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0.8'
|
69
41
|
description: Dump remote databases and import it locally. At the moment only Postgres
|
70
42
|
databases are supported
|
71
43
|
email:
|
72
44
|
- nonick@nonick.ch
|
73
|
-
executables:
|
74
|
-
- remote_database_importer
|
45
|
+
executables: []
|
75
46
|
extensions: []
|
76
47
|
extra_rdoc_files: []
|
77
48
|
files:
|
@@ -83,16 +54,15 @@ files:
|
|
83
54
|
- LICENSE.txt
|
84
55
|
- README.md
|
85
56
|
- Rakefile
|
86
|
-
- bin/remote_database_importer
|
87
57
|
- lib/railtie.rb
|
88
58
|
- lib/remote_database_importer.rb
|
59
|
+
- lib/remote_database_importer/colorize.rb
|
89
60
|
- lib/remote_database_importer/config.rb
|
90
61
|
- lib/remote_database_importer/operation.rb
|
91
62
|
- lib/remote_database_importer/version.rb
|
92
63
|
- lib/tasks/remote_database_importer.rake
|
93
64
|
- readme_assets/config_sample.png
|
94
65
|
- readme_assets/import-job.gif
|
95
|
-
- readme_images/.DS_Store
|
96
66
|
- sig/remote_database_importer.rbs
|
97
67
|
homepage: https://github.com/leon-vogt/remote_database_importer
|
98
68
|
licenses:
|
@@ -1,14 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'thor'
|
4
|
-
require_relative '../lib/remote_database_importer/operation'
|
5
|
-
|
6
|
-
class RemoteDatabaseImporterCLI < Thor
|
7
|
-
desc "Restore remote database and import it locally", "asdf"
|
8
|
-
def import
|
9
|
-
importer = RemoteDatabaseImporter::Operation.new
|
10
|
-
importer.import
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
RemoteDatabaseImporterCLI.start
|
data/readme_images/.DS_Store
DELETED
Binary file
|