capistrano-postgresql 3.0.1 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8268ca43327dee94bcb0286b28830e5835fdf867
4
- data.tar.gz: 277c459ccd2660f3cc4daaecd638f6d79d43e10e
3
+ metadata.gz: a4979d4dae2bd808a75c9656d8206de81940ed8a
4
+ data.tar.gz: 985c1c832fcde7f17e129e196e1a4d41ee19420f
5
5
  SHA512:
6
- metadata.gz: 8ab557923a1b61c8979920759870153812e2e7aada895679fdddcc0e2ab2cc2b8b4713b709912c99b37faecb0fa12a8bb35985cfe6ad13ab4a6aee7a2341af93
7
- data.tar.gz: 1cc9cc010a2ab99fd7f5efc61256ac27f6e123e001b71c26a1c49ac1fb253f5897421e3dc9f684e6ef4151636c8f3e95900722e7b53be7ac82c707153e00d6cf
6
+ metadata.gz: dc3160801f01359dfe35aad44085910b8056ddf09be8e194caff6b0dbb70e0427f469a6223e288c32a10d97085d5d67f55f0cd13237428ab753df08b0bb4da79
7
+ data.tar.gz: c4cf87e7bff7d00e1163f50cdd54e9a9bca1ad55b0be1c9bd2bb96edf9a289006bc0a3dc7a4e0058682e57cc01e123caa8469070abff0380ed80c8c68b6a2bbb
data/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
+ # Changelog
2
+
3
+ ### master
4
+
5
+ ### v4.0.0, 2014-10-06
6
+ - enable setting DB environment with `rails_env` option. If `rails_env` is not
7
+ set, `stage` option is used as until now. (@bruno-)
8
+ - create a task that helps with the upgrade to gem version 4 (@bruno-)
9
+ - optionally create a hstore extension on the server (@rhomeister)
10
+ - `database.yml` is now copied to all release_roles (@rhomeister)
11
+ - introduce archetype `database.yml` that is stored on primary `db` node and
12
+ is copied to all `release` nodes on `setup` task (@rhomeister)
13
+
1
14
  ### v3.0.0, 2014-04-11
2
15
  - all the work is moved to the `setup` task
16
+
3
17
  ### v2.0.0, 2014-03-30
4
18
  - shorten variable names: postgresql -> pg
5
19
  - better helpers module separation
@@ -7,5 +21,6 @@
7
21
  - lots of code improvements
8
22
  - less layered and simpler code
9
23
  - readme updates
24
+
10
25
  ### v1.0.0, 2014-03-19
11
26
  - all the v1.0.0 features
data/README.md CHANGED
@@ -15,17 +15,22 @@ Here are the specific things this plugin does for your capistrano deployment
15
15
  process:
16
16
 
17
17
  * creates a new PostgreSQL database and database user on the server
18
- * generates and populates `database.yml` file
18
+ * generates and populates `database.yml` file on all release nodes
19
19
  (no need to ssh to the server and do this manually!)
20
20
  * zero-config
