capistrano-postgresql 4.2.1 → 4.7.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 +5 -5
- data/.gitignore +3 -0
- data/CHANGELOG.md +24 -0
- data/README.md +9 -1
- data/capistrano-postgresql.gemspec +7 -8
- data/lib/capistrano/postgresql/helper_methods.rb +3 -1
- data/lib/capistrano/postgresql/psql_helpers.rb +19 -9
- data/lib/capistrano/postgresql/version.rb +1 -1
- data/lib/capistrano/tasks/postgresql.rake +55 -33
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: cc75baf6e5ae3f4072935434e99527a40d17ab23997b006bc5056ccaadcfaa10
|
4
|
+
data.tar.gz: f310c43d82487fde14eedbe428e10278efb2429dc0625c99f5f04e77eb8ee70d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4134b4d0711f378706881eaf7949162a7edaeeb365a1c8f6c61855f1753e6876d0ca8a5d6932d606289c1e97688834ac1707e1b23a8d1fb7dfce45cbdd51cf99
|
7
|
+
data.tar.gz: 39847b45d9d15eb0371e2b06af11c1e944db256ca758fecb026b1e30bd49ad4b9ec20207373a40ac56459c2478510583b6b01dd2984c71d6ffebc3cb403e9149
|
data/.gitignore
ADDED
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,30 @@
|
|
2
2
|
|
3
3
|
### master
|
4
4
|
|
5
|
+
## v4.6.1, 2017-12-15
|
6
|
+
- Removing require 'pry' (silly mistake)
|
7
|
+
|
8
|
+
## v4.6.0, 2017-12-10
|
9
|
+
- :pg_without_sudo added (thanks to snake66) so you can run remote psql commands on environments without sudo available.
|
10
|
+
- Fixed exists? methods, removing the need for arguments
|
11
|
+
- Printing sudo status to capistrano STDOUT
|
12
|
+
|
13
|
+
## v4.4.1, 2017-10-26
|
14
|
+
- Switched back from CREATE ROLE to CREATE USER (so LOGIN rights are granted automatically)
|
15
|
+
|
16
|
+
## v4.4.0, 2017-10-26
|
17
|
+
- :remove_yml_files task added to clean up old files on remote server
|
18
|
+
|
19
|
+
## v4.3.1, 2017-10-21
|
20
|
+
- Fixed quoting on CREATE USER so we can include integers in usernames & Quoted other values like CREATE DATABASE so they can include integers too
|
21
|
+
- Changed to createuser convention "CREATE ROLE" instead of USER (v4.4.1 reversed this)
|
22
|
+
|
23
|
+
## v4.3.0, 2017-10-21
|
24
|
+
- issues/27: raise on :deploy_to with ~ in it
|
25
|
+
- Net::SCP.upload! to replace old upload! for using :system_user
|
26
|
+
- issues/31 : psql -> psql_simple so user can be created regardless of database existence
|
27
|
+
- General cleanup
|
28
|
+
|
5
29
|
### v4.2.1, 2015-04-22
|
6
30
|
- change `on roles(:db, primary: true)` to the correct `on primary :db`
|
7
31
|
|
data/README.md
CHANGED
@@ -45,11 +45,19 @@ the following in `Capfile` file:
|
|
45
45
|
require 'capistrano/postgresql'
|
46
46
|
|
47
47
|
Make sure the `deploy_to` path exists and has the right privileges on the
|
48
|
-
server (i.e. `/var/www/myapp`).<br/>
|
48
|
+
server (i.e. `/var/www/myapp`). Warning: The ~ symbol (i.e. `~/myapp`) is not supported.<br/>
|
49
49
|
Or just install
|
50
50
|
[capistrano-safe-deploy-to](https://github.com/capistrano-plugins/capistrano-safe-deploy-to)
|
51
51
|
plugin and don't think about it.
|
52
52
|
|
53
|
+
Within your app/config/deploy/#{environment}.rb files, make sure to specify a user with ssh access to all deployment servers:
|
54
|
+
|
55
|
+
set :system_user, 'ssh_user' # defaults to root
|
56
|
+
|
57
|
+
Optionally, you can run psql commands WITHOUT sudo if needed. Set the following:
|
58
|
+
|
59
|
+
set :pg_without_sudo, true # defaults to false
|
60
|
+
|
53
61
|
To setup the server(s), run:
|
54
62
|
|
55
63
|
$ bundle exec cap production setup
|
@@ -4,10 +4,10 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'capistrano/postgresql/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |gem|
|
7
|
-
gem.name =
|
7
|
+
gem.name = 'capistrano-postgresql'
|
8
8
|
gem.version = Capistrano::Postgresql::VERSION
|
9
|
-
gem.authors = [
|
10
|
-
gem.email = [
|
9
|
+
gem.authors = ['Bruno Sutic', 'Ruben Stranders']
|
10
|
+
gem.email = ['bruno.sutic@gmail.com', 'r.stranders@gmail.com']
|
11
11
|
gem.description = <<-EOF.gsub(/^\s+/, '')
|
12
12
|
Capistrano tasks for PostgreSQL configuration and management for Rails
|
13
13
|
apps. Manages `database.yml` template on the server.
|
@@ -16,14 +16,13 @@ Gem::Specification.new do |gem|
|
|
16
16
|
https://github.com/bruno-/capistrano2-postgresql
|
17
17
|
EOF
|
18
18
|
gem.summary = %q{Creates application database user and `database.yml` on the server. No SSH login required!}
|
19
|
-
gem.homepage =
|
19
|
+
gem.homepage = 'https://github.com/capistrano-plugins/capistrano-postgresql'
|
20
20
|
|
21
|
-
gem.license =
|
21
|
+
gem.license = 'MIT'
|
22
22
|
|
23
23
|
gem.files = `git ls-files`.split($/)
|
24
|
-
gem.require_paths = [
|
24
|
+
gem.require_paths = ['lib']
|
25
25
|
|
26
26
|
gem.add_dependency 'capistrano', '>= 3.0'
|
27
|
-
|
28
|
-
gem.add_development_dependency "rake"
|
27
|
+
gem.add_development_dependency 'rake'
|
29
28
|
end
|
@@ -17,13 +17,15 @@ module Capistrano
|
|
17
17
|
|
18
18
|
# location of database.yml file on clients
|
19
19
|
def database_yml_file
|
20
|
+
raise(":deploy_to in your app/config/deploy/\#{environment}.rb file cannot contain ~") if shared_path.to_s.include?('~') # issues/27
|
20
21
|
shared_path.join('config/database.yml')
|
21
22
|
end
|
22
23
|
|
23
24
|
# location of archetypical database.yml file created on primary db role when user and
|
24
25
|
# database are first created
|
25
26
|
def archetype_database_yml_file
|
26
|
-
|
27
|
+
raise(":deploy_to in your app/config/deploy/\#{environment}.rb file cannot contain ~") if shared_path.to_s.include?('~') # issues/27
|
28
|
+
deploy_path.join('db/database.yml')
|
27
29
|
end
|
28
30
|
end
|
29
31
|
end
|
@@ -2,9 +2,13 @@ module Capistrano
|
|
2
2
|
module Postgresql
|
3
3
|
module PsqlHelpers
|
4
4
|
|
5
|
-
# returns true or false depending on the remote command exit status
|
6
5
|
def psql(*args)
|
7
|
-
|
6
|
+
# Reminder: -u #{fetch(:pg_system_user)} seen below differs slightly from -U, an option on the psql command: https://www.postgresql.org/docs/9.6/static/app-psql.html
|
7
|
+
args.unshift("-U #{fetch(:pg_system_user)}") if fetch(:pg_without_sudo) # Add the :pg_system_user to psql command since we aren't using sudo anymore
|
8
|
+
# test :sudo, "-u #{fetch(:pg_system_user)} psql", *args
|
9
|
+
cmd = [ :psql, *args ]
|
10
|
+
cmd = [ :sudo, "-u #{fetch(:pg_system_user)}", *cmd ] unless fetch(:pg_without_sudo)
|
11
|
+
test *cmd.flatten
|
8
12
|
end
|
9
13
|
|
10
14
|
# Runs psql on the application database
|
@@ -12,18 +16,24 @@ module Capistrano
|
|
12
16
|
psql_on_db(fetch(:pg_database), *args)
|
13
17
|
end
|
14
18
|
|
15
|
-
def db_user_exists?
|
16
|
-
|
19
|
+
def db_user_exists?
|
20
|
+
psql_on_db fetch(:pg_system_db),'-tAc', %Q{"SELECT 1 FROM pg_roles WHERE rolname='#{fetch(:pg_user)}';" | grep -q 1}
|
17
21
|
end
|
18
22
|
|
19
|
-
def database_exists?
|
20
|
-
|
23
|
+
def database_exists?
|
24
|
+
psql_on_db fetch(:pg_system_db), '-tAc', %Q{"SELECT 1 FROM pg_database WHERE datname='#{fetch(:pg_database)}';" | grep -q 1}
|
21
25
|
end
|
22
26
|
|
23
27
|
private
|
24
|
-
|
25
|
-
|
26
|
-
|
28
|
+
|
29
|
+
def psql_on_db(db_name, *args)
|
30
|
+
args.unshift("-U #{fetch(:pg_system_user)}") if fetch(:pg_without_sudo) # Add the :pg_system_user to psql command since we aren't using sudo anymore
|
31
|
+
cmd = [ :psql, "-d #{db_name}", *args ]
|
32
|
+
cmd = [ :sudo, "-u #{fetch(:pg_system_user)}", *cmd ] unless fetch(:pg_without_sudo)
|
33
|
+
test *cmd.flatten
|
34
|
+
#test :sudo, "-u #{fetch(:pg_system_user)} psql -d #{db_name}", *args
|
35
|
+
end
|
36
|
+
|
27
37
|
end
|
28
38
|
end
|
29
39
|
end
|
@@ -8,11 +8,13 @@ include Capistrano::Postgresql::PsqlHelpers
|
|
8
8
|
|
9
9
|
namespace :load do
|
10
10
|
task :defaults do
|
11
|
+
set :system_user, 'root' # Used for SCP commands to deploy files to remote servers
|
11
12
|
set :pg_database, -> { "#{fetch(:application)}_#{fetch(:stage)}" }
|
12
13
|
set :pg_user, -> { fetch(:pg_database) }
|
13
14
|
set :pg_ask_for_password, false
|
14
15
|
set :pg_password, -> { ask_for_or_generate_password }
|
15
16
|
set :pg_system_user, 'postgres'
|
17
|
+
set :pg_without_sudo, false # issues/22 | Contributed by snake66
|
16
18
|
set :pg_system_db, 'postgres'
|
17
19
|
set :pg_use_hstore, false
|
18
20
|
set :pg_extensions, []
|
@@ -29,7 +31,6 @@ namespace :load do
|
|
29
31
|
primary(:db).hostname
|
30
32
|
end
|
31
33
|
end
|
32
|
-
|
33
34
|
end
|
34
35
|
end
|
35
36
|
|
@@ -58,31 +59,25 @@ namespace :postgresql do
|
|
58
59
|
end
|
59
60
|
|
60
61
|
on roles :db do
|
61
|
-
psql '-c', %Q{"DROP database #{fetch(:pg_database)};"}
|
62
|
-
psql '-c', %Q{"DROP user #{fetch(:pg_user)};"}
|
62
|
+
psql '-c', %Q{"DROP database \\"#{fetch(:pg_database)}\\";"}
|
63
|
+
psql '-c', %Q{"DROP user \\"#{fetch(:pg_user)}\\";"}
|
63
64
|
end
|
64
65
|
end
|
65
66
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
67
|
+
task :remove_yml_files do
|
68
|
+
on release_roles :all do
|
69
|
+
if test "[ -e #{database_yml_file} ]"
|
70
|
+
execute :rm, database_yml_file
|
71
|
+
end
|
71
72
|
end
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
task :add_extensions do
|
76
|
-
next unless Array( fetch(:pg_extensions) ).any?
|
77
|
-
on roles :db do
|
78
|
-
# add extensions if extension is present
|
79
|
-
Array( fetch(:pg_extensions) ).each do |ext|
|
80
|
-
psql_on_app_db '-c', %Q{"CREATE EXTENSION IF NOT EXISTS #{ext};"} unless [nil, false, ""].include?(ext)
|
73
|
+
on primary :db do
|
74
|
+
if test "[ -e #{archetype_database_yml_file} ]"
|
75
|
+
execute :rm, archetype_database_yml_file
|
81
76
|
end
|
82
77
|
end
|
83
78
|
end
|
84
79
|
|
85
|
-
desc
|
80
|
+
desc 'Remove pg_extension from postgresql db'
|
86
81
|
task :remove_extensions do
|
87
82
|
next unless Array( fetch(:pg_extensions) ).any?
|
88
83
|
on roles :db do
|
@@ -93,13 +88,26 @@ namespace :postgresql do
|
|
93
88
|
end
|
94
89
|
end
|
95
90
|
|
96
|
-
desc '
|
97
|
-
task :
|
91
|
+
desc 'Add the hstore extension to postgresql'
|
92
|
+
task :add_hstore do
|
93
|
+
next unless fetch(:pg_use_hstore)
|
98
94
|
on roles :db do
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
95
|
+
psql_on_app_db '-c', %Q{"CREATE EXTENSION IF NOT EXISTS hstore;"}
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
desc 'Add pg_extension to postgresql db'
|
100
|
+
task :add_extensions do
|
101
|
+
next unless Array( fetch(:pg_extensions) ).any?
|
102
|
+
on roles :db do
|
103
|
+
Array( fetch(:pg_extensions) ).each do |ext|
|
104
|
+
next if [nil, false, ""].include?(ext)
|
105
|
+
if psql_on_app_db '-c', %Q{"CREATE EXTENSION IF NOT EXISTS #{ext};"}
|
106
|
+
puts "- Added extension #{ext} to #{fetch(:pg_database)}"
|
107
|
+
else
|
108
|
+
error "postgresql: adding extension #{ext} failed!"
|
109
|
+
exit 1
|
110
|
+
end
|
103
111
|
end
|
104
112
|
end
|
105
113
|
end
|
@@ -107,14 +115,26 @@ namespace :postgresql do
|
|
107
115
|
desc 'Create database'
|
108
116
|
task :create_database do
|
109
117
|
on roles :db do
|
110
|
-
next if database_exists?
|
111
|
-
unless
|
118
|
+
next if database_exists?
|
119
|
+
unless psql_on_db fetch(:pg_system_db), '-c', %Q{"CREATE DATABASE \\"#{fetch(:pg_database)}\\" OWNER \\"#{fetch(:pg_user)}\\";"}
|
112
120
|
error 'postgresql: creating database failed!'
|
113
121
|
exit 1
|
114
122
|
end
|
115
123
|
end
|
116
124
|
end
|
117
125
|
|
126
|
+
desc 'Create DB user'
|
127
|
+
task :create_db_user do
|
128
|
+
on roles :db do
|
129
|
+
next if db_user_exists?
|
130
|
+
# 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.
|
131
|
+
unless psql_on_db fetch(:pg_system_db), '-c', %Q{"CREATE USER \\"#{fetch(:pg_user)}\\" PASSWORD '#{fetch(:pg_password)}';"}
|
132
|
+
error 'postgresql: creating database user failed!'
|
133
|
+
exit 1
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
118
138
|
# This task creates the archetype database.yml file on the primary db server. This is done once when a
|
119
139
|
# new DB user is created.
|
120
140
|
desc 'Generate database.yml archetype'
|
@@ -122,7 +142,7 @@ namespace :postgresql do
|
|
122
142
|
on primary :db do
|
123
143
|
next if test "[ -e #{archetype_database_yml_file} ]"
|
124
144
|
execute :mkdir, '-pv', File.dirname(archetype_database_yml_file)
|
125
|
-
upload! pg_template('postgresql.yml.erb'), archetype_database_yml_file
|
145
|
+
Net::SCP.upload!(fetch(:pg_host), fetch(:system_user), pg_template('postgresql.yml.erb'), archetype_database_yml_file)
|
126
146
|
end
|
127
147
|
end
|
128
148
|
|
@@ -136,8 +156,8 @@ namespace :postgresql do
|
|
136
156
|
end
|
137
157
|
|
138
158
|
on release_roles :all do
|
139
|
-
execute :mkdir, '-pv',
|
140
|
-
upload! StringIO.new(database_yml_contents), database_yml_file
|
159
|
+
execute :mkdir, '-pv', File.dirname(database_yml_file)
|
160
|
+
Net::SCP.upload!(self.host.hostname, fetch(:system_user), StringIO.new(database_yml_contents), database_yml_file)
|
141
161
|
end
|
142
162
|
end
|
143
163
|
|
@@ -149,12 +169,14 @@ namespace :postgresql do
|
|
149
169
|
|
150
170
|
desc 'Postgresql setup tasks'
|
151
171
|
task :setup do
|
152
|
-
|
153
|
-
invoke
|
172
|
+
puts "* ============================= * \n All psql commands will be run #{fetch(:pg_without_sudo) ? 'without sudo' : 'with sudo'}\n You can modify this in your deploy/{env}.rb by setting the pg_without_sudo boolean \n* ============================= *"
|
173
|
+
invoke 'postgresql:remove_yml_files' # Delete old yml files. Allows you to avoid having to manually delete the files on your web/app servers to get a new pool size for example.
|
174
|
+
invoke 'postgresql:create_db_user'
|
175
|
+
invoke 'postgresql:create_database'
|
154
176
|
invoke 'postgresql:add_hstore'
|
155
177
|
invoke 'postgresql:add_extensions'
|
156
|
-
invoke
|
157
|
-
invoke
|
178
|
+
invoke 'postgresql:generate_database_yml_archetype'
|
179
|
+
invoke 'postgresql:generate_database_yml'
|
158
180
|
end
|
159
181
|
end
|
160
182
|
|
metadata
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capistrano-postgresql
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bruno Sutic
|
8
|
+
- Ruben Stranders
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date:
|
12
|
+
date: 2017-12-18 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: capistrano
|
@@ -45,10 +46,12 @@ description: |
|
|
45
46
|
https://github.com/bruno-/capistrano2-postgresql
|
46
47
|
email:
|
47
48
|
- bruno.sutic@gmail.com
|
49
|
+
- r.stranders@gmail.com
|
48
50
|
executables: []
|
49
51
|
extensions: []
|
50
52
|
extra_rdoc_files: []
|
51
53
|
files:
|
54
|
+
- ".gitignore"
|
52
55
|
- CHANGELOG.md
|
53
56
|
- Gemfile
|
54
57
|
- LICENSE.md
|
@@ -85,7 +88,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
85
88
|
version: '0'
|
86
89
|
requirements: []
|
87
90
|
rubyforge_project:
|
88
|
-
rubygems_version: 2.
|
91
|
+
rubygems_version: 2.7.3
|
89
92
|
signing_key:
|
90
93
|
specification_version: 4
|
91
94
|
summary: Creates application database user and `database.yml` on the server. No SSH
|