capistrano-postgresql 5.0.1 → 6.0.0
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 +6 -0
- data/README.md +16 -14
- data/capistrano-postgresql.gemspec +1 -0
- data/lib/capistrano/postgresql/helper_methods.rb +3 -8
- data/lib/capistrano/postgresql/psql_helpers.rb +13 -4
- data/lib/capistrano/postgresql/version.rb +1 -1
- data/lib/capistrano/tasks/postgresql.rake +7 -3
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5c0f485e4bf0ea288af9b0afaad45e95efc68b817442c347db9e169aa5853128
|
4
|
+
data.tar.gz: 32a1785b99b1933d44a6a5d6da5b24c066e004915c9f80c7be2169070683d025
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 169cb53f9f4ca8b51ca400faad4500f1e6f7aab18388790cdb0f13092aff14b4a1422d0957b426bc49cbe65f9740bfe0c76aea90d34b7352c74e3291b350ec06
|
7
|
+
data.tar.gz: c64cd51211d920d55bbbd4e5955d401dd6ce013290d00ff2807e3e02cd6378af380bd3abb89fafbdc341cf03e81b47f30be4fd3c53720f3f9e6e61ae5ccd4bcb
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,12 @@
|
|
2
2
|
|
3
3
|
### master
|
4
4
|
|
5
|
+
## v6.0.0, 2018-07-09
|
6
|
+
- Fix for pg_without_sudo; Wasn't adding -U to args
|
7
|
+
- New feature that will ALTER USER/Password with any change to pg_password. Random passwords will cause each cap setup to run the ALTER USER, but that's fine as a user should technically only be using setup initially. It's not that hard to obtain the new password if this happens.
|
8
|
+
- New redaction for logging of passwords & SSHKIT 1.17.0 in gemspec
|
9
|
+
- README updates
|
10
|
+
|
5
11
|
## v5.0.1, 2018-06-05
|
6
12
|
- Quick fix for fetch(:pg_database) on extension adding
|
7
13
|
|
data/README.md
CHANGED
@@ -27,7 +27,7 @@ Put the following in your application's `Gemfile`:
|
|
27
27
|
|
28
28
|
group :development do
|
29
29
|
gem 'capistrano', '~> 3.2.0'
|
30
|
-
gem 'capistrano-postgresql', '~>
|
30
|
+
gem 'capistrano-postgresql', '~> 6.0.0'
|
31
31
|
end
|
32
32
|
|
33
33
|
Then:
|
@@ -36,7 +36,7 @@ Then:
|
|
36
36
|
|
37
37
|
### Usage
|
38
38
|
|
39
|
-
In a standard RAILS app, you need to
|
39
|
+
In a standard RAILS app, you need to put the following in `Capfile` file:
|
40
40
|
|
41
41
|
```
|
42
42
|
require 'capistrano/postgresql'
|
@@ -45,26 +45,28 @@ require 'capistrano/postgresql'
|
|
45
45
|
You need to include ONLY ONE of the following in your config/deploy/*.rb files:
|
46
46
|
|
47
47
|
```
|
48
|
-
set :pg_password, ENV['DATABASE_USER_PASSWORD']
|
49
|
-
set :pg_ask_for_password, true
|
50
|
-
set :pg_generate_random_password, true
|
48
|
+
set :pg_password, ENV['DATABASE_USER_PASSWORD'] # Example is an ENV value, but you can use a string instead
|
49
|
+
set :pg_ask_for_password, true # Prompts user for password on execution of setup
|
50
|
+
set :pg_generate_random_password, true # Generates a random password on each setup
|
51
51
|
```
|
52
52
|
|
53
|
+
##### Execution of `cap ENV setup` will run ALTER USER on pg_username if there is a different password. If you're using :pg_generate_random_password, you'll get a new random password on each run.
|
54
|
+
|
53
55
|
Example config:
|
54
56
|
|
55
57
|
```
|
56
|
-
server '
|
58
|
+
server 'yoursite.net', user: 'growtrader', roles: %w{app db}
|
57
59
|
set :stage, :development
|
58
60
|
set :branch, 'development'
|
59
61
|
# ==================
|
60
62
|
# Postgresql setup
|
61
63
|
set :pg_without_sudo, false
|
62
|
-
set :pg_host, '
|
63
|
-
set :pg_database, '
|
64
|
-
set :pg_username, '
|
64
|
+
set :pg_host, 'db.yoursite.net'
|
65
|
+
set :pg_database, 'pg_database_name_here'
|
66
|
+
set :pg_username, 'pg_username_here'
|
65
67
|
#set :pg_generate_random_password, true
|
66
68
|
#set :pg_ask_for_password, true
|
67
|
-
set :pg_password, ENV['
|
69
|
+
set :pg_password, ENV['yoursite_PGPASS']
|
68
70
|
set :pg_extensions, ['citext','hstore']
|
69
71
|
set :pg_encoding, 'UTF-8'
|
70
72
|
set :pg_pool, '100'
|
@@ -72,15 +74,15 @@ set :pg_pool, '100'
|
|
72
74
|
|
73
75
|
Finally, to setup the server(s), run:
|
74
76
|
|
75
|
-
$ bundle exec cap
|
77
|
+
$ bundle exec cap development setup
|
76
78
|
|
77
79
|
### Requirements
|
78
|
-
|
79
80
|
* Be sure to remove `config/database.yml` from your application's version control.
|
80
|
-
* Your pg_hba.conf must include `local all all trust
|
81
|
+
* Your pg_hba.conf must include `local all all trust`. We ssh into the servers to execute psql commands.
|
81
82
|
* Make sure the `deploy_to` path exists and has the right privileges on your servers. The ~ symbol (i.e. `~/myapp`) is not supported.
|
82
|
-
* Within your app/config/deploy/{env}.rb files, you need to specify at least one :app and one :db server
|
83
|
+
* Within your app/config/deploy/{env}.rb files, you need to specify at least one :app and one :db server (they can be on the same host; `roles: %w{web app db}`)
|
83
84
|
* If you have multiple :db role hosts, it's necessary to specify `:primary => true` on the end of your primary :db server.
|
85
|
+
* gem >= 6.0.0 requires SSHKIT >= 1.17.0 as passwords are redacted from logging.
|
84
86
|
|
85
87
|
### How it works
|
86
88
|
|
@@ -20,7 +20,7 @@ module Capistrano
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
def generate_database_yml_io
|
23
|
+
def generate_database_yml_io
|
24
24
|
StringIO.open do |s|
|
25
25
|
s.puts "#{fetch(:pg_env)}:"
|
26
26
|
{
|
@@ -29,7 +29,7 @@ module Capistrano
|
|
29
29
|
database: fetch(:pg_database),
|
30
30
|
pool: fetch(:pg_pool),
|
31
31
|
username: fetch(:pg_username),
|
32
|
-
password:
|
32
|
+
password: fetch(:pg_password),
|
33
33
|
host: fetch(:pg_host),
|
34
34
|
socket: fetch(:pg_socket),
|
35
35
|
port: fetch(:pg_port),
|
@@ -45,12 +45,7 @@ module Capistrano
|
|
45
45
|
raise('Regeneration of archetype database.yml need the original file to update from.') if archetype_file.nil?
|
46
46
|
raise('Cannot update a custom postgresql.yml.erb file.') if File.exists?(config_file) # Skip custom postgresql.yml.erb if we're updating. It's not supported
|
47
47
|
# Update yml file from settings
|
48
|
-
|
49
|
-
current_password = archetype_file.split("\n").grep(/password/)[0].split('password:')[1].strip
|
50
|
-
generate_database_yml_io(current_password)
|
51
|
-
else
|
52
|
-
generate_database_yml_io
|
53
|
-
end
|
48
|
+
generate_database_yml_io
|
54
49
|
else
|
55
50
|
if File.exists?(config_file) # If there is a customized file in your rails app template directory, use it and convert any ERB
|
56
51
|
StringIO.new ERB.new(File.read(config_file)).result(binding)
|
@@ -3,16 +3,19 @@ module Capistrano
|
|
3
3
|
module PsqlHelpers
|
4
4
|
|
5
5
|
def psql(type, database, *args)
|
6
|
-
cmd = [ :psql, "-d #{database}", *args ]
|
7
6
|
if fetch(:pg_without_sudo)
|
8
|
-
|
7
|
+
# Add the :pg_system_user to psql command since we aren't using sudo anymore
|
8
|
+
cmd = [ :psql, "-d #{database}", *args.unshift("-U #{fetch(:pg_system_user)}") ]
|
9
9
|
else
|
10
10
|
cmd = [:sudo, "-i -u #{fetch(:pg_system_user)}", *cmd]
|
11
11
|
end
|
12
|
+
# Allow us to execute the different sshkit commands
|
12
13
|
if type == 'test'
|
13
|
-
test *cmd
|
14
|
+
test *cmd
|
15
|
+
elsif type == 'capture'
|
16
|
+
capture *cmd
|
14
17
|
else
|
15
|
-
execute *cmd
|
18
|
+
execute *cmd
|
16
19
|
end
|
17
20
|
end
|
18
21
|
|
@@ -20,6 +23,12 @@ module Capistrano
|
|
20
23
|
psql 'test', fetch(:pg_system_db),'-tAc', %Q{"SELECT 1 FROM pg_roles WHERE rolname='#{fetch(:pg_username)}';" | grep -q 1}
|
21
24
|
end
|
22
25
|
|
26
|
+
def database_user_password_different?
|
27
|
+
current_password_md5 = psql 'capture', fetch(:pg_system_db),'-tAc', %Q{"select passwd from pg_shadow WHERE usename='#{fetch(:pg_username)}';"}
|
28
|
+
new_password_md5 = "md5#{Digest::MD5.hexdigest("#{fetch(:pg_password)}#{fetch(:pg_username)}")}"
|
29
|
+
current_password_md5 == new_password_md5 ? false : true
|
30
|
+
end
|
31
|
+
|
23
32
|
def database_exists?
|
24
33
|
psql 'test', fetch(:pg_system_db), '-tAc', %Q{"SELECT 1 FROM pg_database WHERE datname='#{fetch(:pg_database)}';" | grep -q 1}
|
25
34
|
end
|
@@ -82,12 +82,16 @@ namespace :postgresql do
|
|
82
82
|
end
|
83
83
|
end
|
84
84
|
|
85
|
-
desc 'Create pg_username in database'
|
85
|
+
desc 'Create or update pg_username in database'
|
86
86
|
task :create_database_user do
|
87
87
|
on roles :db do
|
88
88
|
unless database_user_exists?
|
89
89
|
# If you use CREATE USER instead of CREATE ROLE the LOGIN right is granted automatically; otherwise you must specify it in the WITH clause of the CREATE statement.
|
90
|
-
psql 'execute', fetch(:pg_system_db), '-c', %Q{"CREATE USER \\"#{fetch(:pg_username)}\\" PASSWORD '#{fetch(:pg_password)}';"}
|
90
|
+
psql 'execute', fetch(:pg_system_db), '-c', %Q{"CREATE USER \\"#{fetch(:pg_username)}\\" PASSWORD}, redact("'#{fetch(:pg_password)}'"), %Q{;"}
|
91
|
+
end
|
92
|
+
if database_user_password_different?
|
93
|
+
# Ensure updating the password in your deploy/ENV.rb files updates the user, server side
|
94
|
+
psql 'execute', fetch(:pg_system_db), '-c', %Q{"ALTER USER \\"#{fetch(:pg_username)}\\" WITH PASSWORD}, redact("'#{fetch(:pg_password)}'"), %Q{;"}
|
91
95
|
end
|
92
96
|
end
|
93
97
|
end
|
@@ -140,7 +144,6 @@ namespace :postgresql do
|
|
140
144
|
if release_roles(:app).empty?
|
141
145
|
warn " WARNING: There are no servers in your app/config/deploy/#{fetch(:rails_env)}.rb with a :app role... Skipping Postgresql setup."
|
142
146
|
else
|
143
|
-
invoke 'postgresql:remove_app_database_yml_files' # Deletes old yml files from all servers. Allows you to avoid having to manually delete the files on your app servers to get a new pool size for example. Don't touch the archetype file to avoid deleting generated passwords.
|
144
147
|
if release_roles(:db).empty? # Test to be sure we have a :db role host
|
145
148
|
warn " WARNING: There is no server in your app/config/deploy/#{fetch(:rails_env)}.rb with a :db role... Skipping Postgresql setup."
|
146
149
|
elsif !fetch(:pg_password) && !fetch(:pg_generate_random_password) && !fetch(:pg_ask_for_password)
|
@@ -148,6 +151,7 @@ namespace :postgresql do
|
|
148
151
|
elsif fetch(:pg_generate_random_password) && fetch(:pg_ask_for_password)
|
149
152
|
warn " WARNING: You cannot have both :pg_generate_random_password and :pg_ask_for_password enabled in app/config/deploy/#{fetch(:rails_env)}.rb."
|
150
153
|
else
|
154
|
+
invoke 'postgresql:remove_app_database_yml_files' # Deletes old yml files from all servers. Allows you to avoid having to manually delete the files on your app servers to get a new pool size for example. Don't touch the archetype file to avoid deleting generated passwords.
|
151
155
|
invoke 'postgresql:create_database_user'
|
152
156
|
invoke 'postgresql:create_database'
|
153
157
|
invoke 'postgresql:add_extensions'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capistrano-postgresql
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 6.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bruno Sutic
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2018-
|
12
|
+
date: 2018-07-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: capistrano
|
@@ -25,6 +25,20 @@ dependencies:
|
|
25
25
|
- - ">="
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
version: '3.0'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: sshkit
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: 1.17.0
|
35
|
+
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: 1.17.0
|
28
42
|
- !ruby/object:Gem::Dependency
|
29
43
|
name: rake
|
30
44
|
requirement: !ruby/object:Gem::Requirement
|