21
+ * support for multi-server setup: separate `db` and `app` nodes (from version 4.0)
22
+
23
+ **Note**: gem version 4 introduces some breaking changes. If you installed gem
24
+ version 3 or below you might want to follow the
25
+ [upgrade instructions](https://github.com/capistrano-plugins/capistrano-postgresql/wiki/Upgrade-instructions-for-gem-version-4.0).
21
26
 
22
27
  ### Installation
23
28
 
24
29
  Put the following in your application's `Gemfile`:
25
30
 
26
31
  group :development do
27
- gem 'capistrano', '~> 3.1'
28
- gem 'capistrano-postgresql', '~> 3.0'
32
+ gem 'capistrano', '~> 3.2.0'
33
+ gem 'capistrano-postgresql', '~> 4.0.0'
29
34
  end
30
35
 
31
36
  Then:
@@ -42,139 +47,43 @@ the following in `Capfile` file:
42
47
  Make sure the `deploy_to` path exists and has the right privileges on the
43
48
  server (i.e. `/var/www/myapp`).<br/>
44
49
  Or just install
45
- [capistrano-safe-deploy-to](https://github.com/bruno-/capistrano-safe-deploy-to)
50
+ [capistrano-safe-deploy-to](https://github.com/capistrano-plugins/capistrano-safe-deploy-to)
46
51
  plugin and don't think about it.
47
52
 
48
- To setup the server, run:
53
+ To setup the server(s), run:
49
54
 
50
55
  $ bundle exec cap production setup
51
56
 
52
- Easy, right?
53
-
54
- Check below to see what happens in the background.
55
-
56
- ### How it works
57
-
58
- Check here for the full capistrano deployment flow
59
- [http://capistranorb.com/documentation/getting-started/flow/](http://capistranorb.com/documentation/getting-started/flow/).
60
-
61
- The following tasks run during the `setup` task:
62
-
63
- * `postgresql:create_db_user`<br/>
64
- creates a postgresql user. Password for the user is automatically generated and
65
- used in the next steps.
66
- * `postgresql:create_database`<br/>
67
- creates database for your app.
68
- * `postgresql:generate_database_yml`<br/>
69
- creates a `database.yml` file and copies it to
70
- `#{shared_path}/config/database.yml` on the server.
71
-
72
- Also, the plugin ensures `config/database.yml` is symlinked from `shared_path`.
73
- The above tasks are all you need for getting a Rails app to work with PostgreSQL.
74
-
75
57
  ### Gotchas
76
58
 
77
59
  Be sure to remove `config/database.yml` from your application's version control.
78
60
 
79
- ### Configuration
80
-
81
- This plugin should just work with no configuration whatsoever. However,
82
- configuration is possible. Put all your configs in capistrano stage files i.e.
83
- `config/deploy/production.rb`.
84
-
85
- Here's the list of options and the defaults for each option:
86
-
87
- * `set :pg_database`<br/>
88
- Name of the database for your app. Defaults to `#{application}_#{stage}`,
89
- example: `myface_production`.
90
-
91
- * `set :pg_user`<br/>
92
- Name of the database user. Defaults to whatever is set for `pg_database`
93
- option.
94
-
95
- * `set :pg_password`<br/>
96
- Password for the database user. By default this option is not set and a
97
- **new random password** is generated each time you create a new database.<br/>
98
- If you set this option to `"some_secure_password"` - that will be the db user's
99
- password. Keep in mind that having a hardcoded password in `deploy.rb` (or
100
- anywhere in version control) is a bad practice.<br/>
101
- I recommend sticking to the default and generating a new secure and random
102
- password each time a db user is generated. That way you don't have to worry
103
- about it or try to remember it.
104
-
105
- * `set :pg_ask_for_password`<br/>
106
- Default `false`. Set this option to `true` if you want to be prompted for the
107
- password when database user is created. This is safer than setting the password
108
- via `pg_password`. The downside is you have to choose and remember
109
- yet another fricking password.<br/>
110
- `pg_password` option has precedence. If it is set,
111
- `pg_ask_for_password` is ignored.
112
-
113
- * `set :pg_system_user`<br/>
114
- Default `postgres`. Set this option to the user that owns the postgres process
115
- on your system. Normally the default is fine, but for instance on FreeBSD the
116
- default prostgres user is `pgsql`.
61
+ ### How it works
117
62
 
118
- * `set :pg_system_db`<br/>
119
- Default `postgres`. Set this if the system database don't have the standard name.
120
- Usually there should be no reason to change this from the default.
63
+ [How the plugin works](https://github.com/capistrano-plugins/capistrano-postgresql/wiki/How-it-works)
64
+ wiki page contains a list of actions the plugin executes.
121
65
 
122
- `database.yml` template-only settings:
66
+ Read it only if you want to learn more about the plugin internals.
123
67
 
124
- * `set :pg_pool`<br/>
125
- Pool config in `database.yml` template. Defaults to `5`.
68
+ ### Configuration
126
69
 
127
- * `set :pg_host`<br/>
128
- `hostname` config in `database.yml` template. Defaults to `localhost`.
70
+ A full
71
+ [list of configuration options](https://github.com/capistrano-plugins/capistrano-postgresql/wiki/Configuration-options).
129
72
 
130
- * `set :pg_encoding`<br/>
131
- `encoding` config in `database.yml` template. Defaults to `unicode`.
73
+ The list can be overwhelming so consult it only if you're looking for something
74
+ specific.
132
75
 
133
76
  ### Customizing the `database.yml` template
134
77
 
135
- This is the default `database.yml` template that gets copied to the capistrano
136
- shared directory on the server:
137
-
138
- ```yml
139
- <%= fetch :stage %>:
140
- adapter: postgresql
141
- encoding: <%= pg_encoding %>
142
- database: <%= pg_database %>
143
- pool: <%= pg_pool %>
144
- username: <%= pg_user %>
145
- password: '<%= pg_password %>'
146
- host: <%= pg_host %>
147
- ```
148
-
149
- If for any reason you want to edit or tweak this template, you can copy it to
150
- `config/deploy/templates/postgresql.yml.erb` with this command:
151
-
152
- $ bundle exec rails g capistrano:postgresql:template
153
-
154
- After you edit this newly created file in your repo, it will be used as a
155
- template for `database.yml` on the server.
156
-
157
- You can configure the template location. For example:
158
- `set :pg_templates_path, "config"` and the template will be copied to
159
- `config/postgresql.yml.erb`.
78
+ [Wiki page about the database.yml format](https://github.com/capistrano-plugins/capistrano-postgresql/wiki/Customizing-the-database.yml-template).
160
79
 
161
80
  ### More Capistrano automation?
162
81
 
163
- If you'd like to streamline your Capistrano deploys, you might want to check
164
- these zero-configuration, plug-n-play plugins:
165
-
166
- - [capistrano-unicorn-nginx](https://github.com/bruno-/capistrano-unicorn-nginx)<br/>
167
- no-configuration unicorn and nginx setup with sensible defaults
168
- - [capistrano-rbenv-install](https://github.com/bruno-/capistrano-rbenv-install)<br/>
169
- would you like Capistrano to install rubies for you?
170
- - [capistrano-safe-deploy-to](https://github.com/bruno-/capistrano-safe-deploy-to)<br/>
171
- if you're annoyed that Capistrano does **not** create a deployment path for the
172
- app on the server (default `/var/www/myapp`), this is what you need!
82
+ Check out [capistrano-plugins](https://github.com/capistrano-plugins) github org.
173
83
 
174
84
  ### Contributing and bug reports
175
85
 
176
- Contributions and improvements are very welcome. Just open a pull request and
177
- I'll look it up shortly.
86
+ Contributions and improvements are very welcome.
178
87
 
179
88
  If something is not working for you, or you find a bug please report it.
180
89
 
@@ -15,10 +15,16 @@ module Capistrano
15
15
  StringIO.new ERB.new(File.read(config_file)).result(binding)
16
16
  end
17
17
 
18
+ # location of database.yml file on clients
18
19
  def database_yml_file
19
20
  shared_path.join('config/database.yml')
20
21
  end
21
22
 
23
+ # location of archetypical database.yml file created on primary db role when user and
24
+ # database are first created
25
+ def archetype_database_yml_file
26
+ deploy_path.join("db/database.yml")
27
+ end
22
28
  end
23
29
  end
24
30
  end
@@ -4,7 +4,12 @@ module Capistrano
4
4
 
5
5
  # returns true or false depending on the remote command exit status
6
6
  def psql(*args)
7
- test :sudo, "-u #{fetch(:pg_system_user)} psql -d #{fetch(:pg_system_db)}", *args
7
+ psql_on_db(fetch(:pg_system_db), *args)
8
+ end
9
+
10
+ # Runs psql on the application database
11
+ def psql_on_app_db(*args)
12
+ psql_on_db(fetch(:pg_database), *args)
8
13
  end
9
14
 
10
15
  def db_user_exists?(name)
@@ -15,6 +20,10 @@ module Capistrano
15
20
  psql '-tAc', %Q{"SELECT 1 FROM pg_database WHERE datname='#{db_name}';" | grep -q 1}
16
21
  end
17
22
 
23
+ private
24
+ def psql_on_db(db_name, *args)
25
+ test :sudo, "-u #{fetch(:pg_system_user)} psql -d #{db_name}", *args
26
+ end
18
27
  end
19
28
  end
20
29
  end
@@ -1,5 +1,5 @@
1
1
  module Capistrano
2
2
  module Postgresql
3
- VERSION = "3.0.1"
3
+ VERSION = "4.0.0"
4
4
  end
5
5
  end
@@ -14,8 +14,10 @@ namespace :load do
14
14
  set :pg_password, -> { ask_for_or_generate_password }
15
15
  set :pg_system_user, 'postgres'
16
16
  set :pg_system_db, 'postgres'
17
+ set :pg_use_hstore, false
17
18
  # template only settings
18
19
  set :pg_templates_path, 'config/deploy/templates'
20
+ set :pg_env, -> { fetch(:rails_env) || fetch(:stage) }
19
21
  set :pg_pool, 5
20
22
  set :pg_encoding, 'unicode'
21
23
  set :pg_host, 'localhost'
@@ -24,19 +26,42 @@ end
24
26
 
25
27
  namespace :postgresql do
26
28
 
29
+ desc 'Steps to upgrade the gem to version 4.0'
30
+ task :upgrade4 do
31
+ on roles :db do
32
+ execute :mkdir, '-pv', File.dirname(archetype_database_yml_file)
33
+ execute :cp, database_yml_file, archetype_database_yml_file
34
+ end
35
+ end
36
+
27
37
  # undocumented, for a reason: drops database. Use with care!
28
38
  task :remove_all do
29
- on roles :app do
39
+ on release_roles :all do
30
40
  if test "[ -e #{database_yml_file} ]"
31
41
  execute :rm, database_yml_file
32
42
  end
33
43
  end
44
+
45
+ on primary :db do
46
+ if test "[ -e #{archetype_database_yml_file} ]"
47
+ execute :rm, archetype_database_yml_file
48
+ end
49
+ end
50
+
34
51
  on roles :db do
35
52
  psql '-c', %Q{"DROP database #{fetch(:pg_database)};"}
36
53
  psql '-c', %Q{"DROP user #{fetch(:pg_user)};"}
37
54
  end
38
55
  end
39
56
 
57
+ desc "Add the hstore extension to postgresql"
58
+ task :add_hstore do
59
+ next unless fetch(:pg_use_hstore)
60
+ on roles :db do
61
+ psql_on_app_db '-c', %Q{"CREATE EXTENSION IF NOT EXISTS hstore;"}
62
+ end
63
+ end
64
+
40
65
  desc 'Create DB user'
41
66
  task :create_db_user do
42
67
  on roles :db do
@@ -59,12 +84,29 @@ namespace :postgresql do
59
84
  end
60
85
  end
61
86
 
62
- desc 'Generate database.yml'
87
+ # This task creates the archetype database.yml file on the primary db server. This is done once when a
88
+ # new DB user is created.
89
+ desc 'Generate database.yml archetype'
90
+ task :generate_database_yml_archetype do
91
+ on roles :db, primary: true do
92
+ next if test "[ -e #{archetype_database_yml_file} ]"
93
+ execute :mkdir, '-pv', File.dirname(archetype_database_yml_file)
94
+ upload! pg_template('postgresql.yml.erb'), archetype_database_yml_file
95
+ end
96
+ end
97
+
98
+ # This task copies the archetype database file on the primary db server to all clients. This is done on
99
+ # every setup, to ensure new servers get a copy as well.
100
+ desc 'Copy archetype database.yml from primary db server to clients'
63
101
  task :generate_database_yml do
64
- on roles :app do
65
- next if test "[ -e #{database_yml_file} ]"
102
+ database_yml_contents = nil
103
+ on primary :db do
104
+ database_yml_contents = download! archetype_database_yml_file
105
+ end
106
+
107
+ on release_roles :all do
66
108
  execute :mkdir, '-pv', shared_path.join('config')
67
- upload! pg_template('postgresql.yml.erb'), database_yml_file
109
+ upload! StringIO.new(database_yml_contents), database_yml_file
68
110
  end
69
111
  end
70
112
 
@@ -73,11 +115,18 @@ namespace :postgresql do
73
115
  end
74
116
 
75
117
  after 'deploy:started', 'postgresql:database_yml_symlink'
118
+
119
+ desc 'Postgresql setup tasks'
120
+ task :setup do
121
+ invoke "postgresql:create_db_user"
122
+ invoke "postgresql:create_database"
123
+ invoke 'postgresql:add_hstore'
124
+ invoke "postgresql:generate_database_yml_archetype"
125
+ invoke "postgresql:generate_database_yml"
126
+ end
76
127
  end
77
128
 
78
129
  desc 'Server setup tasks'
79
130
  task :setup do
80
- invoke 'postgresql:create_db_user'
81
- invoke 'postgresql:create_database'
82
- invoke 'postgresql:generate_database_yml'
131
+ invoke "postgresql:setup"
83
132
  end
@@ -1,4 +1,4 @@
1
- <%= fetch :stage %>:
1
+ <%= fetch :pg_env %>:
2
2
  adapter: postgresql
3
3
  encoding: <%= fetch :pg_encoding %>
4
4
  database: <%= fetch :pg_database %>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capistrano-postgresql
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.1
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bruno Sutic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-20 00:00:00.000000000 Z
11
+ date: 2014-10-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: capistrano