supporting_cast 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (32) hide show
  1. data/.gitignore +17 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.md +47 -0
  5. data/Rakefile +1 -0
  6. data/lib/generators/supporting_cast/config_generator.rb +19 -0
  7. data/lib/generators/supporting_cast/database_config_generator.rb +17 -0
  8. data/lib/generators/supporting_cast/elasticsearch_config_generator.rb +46 -0
  9. data/lib/generators/supporting_cast/foreman_config_generator.rb +17 -0
  10. data/lib/generators/supporting_cast/generator_helpers.rb +23 -0
  11. data/lib/generators/supporting_cast/nginx_config_generator.rb +25 -0
  12. data/lib/generators/supporting_cast/redis_config_generator.rb +39 -0
  13. data/lib/generators/supporting_cast/sidekiq_config_generator.rb +17 -0
  14. data/lib/generators/supporting_cast/ssl_certificate_generator.rb +33 -0
  15. data/lib/generators/supporting_cast/sunspot_config_generator.rb +23 -0
  16. data/lib/generators/supporting_cast/templates/Procfile.erb +24 -0
  17. data/lib/generators/supporting_cast/templates/database.yml.erb +11 -0
  18. data/lib/generators/supporting_cast/templates/elasticsearch.yml.erb +1 -0
  19. data/lib/generators/supporting_cast/templates/elasticsearch_config.yml.erb +359 -0
  20. data/lib/generators/supporting_cast/templates/nginx.conf.erb +129 -0
  21. data/lib/generators/supporting_cast/templates/redis.conf.erb +13 -0
  22. data/lib/generators/supporting_cast/templates/redis.yml.erb +7 -0
  23. data/lib/generators/supporting_cast/templates/sidekiq.yml.erb +9 -0
  24. data/lib/generators/supporting_cast/templates/sunspot.yml.erb +11 -0
  25. data/lib/generators/supporting_cast/templates/unicorn.rb.erb +55 -0
  26. data/lib/generators/supporting_cast/unicorn_config_generator.rb +21 -0
  27. data/lib/supporting_cast.rb +5 -0
  28. data/lib/supporting_cast/railtie.rb +12 -0
  29. data/lib/supporting_cast/version.rb +3 -0
  30. data/lib/tasks/supporting_cast.rake +53 -0
  31. data/supporting_cast.gemspec +19 -0
  32. metadata +78 -0
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in supporting_cast.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Ross Kaffenberger
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,47 @@
1
+ # SupportingCast
2
+
3
+ Opinionated generators for common Rails backing services, e.g. Redis, nginx, sidekiq, nginx, i.e., the supporting cast.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'supporting_cast', :group => :development
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install supporting_cast
18
+
19
+ ## Usage
20
+
21
+ $ rails g supporting_cast:config # Bootstrap the whole supporting cast
22
+
23
+ $ rails g supporting_cast:<name>_config # Generate config for given cast member
24
+
25
+ ## Configurations
26
+
27
+ SupportingCast is intended to make it easier to get backing services up and running for Rails local (development and test) environments. A guiding principle, largely inspired by the [12 Factor App](http://www.12factor.net/), is to minimize divergence between local and production environments.
28
+
29
+ ### Redis
30
+
31
+ As Francis Hwang said in his post, [Testing Rails Against a Running Redis Instance](http://fhwang.net/2010/09/23/Testing-Rails-against-a-running-Redis-instance-and-doing-it-with-Hydra-to-boot):
32
+
33
+ > If your Rails app uses Redis, there are basically three approaches you can take for when the code under test hits Redis.
34
+ >
35
+ > 1. Mock Redis
36
+ > 2. Stub Redis
37
+ > 3. Stop messing around and just use Redis
38
+
39
+ SupportingCast will generate configurations for running separate Redis instances for development and test. Paired with the foreman configuration, it's dead simple to start/stop multiple Redis instances for local environments. You could [use Redis namespaces to separate environments](http://dev.af83.com/2012/07/31/should-we-namespace-redis.html), but why mess around?
40
+
41
+ ## Contributing
42
+
43
+ 1. Fork it
44
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
45
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
46
+ 4. Push to the branch (`git push origin my-new-feature`)
47
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,19 @@
1
+ module SupportingCast
2
+ module Generators
3
+ class ConfigGenerator < Rails::Generators::Base
4
+ desc "Generate configuration files for development and test"
5
+
6
+ def generate_config_files
7
+ Rails::Generators.invoke "supporting_cast:redis_config" if yes?("Configure redis? [yn]")
8
+ Rails::Generators.invoke "supporting_cast:database_config" if yes?("Configure database.yml? [yn]")
9
+ Rails::Generators.invoke "supporting_cast:elasticsearch_config" if yes?("Configure elasticsearch? [yn]")
10
+ Rails::Generators.invoke "supporting_cast:sunspot_config" if yes?("Configure sunspot? [yn]")
11
+ Rails::Generators.invoke "supporting_cast:foreman_config" if yes?("Add Procfile for foreman? [yn]")
12
+ Rails::Generators.invoke "supporting_cast:nginx_config" if yes?("Configure nginx? [yn]")
13
+ Rails::Generators.invoke "supporting_cast:unicorn_config" if yes?("Configure unicorn? [yn]")
14
+ Rails::Generators.invoke "supporting_cast:sidekiq_config" if yes?("Configure sidekiq? [yn]")
15
+ end
16
+
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,17 @@
1
+ require 'generators/supporting_cast/generator_helpers'
2
+
3
+ module SupportingCast
4
+ module Generators
5
+ class DatabaseConfigGenerator < Rails::Generators::Base
6
+ include GeneratorHelpers
7
+
8
+ desc "Generate database.yml file from template"
9
+ source_root File.join(File.dirname(__FILE__), 'templates')
10
+
11
+ def database_yml
12
+ template 'database.yml.erb', "config/database.yml"
13
+ end
14
+
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,46 @@
1
+ require 'generators/supporting_cast/generator_helpers'
2
+
3
+ module SupportingCast
4
+ module Generators
5
+ class ElasticsearchConfigGenerator < Rails::Generators::Base
6
+ include GeneratorHelpers
7
+
8
+ desc "Generate elasticsearch.yml and elasticsearch config files for development and test"
9
+ source_root File.join(File.dirname(__FILE__), 'templates')
10
+
11
+ attr_accessor :env, :port
12
+
13
+ def default_port
14
+ 9200
15
+ end
16
+
17
+ def elasticsearch_options
18
+ {
19
+ "test" => { hosts: ["127.0.0.1:#{test_port}"] },
20
+ "development" => { hosts: ["127.0.0.1:#{development_port}"] }
21
+ }
22
+ end
23
+
24
+ def mkdir_elasticsearch_conf
25
+ empty_directory "config/elasticsearch"
26
+ end
27
+
28
+ def development_elasticsearch_conf
29
+ env = 'development'
30
+ port = development_port
31
+ template 'elasticsearch_config.yml.erb', "config/elasticsearch/#{env}.conf"
32
+ end
33
+
34
+ def test_elasticsearch_conf
35
+ env = 'test'
36
+ port = test_port
37
+ template 'elasticsearch_config.yml.erb', "config/elasticsearch/#{env}.conf"
38
+ end
39
+
40
+ def redis_yml
41
+ template 'elasticsearch.yml.erb', "config/elasticsearch.yml"
42
+ end
43
+
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,17 @@
1
+ require 'generators/supporting_cast/generator_helpers'
2
+
3
+ module SupportingCast
4
+ module Generators
5
+ class ForemanConfigGenerator < Rails::Generators::Base
6
+ include GeneratorHelpers
7
+ source_root File.join(File.dirname(__FILE__), 'templates')
8
+
9
+ desc "Generate a Procfile for use with foreman"
10
+
11
+ def procfile
12
+ template 'Procfile.erb', "Procfile"
13
+ end
14
+
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,23 @@
1
+ module SupportingCast
2
+ module Generators
3
+ module GeneratorHelpers
4
+
5
+ def application_name
6
+ ENV['APPLICATION_NAME'] || ::Rails.application.class.name.split('::').first.downcase
7
+ end
8
+
9
+ def rails_root
10
+ Rails.root
11
+ end
12
+
13
+ def development_port
14
+ @development_port ||= default_port + 1 + rand(100)
15
+ end
16
+
17
+ def test_port
18
+ @test_port ||= development_port + 1
19
+ end
20
+
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,25 @@
1
+ require 'generators/supporting_cast/generator_helpers'
2
+
3
+ module SupportingCast
4
+ module Generators
5
+ class NginxConfigGenerator < Rails::Generators::Base
6
+ include GeneratorHelpers
7
+ source_root File.join(File.dirname(__FILE__), 'templates')
8
+
9
+ desc 'Generate nginx configuration for development'
10
+
11
+ def mkdir_nginx_conf
12
+ empty_directory 'config/nginx'
13
+ end
14
+
15
+ def nginx_conf
16
+ template 'nginx.conf.erb', 'config/nginx/nginx.conf'
17
+ end
18
+
19
+ def ssl_certificate
20
+ Rails::Generators.invoke "supporting_cast:ssl_certificate" if yes?("Add self-signed ssl ssl_certificate for nginx? [yn]")
21
+ end
22
+
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,39 @@
1
+ require 'generators/supporting_cast/generator_helpers'
2
+
3
+ module SupportingCast
4
+ module Generators
5
+ class RedisConfigGenerator < Rails::Generators::Base
6
+ include GeneratorHelpers
7
+
8
+ desc "Generate environment-specific redis.yml and redis conf files from template"
9
+ source_root File.join(File.dirname(__FILE__), 'templates')
10
+
11
+ attr_reader :env, :port
12
+
13
+ def default_port
14
+ 6379
15
+ end
16
+
17
+ def mkdir_redis_conf
18
+ empty_directory "config/redis"
19
+ end
20
+
21
+ def development_redis_conf
22
+ @env = 'development'
23
+ @port = development_port
24
+ template 'redis.conf.erb', "config/redis/#{env}.conf"
25
+ end
26
+
27
+ def test_redis_conf
28
+ @env = 'test'
29
+ @port = test_port
30
+ template 'redis.conf.erb', "config/redis/#{env}.conf"
31
+ end
32
+
33
+ def redis_yml
34
+ template 'redis.yml.erb', "config/redis.yml"
35
+ end
36
+
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,17 @@
1
+ require 'generators/supporting_cast/generator_helpers'
2
+
3
+ module SupportingCast
4
+ module Generators
5
+ class SidekiqConfigGenerator < Rails::Generators::Base
6
+ include GeneratorHelpers
7
+
8
+ desc "Generate sidekiq.yml file from template"
9
+ source_root File.join(File.dirname(__FILE__), 'templates')
10
+
11
+ def sidekiq_yml
12
+ template 'sidekiq.yml.erb', "config/sidekiq.yml"
13
+ end
14
+
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,33 @@
1
+ # openssl req -new -nodes -keyout server.key -out server.csr
2
+
3
+ require 'generators/supporting_cast/generator_helpers'
4
+
5
+ module SupportingCast
6
+ module Generators
7
+ class SslCertificateGenerator < Rails::Generators::Base
8
+ include GeneratorHelpers
9
+
10
+ desc "Generate ssl certificate files"
11
+
12
+ def openssl
13
+ inside('config/nginx') do
14
+ run('rm server.key server.csr server.crt')
15
+
16
+ # generate private key and certificate signing request
17
+ run('openssl req -new -nodes -keyout server.key -out server.csr')
18
+
19
+ # generate certificate
20
+ run('openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt')
21
+ end
22
+ end
23
+
24
+ def own
25
+ inside('config/nginx') do
26
+ run('chmod 400 *.key *.crt')
27
+ run('sudo chown root *.key *.crt')
28
+ end
29
+ end
30
+
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,23 @@
1
+ require 'generators/supporting_cast/generator_helpers'
2
+
3
+ module SupportingCast
4
+ module Generators
5
+ class SunspotConfigGenerator < Rails::Generators::Base
6
+ include GeneratorHelpers
7
+
8
+ desc "Generate sunspot.yml and sunspot config files for development and test"
9
+ source_root File.join(File.dirname(__FILE__), 'templates')
10
+
11
+ attr_accessor :env, :port
12
+
13
+ def default_port
14
+ 8988
15
+ end
16
+
17
+ def sunspot_yml
18
+ template 'sunspot.yml.erb', "config/sunspot.yml"
19
+ end
20
+
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,24 @@
1
+ # make sure processes run in the foreground
2
+ # thin: bundle exec thin start -p $PORT
3
+ # unicorn: nohup bundle exec unicorn -c config/unicorn/unicorn.rb
4
+ # nginx: sudo /usr/local/sbin/nginx -c <%= rails_root %>/config/nginx/nginx.conf -g "daemon off;"
5
+ # redis_dev: redis-server ./config/redis/development.conf
6
+ # redis_test: redis-server ./config/redis/test.conf
7
+ # guard: bundle exec guard
8
+ # solr: bundle exec rake sunspot:solr:run
9
+ # elastic_dev: elasticsearch -f -Des.config=./config/elasticsearch/development.yml
10
+ # elastic_test: elasticsearch -f -Des.config=./config/elasticsearch/test.yml
11
+ # resque: bundle exec rake resque:work QUEUE=*
12
+ # sidekiq: bundle exec sidekiq
13
+
14
+ # Optional but useful
15
+
16
+ # zeus: zeus start
17
+ # spork: bundle exec spork --port 9899
18
+ # spork_challenges: cd engines/challenges && bundle exec spork --port 9901
19
+ # spork_groups_cucumber: cd engines/groups && bundle exec spork cucumber --port 9902
20
+ # spork_groups_rspec: cd engines/groups && bundle exec spork rspec --port 9903
21
+ # evergreen: bundle exec evergreen serve
22
+ # redis-commander --port 8081 --redis-host localhost --redis-port 9464
23
+ # memcache: /usr/local/bin/memcached -l localhost
24
+
@@ -0,0 +1,11 @@
1
+ development: &default
2
+ adapter: mysql2
3
+ database: <%= application_name %>_development
4
+ username: root
5
+ pool: 5
6
+ timeout: 5000
7
+ reconnect: true
8
+
9
+ test:
10
+ <<: *default
11
+ database: <%= application_name %>_test
@@ -0,0 +1 @@
1
+ <%= elasticsearch_options.to_yaml %>
@@ -0,0 +1,359 @@
1
+ ##################### ElasticSearch Configuration Example #####################
2
+
3
+ # This file contains an overview of various configuration settings,
4
+ # targeted at operations staff. Application developers should
5
+ # consult the guide at <http://elasticsearch.org/guide>.
6
+ #
7
+ # The installation procedure is covered at
8
+ # <http://elasticsearch.org/guide/reference/setup/installation.html>.
9
+ #
10
+ # ElasticSearch comes with reasonable defaults for most settings,
11
+ # so you can try it out without bothering with configuration.
12
+ #
13
+ # Most of the time, these defaults are just fine for running a production
14
+ # cluster. If you're fine-tuning your cluster, or wondering about the
15
+ # effect of certain configuration option, please _do ask_ on the
16
+ # mailing list or IRC channel [http://elasticsearch.org/community].
17
+
18
+ # Any element in the configuration can be replaced with environment variables
19
+ # by placing them in ${...} notation. For example:
20
+ #
21
+ # node.rack: ${RACK_ENV_VAR}
22
+
23
+ # See <http://elasticsearch.org/guide/reference/setup/configuration.html>
24
+ # for information on supported formats and syntax for the configuration file.
25
+
26
+
27
+ ################################### Cluster ###################################
28
+
29
+ # Cluster name identifies your cluster for auto-discovery. If you're running
30
+ # multiple clusters on the same network, make sure you're using unique names.
31
+ #
32
+ cluster.name: elasticsearch_<%= application_name %>_<%= env %>
33
+
34
+ #################################### Node #####################################
35
+
36
+ # Node names are generated dynamically on startup, so you're relieved
37
+ # from configuring them manually. You can tie this node to a specific name:
38
+ #
39
+ # node.name: "Franz Kafka"
40
+
41
+ # Every node can be configured to allow or deny being eligible as the master,
42
+ # and to allow or deny to store the data.
43
+ #
44
+ # Allow this node to be eligible as a master node (enabled by default):
45
+ #
46
+ # node.master: true
47
+ #
48
+ # Allow this node to store data (enabled by default):
49
+ #
50
+ # node.data: true
51
+
52
+ # You can exploit these settings to design advanced cluster topologies.
53
+ #
54
+ # 1. You want this node to never become a master node, only to hold data.
55
+ # This will be the "workhorse" of your cluster.
56
+ #
57
+ # node.master: false
58
+ # node.data: true
59
+ #
60
+ # 2. You want this node to only serve as a master: to not store any data and
61
+ # to have free resources. This will be the "coordinator" of your cluster.
62
+ #
63
+ # node.master: true
64
+ # node.data: false
65
+ #
66
+ # 3. You want this node to be neither master nor data node, but
67
+ # to act as a "search load balancer" (fetching data from nodes,
68
+ # aggregating results, etc.)
69
+ #
70
+ # node.master: false
71
+ # node.data: false
72
+
73
+ # Use the Cluster Health API [http://localhost:9200/_cluster/health], the
74
+ # Node Info API [http://localhost:9200/_cluster/nodes] or GUI tools
75
+ # such as <http://github.com/lukas-vlcek/bigdesk> and
76
+ # <http://mobz.github.com/elasticsearch-head> to inspect the cluster state.
77
+
78
+ # A node can have generic attributes associated with it, which can later be used
79
+ # for customized shard allocation filtering, or allocation awareness. An attribute
80
+ # is a simple key value pair, similar to node.key: value, here is an example:
81
+ #
82
+ # node.rack: rack314
83
+
84
+ # By default, multiple nodes are allowed to start from the same installation location
85
+ # to disable it, set the following:
86
+ # node.max_local_storage_nodes: 1
87
+
88
+
89
+ #################################### Index ####################################
90
+
91
+ # You can set a number of options (such as shard/replica options, mapping
92
+ # or analyzer definitions, translog settings, ...) for indices globally,
93
+ # in this file.
94
+ #
95
+ # Note, that it makes more sense to configure index settings specifically for
96
+ # a certain index, either when creating it or by using the index templates API.
97
+ #
98
+ # See <http://elasticsearch.org/guide/reference/index-modules/> and
99
+ # <http://elasticsearch.org/guide/reference/api/admin-indices-create-index.html>
100
+ # for more information.
101
+
102
+ # Set the number of shards (splits) of an index (5 by default):
103
+ #
104
+ # index.number_of_shards: 5
105
+
106
+ # Set the number of replicas (additional copies) of an index (1 by default):
107
+ #
108
+ # index.number_of_replicas: 1
109
+
110
+ # Note, that for development on a local machine, with small indices, it usually
111
+ # makes sense to "disable" the distributed features:
112
+ #
113
+ # index.number_of_shards: 1
114
+ # index.number_of_replicas: 0
115
+
116
+ # These settings directly affect the performance of index and search operations
117
+ # in your cluster. Assuming you have enough machines to hold shards and
118
+ # replicas, the rule of thumb is:
119
+ #
120
+ # 1. Having more *shards* enhances the _indexing_ performance and allows to
121
+ # _distribute_ a big index across machines.
122
+ # 2. Having more *replicas* enhances the _search_ performance and improves the
123
+ # cluster _availability_.
124
+ #
125
+ # The "number_of_shards" is a one-time setting for an index.
126
+ #
127
+ # The "number_of_replicas" can be increased or decreased anytime,
128
+ # by using the Index Update Settings API.
129
+ #
130
+ # ElasticSearch takes care about load balancing, relocating, gathering the
131
+ # results from nodes, etc. Experiment with different settings to fine-tune
132
+ # your setup.
133
+
134
+ # Use the Index Status API (<http://localhost:9200/A/_status>) to inspect
135
+ # the index status.
136
+
137
+
138
+ #################################### Paths ####################################
139
+
140
+ # Path to directory containing configuration (this file and logging.yml):
141
+ #
142
+ # path.conf: /path/to/conf
143
+
144
+ # Path to directory where to store index data allocated for this node.
145
+ #
146
+ path.data: /usr/local/var/elasticsearch/
147
+ #
148
+ # Can optionally include more than one location, causing data to be striped across
149
+ # the locations (à la RAID 0) on a file level, favouring locations with most free
150
+ # space on creation. For example:
151
+ #
152
+ path.data: /usr/local/var/elasticsearch/
153
+
154
+ # Path to temporary files:
155
+ #
156
+ # path.work: /path/to/work
157
+
158
+ # Path to log files:
159
+ #
160
+ path.logs: /usr/local/var/log/elasticsearch/
161
+
162
+ # Path to where plugins are installed:
163
+ #
164
+ # path.plugins: /path/to/plugins
165
+
166
+
167
+ #################################### Plugin ###################################
168
+
169
+ # If a plugin listed here is not installed for current node, the node will not start.
170
+ #
171
+ # plugin.mandatory: mapper-attachments,lang-groovy
172
+
173
+
174
+ ################################### Memory ####################################
175
+
176
+ # ElasticSearch performs poorly when JVM starts swapping: you should ensure that
177
+ # it _never_ swaps.
178
+ #
179
+ # Set this property to true to lock the memory:
180
+ #
181
+ # bootstrap.mlockall: true
182
+
183
+ # Make sure that the ES_MIN_MEM and ES_MAX_MEM environment variables are set
184
+ # to the same value, and that the machine has enough memory to allocate
185
+ # for ElasticSearch, leaving enough memory for the operating system itself.
186
+ #
187
+ # You should also make sure that the ElasticSearch process is allowed to lock
188
+ # the memory, eg. by using `ulimit -l unlimited`.
189
+
190
+
191
+ ############################## Network And HTTP ###############################
192
+
193
+ # ElasticSearch, by default, binds itself to the 0.0.0.0 address, and listens
194
+ # on port [9200-9300] for HTTP traffic and on port [9300-9400] for node-to-node
195
+ # communication. (the range means that if the port is busy, it will automatically
196
+ # try the next port).
197
+
198
+ # Set the bind address specifically (IPv4 or IPv6):
199
+ #
200
+ # network.bind_host: 192.168.0.1
201
+
202
+ # Set the address other nodes will use to communicate with this node. If not
203
+ # set, it is automatically derived. It must point to an actual IP address.
204
+ #
205
+ # network.publish_host: 192.168.0.1
206
+
207
+ # Set both 'bind_host' and 'publish_host':
208
+ #
209
+ network.host: localhost
210
+
211
+ # Set a custom port for the node to node communication (9300 by default):
212
+ #
213
+ # transport.tcp.port: 9300
214
+
215
+ # Enable compression for all communication between nodes (disabled by default):
216
+ #
217
+ # transport.tcp.compress: true
218
+
219
+ # Set a custom port to listen for HTTP traffic:
220
+ #
221
+ http.port: <%= port %>
222
+
223
+ # Set a custom allowed content length:
224
+ #
225
+ # http.max_content_length: 100mb
226
+
227
+ # Disable HTTP completely:
228
+ #
229
+ # http.enabled: false
230
+
231
+
232
+ ################################### Gateway ###################################
233
+
234
+ # The gateway allows for persisting the cluster state between full cluster
235
+ # restarts. Every change to the state (such as adding an index) will be stored
236
+ # in the gateway, and when the cluster starts up for the first time,
237
+ # it will read its state from the gateway.
238
+
239
+ # There are several types of gateway implementations. For more information,
240
+ # see <http://elasticsearch.org/guide/reference/modules/gateway>.
241
+
242
+ # The default gateway type is the "local" gateway (recommended):
243
+ #
244
+ # gateway.type: local
245
+
246
+ # Settings below control how and when to start the initial recovery process on
247
+ # a full cluster restart (to reuse as much local data as possible when using shared
248
+ # gateway).
249
+
250
+ # Allow recovery process after N nodes in a cluster are up:
251
+ #
252
+ # gateway.recover_after_nodes: 1
253
+
254
+ # Set the timeout to initiate the recovery process, once the N nodes
255
+ # from previous setting are up (accepts time value):
256
+ #
257
+ # gateway.recover_after_time: 5m
258
+
259
+ # Set how many nodes are expected in this cluster. Once these N nodes
260
+ # are up (and recover_after_nodes is met), begin recovery process immediately
261
+ # (without waiting for recover_after_time to expire):
262
+ #
263
+ # gateway.expected_nodes: 2
264
+
265
+
266
+ ############################# Recovery Throttling #############################
267
+
268
+ # These settings allow to control the process of shards allocation between
269
+ # nodes during initial recovery, replica allocation, rebalancing,
270
+ # or when adding and removing nodes.
271
+
272
+ # Set the number of concurrent recoveries happening on a node:
273
+ #
274
+ # 1. During the initial recovery
275
+ #
276
+ # cluster.routing.allocation.node_initial_primaries_recoveries: 4
277
+ #
278
+ # 2. During adding/removing nodes, rebalancing, etc
279
+ #
280
+ # cluster.routing.allocation.node_concurrent_recoveries: 2
281
+
282
+ # Set to throttle throughput when recovering (eg. 100mb, by default unlimited):
283
+ #
284
+ # indices.recovery.max_size_per_sec: 0
285
+
286
+ # Set to limit the number of open concurrent streams when
287
+ # recovering a shard from a peer:
288
+ #
289
+ # indices.recovery.concurrent_streams: 5
290
+
291
+
292
+ ################################## Discovery ##################################
293
+
294
+ # Discovery infrastructure ensures nodes can be found within a cluster
295
+ # and master node is elected. Multicast discovery is the default.
296
+
297
+ # Set to ensure a node sees N other master eligible nodes to be considered
298
+ # operational within the cluster. Set this option to a higher value (2-4)
299
+ # for large clusters (>3 nodes):
300
+ #
301
+ # discovery.zen.minimum_master_nodes: 1
302
+
303
+ # Set the time to wait for ping responses from other nodes when discovering.
304
+ # Set this option to a higher value on a slow or congested network
305
+ # to minimize discovery failures:
306
+ #
307
+ # discovery.zen.ping.timeout: 3s
308
+
309
+ # See <http://elasticsearch.org/guide/reference/modules/discovery/zen.html>
310
+ # for more information.
311
+
312
+ # Unicast discovery allows to explicitly control which nodes will be used
313
+ # to discover the cluster. It can be used when multicast is not present,
314
+ # or to restrict the cluster communication-wise.
315
+ #
316
+ # 1. Disable multicast discovery (enabled by default):
317
+ #
318
+ # discovery.zen.ping.multicast.enabled: false
319
+ #
320
+ # 2. Configure an initial list of master nodes in the cluster
321
+ # to perform discovery when new nodes (master or data) are started:
322
+ #
323
+ # discovery.zen.ping.unicast.hosts: ["host1", "host2:port", "host3[portX-portY]"]
324
+
325
+ # EC2 discovery allows to use AWS EC2 API in order to perform discovery.
326
+ #
327
+ # You have to install the cloud-aws plugin for enabling the EC2 discovery.
328
+ #
329
+ # See <http://elasticsearch.org/guide/reference/modules/discovery/ec2.html>
330
+ # for more information.
331
+ #
332
+ # See <http://elasticsearch.org/tutorials/2011/08/22/elasticsearch-on-ec2.html>
333
+ # for a step-by-step tutorial.
334
+
335
+
336
+ ################################## Slow Log ##################################
337
+
338
+ # Shard level query and fetch threshold logging.
339
+
340
+ #index.search.slowlog.level: TRACE
341
+ #index.search.slowlog.threshold.query.warn: 10s
342
+ #index.search.slowlog.threshold.query.info: 5s
343
+ #index.search.slowlog.threshold.query.debug: 2s
344
+ #index.search.slowlog.threshold.query.trace: 500ms
345
+
346
+ #index.search.slowlog.threshold.fetch.warn: 1s
347
+ #index.search.slowlog.threshold.fetch.info: 800ms
348
+ #index.search.slowlog.threshold.fetch.debug: 500ms
349
+ #index.search.slowlog.threshold.fetch.trace: 200ms
350
+
351
+ ################################## GC Logging ################################
352
+
353
+ #monitor.jvm.gc.ParNew.warn: 1000ms
354
+ #monitor.jvm.gc.ParNew.info: 700ms
355
+ #monitor.jvm.gc.ParNew.debug: 400ms
356
+
357
+ #monitor.jvm.gc.ConcurrentMarkSweep.warn: 10s
358
+ #monitor.jvm.gc.ConcurrentMarkSweep.info: 5s
359
+ #monitor.jvm.gc.ConcurrentMarkSweep.debug: 2s
@@ -0,0 +1,129 @@
1
+ user nobody;
2
+ worker_processes 2;
3
+ pid /var/run/nginx.pid;
4
+
5
+ error_log <%= rails_root %>/log/nginx.error.log info;
6
+
7
+ events {
8
+ worker_connections 256;
9
+ }
10
+
11
+ http {
12
+ default_type application/octet-stream;
13
+
14
+ log_format main '$remote_addr - $remote_user [$time_local] '
15
+ '"$request" $status $body_bytes_sent "$http_referer" '
16
+ '"$http_user_agent" "$http_x_forwarded_for"';
17
+
18
+ access_log <%= rails_root %>/log/nginx.access.log main;
19
+
20
+ sendfile on;
21
+
22
+ keepalive_timeout 65;
23
+
24
+ upstream <%= application_name %>_upstream {
25
+ server 0.0.0.0:5000;
26
+ }
27
+
28
+ upstream <%= application_name %>_upstream_ssl {
29
+ server 0.0.0.0:5000;
30
+ }
31
+
32
+ server {
33
+ listen 80;
34
+ server_name *.dev;
35
+
36
+ root <%= rails_root %>/public;
37
+
38
+ access_log <%= rails_root %>/log/<%= application_name %>.access.log main;
39
+ error_log <%= rails_root %>/log/<%= application_name %>.error.log notice;
40
+
41
+ # needed to forward user's IP address to rails
42
+ proxy_set_header X-Real-IP $remote_addr;
43
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
44
+ proxy_set_header Host $http_host;
45
+ proxy_set_header X-Forwarded-Proto $scheme;
46
+
47
+ proxy_redirect off;
48
+ proxy_max_temp_file_size 0;
49
+
50
+ if (-f $request_filename) {
51
+ break;
52
+ }
53
+
54
+ location / {
55
+ client_max_body_size 5M;
56
+ if (!-f $request_filename) {
57
+ proxy_pass http://<%= application_name %>_upstream;
58
+ break;
59
+ }
60
+ }
61
+
62
+ location ~* \.(eot|ttf|woff|svg)$ {
63
+ add_header Access-Control-Allow-Origin *;
64
+ if (!-f $request_filename) {
65
+ proxy_pass http://<%= application_name %>_upstream;
66
+ break;
67
+ }
68
+ }
69
+
70
+ error_page 500 502 503 504 /50x.html;
71
+ location = /50x.html {
72
+ root html;
73
+ }
74
+ }
75
+
76
+ server {
77
+ listen 443;
78
+ server_name *.dev;
79
+
80
+ ssl on;
81
+ ssl_certificate server.crt;
82
+ ssl_certificate_key server.key;
83
+
84
+ ssl_session_timeout 5m;
85
+
86
+ ssl_protocols SSLv2 SSLv3 TLSv1;
87
+ ssl_ciphers HIGH:!aNULL:!MD5;
88
+ ssl_prefer_server_ciphers on;
89
+
90
+ root <%= rails_root %>/public;
91
+
92
+ access_log <%= rails_root %>/log/<%= application_name %>.access.log main;
93
+ error_log <%= rails_root %>/log/<%= application_name %>.error.log notice;
94
+
95
+ # needed to forward user's IP address to rails
96
+ proxy_set_header X-Real-IP $remote_addr;
97
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
98
+ proxy_set_header Host $http_host;
99
+ proxy_set_header X-Forwarded-Proto $scheme;
100
+
101
+ proxy_redirect off;
102
+ proxy_max_temp_file_size 0;
103
+
104
+ if (-f $request_filename) {
105
+ break;
106
+ }
107
+
108
+ location / {
109
+ client_max_body_size 5M;
110
+ if (!-f $request_filename) {
111
+ proxy_pass http://<%= application_name %>_upstream_ssl;
112
+ break;
113
+ }
114
+ }
115
+
116
+ location ~* \.(eot|ttf|woff|svg)$ {
117
+ add_header Access-Control-Allow-Origin *;
118
+ if (!-f $request_filename) {
119
+ proxy_pass http://<%= application_name %>_upstream_ssl;
120
+ break;
121
+ }
122
+ }
123
+
124
+ error_page 500 502 503 504 /50x.html;
125
+ location = /50x.html {
126
+ root html;
127
+ }
128
+ }
129
+ }
@@ -0,0 +1,13 @@
1
+ # Redis configuration
2
+ daemonize no
3
+ pidfile ./tmp/pids/redis_<%= env %>.pid
4
+ port <%= port %>
5
+ timeout 300
6
+ save 900 1
7
+ save 300 10
8
+ save 60 10000
9
+ dbfilename ./db/<%= env %>.rdb
10
+ loglevel debug
11
+ logfile ./log/redis_<%= env %>.log
12
+ databases 1
13
+ glueoutputbuf yes
@@ -0,0 +1,7 @@
1
+ development:
2
+ host: localhost
3
+ port: <%= development_port %>
4
+
5
+ test:
6
+ host: localhost
7
+ port: <%= test_port %>
@@ -0,0 +1,9 @@
1
+ # Options here can still be overridden by cmd line args.
2
+ # sidekiq -C config/sidekiq.yml
3
+ ---
4
+ :verbose: true
5
+ :concurrency: 25
6
+ :queues:
7
+ - [often, 7]
8
+ - [default, 5]
9
+ - [seldom, 3]
@@ -0,0 +1,11 @@
1
+ test:
2
+ solr:
3
+ hostname: localhost
4
+ port: <%= test_port %>
5
+ log_level: WARNING
6
+
7
+ development:
8
+ solr:
9
+ hostname: localhost
10
+ port: <%= development_port %>
11
+ log_level: WARNING
@@ -0,0 +1,55 @@
1
+ working_directory '<%= rails_root %>'
2
+ worker_processes 1
3
+ listen '<%= rails_root %>/unicorn_<%= application_name %>.sock', :backlog => 1024
4
+ timeout 15
5
+ pid "<%= rails_root %>/log/unicorn_<%= application_name %>.pid"
6
+
7
+ # Based on http://gist.github.com/206253
8
+
9
+ logger Logger.new("log/unicorn.log")
10
+
11
+ # Load the app into the master before forking workers for super-fast worker spawn times
12
+ preload_app true
13
+
14
+ # some applications/frameworks log to stderr or stdout, so prevent
15
+ # them from going to /dev/null when daemonized here:
16
+ stderr_path "log/unicorn.stderr.log"
17
+ stdout_path "log/unicorn.stdout.log"
18
+
19
+ # REE - http://www.rubyenterpriseedition.com/faq.html#adapt_apps_for_cow
20
+ if GC.respond_to?(:copy_on_write_friendly=)
21
+ GC.copy_on_write_friendly = true
22
+ end
23
+
24
+ before_fork do |server, worker|
25
+
26
+ ##
27
+ # When sent a USR2, Unicorn will suffix its pidfile with .oldbin and
28
+ # immediately start loading up a new version of itself (loaded with a new
29
+ # version of our app). When this new Unicorn is completely loaded
30
+ # it will begin spawning workers. The first worker spawned will check to
31
+ # see if an .oldbin pidfile exists. If so, this means we've just booted up
32
+ # a new Unicorn and need to tell the old one that it can now die. To do so
33
+ # we send it a QUIT.
34
+ #
35
+ # Using this method we get 0 downtime deploys.
36
+ old_pid = "#{server.config[:pid]}.oldbin"
37
+
38
+ if File.exists?(old_pid) && server.pid != old_pid
39
+ begin
40
+ sig = (worker.nr + 1) >= server.worker_processes ? :TERM : :TTOU
41
+ Process.kill(sig, File.read(old_pid).to_i)
42
+ rescue Errno::ENOENT, Errno::ESRCH
43
+ # someone else did our job for us
44
+ end
45
+ end
46
+ sleep 1
47
+ end
48
+
49
+ after_fork do |server, worker|
50
+ worker_pid = File.join(File.dirname(server.config[:pid]), "unicorn_worker_<%= application_name %>_#{worker.nr}.pid")
51
+ File.open(worker_pid, "w") { |f| f.puts Process.pid }
52
+ if defined?(ActiveRecord::Base)
53
+ ActiveRecord::Base.establish_connection
54
+ end
55
+ end
@@ -0,0 +1,21 @@
1
+ require 'generators/supporting_cast/generator_helpers'
2
+
3
+ module SupportingCast
4
+ module Generators
5
+ class UnicornConfigGenerator < Rails::Generators::Base
6
+ include GeneratorHelpers
7
+ source_root File.join(File.dirname(__FILE__), 'templates')
8
+
9
+ desc 'Generate unicorn configuration for development'
10
+
11
+ def mkdir_unicorn_conf
12
+ empty_directory 'config/unicorn'
13
+ end
14
+
15
+ def nginx_conf
16
+ template 'unicorn.rb.erb', 'config/unicorn/unicorn.rb'
17
+ end
18
+
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,5 @@
1
+ module SupportingCast
2
+ end
3
+
4
+ require "supporting_cast/version"
5
+ require 'supporting_cast/railtie' if defined?(Rails)
@@ -0,0 +1,12 @@
1
+ require 'supporting_cast'
2
+ require 'rails'
3
+
4
+ module SupportingCast
5
+ class Railtie < Rails::Railtie
6
+ railtie_name :supporting_cast
7
+
8
+ rake_tasks do
9
+ load "tasks/supporting_cast.rake"
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,3 @@
1
+ module SupportingCast
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,53 @@
1
+ namespace :supporting_cast do
2
+
3
+ task :require do
4
+ require 'rails/generators'
5
+ end
6
+
7
+ desc "Generate redis.yml and redis config files for development and test"
8
+ task :redis => :require do
9
+ Rails::Generators.invoke "supporting_cast:redis_config"
10
+ end
11
+
12
+ desc "Generate database.yml for development and test"
13
+ task :database => :require do
14
+ Rails::Generators.invoke "supporting_cast:database_config"
15
+ end
16
+
17
+ desc "Generate elasticsearch.yml and elasticsearch config files for development and test"
18
+ task :elasticsearch => :require do
19
+ Rails::Generators.invoke "supporting_cast:elasticsearch_config"
20
+ end
21
+
22
+ desc "Generate sunspot.yml and sunspot config files for development and test"
23
+ task :sunspot => :require do
24
+ Rails::Generators.invoke "supporting_cast:sunspot_config"
25
+ end
26
+
27
+ desc "Generate a Procfile for use with foreman"
28
+ task :foreman => :require do
29
+ Rails::Generators.invoke "supporting_cast:foreman_config"
30
+ end
31
+
32
+ desc "Generate nginx configuration for development"
33
+ task :nginx => :require do
34
+ Rails::Generators.invoke "supporting_cast:nginx_config"
35
+ end
36
+
37
+ desc "Generate unicorn configuration for development"
38
+ task :unicorn => :require do
39
+ Rails::Generators.invoke "supporting_cast:unicorn_config"
40
+ end
41
+
42
+ desc "Generate sidekiq configuration for development"
43
+ task :sidekiq => :require do
44
+ Rails::Generators.invoke "supporting_cast:sidekiq_config"
45
+ end
46
+
47
+ task :default => :require do
48
+ Rails::Generators.invoke "supporting_cast:config"
49
+ end
50
+ end
51
+
52
+ desc "Bootstrap all supporting_cast configuration files"
53
+ task :supporting_cast => "supporting_cast:default"
@@ -0,0 +1,19 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'supporting_cast/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "supporting_cast"
8
+ gem.version = SupportingCast::VERSION
9
+ gem.authors = ["Ross Kaffenberger"]
10
+ gem.email = ["rosskaff@gmail.com"]
11
+ gem.description = "Opinionated generators for common Rails supporting cast services, or 'supporting_casts'"
12
+ gem.summary = "Opinionated generators for common Rails supporting cast services, or 'supporting_casts'"
13
+ gem.homepage = ""
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+ end
metadata ADDED
@@ -0,0 +1,78 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: supporting_cast
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Ross Kaffenberger
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-12-16 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: Opinionated generators for common Rails supporting cast services, or
15
+ 'supporting_casts'
16
+ email:
17
+ - rosskaff@gmail.com
18
+ executables: []
19
+ extensions: []
20
+ extra_rdoc_files: []
21
+ files:
22
+ - .gitignore
23
+ - Gemfile
24
+ - LICENSE.txt
25
+ - README.md
26
+ - Rakefile
27
+ - lib/generators/supporting_cast/config_generator.rb
28
+ - lib/generators/supporting_cast/database_config_generator.rb
29
+ - lib/generators/supporting_cast/elasticsearch_config_generator.rb
30
+ - lib/generators/supporting_cast/foreman_config_generator.rb
31
+ - lib/generators/supporting_cast/generator_helpers.rb
32
+ - lib/generators/supporting_cast/nginx_config_generator.rb
33
+ - lib/generators/supporting_cast/redis_config_generator.rb
34
+ - lib/generators/supporting_cast/sidekiq_config_generator.rb
35
+ - lib/generators/supporting_cast/ssl_certificate_generator.rb
36
+ - lib/generators/supporting_cast/sunspot_config_generator.rb
37
+ - lib/generators/supporting_cast/templates/Procfile.erb
38
+ - lib/generators/supporting_cast/templates/database.yml.erb
39
+ - lib/generators/supporting_cast/templates/elasticsearch.yml.erb
40
+ - lib/generators/supporting_cast/templates/elasticsearch_config.yml.erb
41
+ - lib/generators/supporting_cast/templates/nginx.conf.erb
42
+ - lib/generators/supporting_cast/templates/redis.conf.erb
43
+ - lib/generators/supporting_cast/templates/redis.yml.erb
44
+ - lib/generators/supporting_cast/templates/sidekiq.yml.erb
45
+ - lib/generators/supporting_cast/templates/sunspot.yml.erb
46
+ - lib/generators/supporting_cast/templates/unicorn.rb.erb
47
+ - lib/generators/supporting_cast/unicorn_config_generator.rb
48
+ - lib/supporting_cast.rb
49
+ - lib/supporting_cast/railtie.rb
50
+ - lib/supporting_cast/version.rb
51
+ - lib/tasks/supporting_cast.rake
52
+ - supporting_cast.gemspec
53
+ homepage: ''
54
+ licenses: []
55
+ post_install_message:
56
+ rdoc_options: []
57
+ require_paths:
58
+ - lib
59
+ required_ruby_version: !ruby/object:Gem::Requirement
60
+ none: false
61
+ requirements:
62
+ - - ! '>='
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
65
+ required_rubygems_version: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ! '>='
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ requirements: []
72
+ rubyforge_project:
73
+ rubygems_version: 1.8.10
74
+ signing_key:
75
+ specification_version: 3
76
+ summary: Opinionated generators for common Rails supporting cast services, or 'supporting_casts'
77
+ test_files: []
78
+ has_rdoc: