trireme 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +29 -0
- data/Rakefile +1 -0
- data/bin/trireme +12 -0
- data/lib/trireme/actions.rb +20 -0
- data/lib/trireme/app_builder.rb +207 -0
- data/lib/trireme/generators/app_generator.rb +177 -0
- data/lib/trireme/templates/.rspec +1 -0
- data/lib/trireme/templates/Capfile +4 -0
- data/lib/trireme/templates/Guardfile +32 -0
- data/lib/trireme/templates/README.md.erb +6 -0
- data/lib/trireme/templates/additional_gems +37 -0
- data/lib/trireme/templates/app/assets/stylesheets/_bootstrap_and_overrides.scss +818 -0
- data/lib/trireme/templates/app/assets/stylesheets/application.css.scss +3 -0
- data/lib/trireme/templates/app/helpers/utility_helper.rb +32 -0
- data/lib/trireme/templates/app/views/layouts/application.html.erb +34 -0
- data/lib/trireme/templates/app/views/shared/_admin_actions.html.erb +3 -0
- data/lib/trireme/templates/app/views/shared/_flashes.html.erb +12 -0
- data/lib/trireme/templates/app/views/shared/_form_errors.html.erb +9 -0
- data/lib/trireme/templates/config/deploy/production.rb +17 -0
- data/lib/trireme/templates/config/deploy/staging.rb +8 -0
- data/lib/trireme/templates/config/deploy.rb.erb +41 -0
- data/lib/trireme/templates/config/environments/development.rb +45 -0
- data/lib/trireme/templates/config/environments/production.rb +70 -0
- data/lib/trireme/templates/config/environments/staging.rb +68 -0
- data/lib/trireme/templates/config/environments/test.rb +37 -0
- data/lib/trireme/templates/config/initializers/better_errors.rb +1 -0
- data/lib/trireme/templates/config/initializers/jazz_hands.rb +4 -0
- data/lib/trireme/templates/config/recipes/base.rb +8 -0
- data/lib/trireme/templates/config/recipes/check.rb +14 -0
- data/lib/trireme/templates/config/recipes/log.rb +6 -0
- data/lib/trireme/templates/config/recipes/logrotate.rb +8 -0
- data/lib/trireme/templates/config/recipes/nginx.rb +17 -0
- data/lib/trireme/templates/config/recipes/postgresql.rb +32 -0
- data/lib/trireme/templates/config/recipes/scripts/sql_functions.sql +23 -0
- data/lib/trireme/templates/config/recipes/templates/logrotate.erb +9 -0
- data/lib/trireme/templates/config/recipes/templates/nginx_unicorn.erb +69 -0
- data/lib/trireme/templates/config/recipes/templates/postgresql.yml.erb +8 -0
- data/lib/trireme/templates/config/recipes/templates/unicorn.rb.erb +14 -0
- data/lib/trireme/templates/config/recipes/templates/unicorn_init.erb +84 -0
- data/lib/trireme/templates/config/recipes/unicorn.rb +26 -0
- data/lib/trireme/templates/gitignore_additions +2 -0
- data/lib/trireme/templates/lib/templates/erb/scaffold/_form.html.erb +16 -0
- data/lib/trireme/templates/lib/templates/erb/scaffold/edit.html.erb +6 -0
- data/lib/trireme/templates/lib/templates/erb/scaffold/index.html.erb +27 -0
- data/lib/trireme/templates/lib/templates/erb/scaffold/new.html.erb +5 -0
- data/lib/trireme/templates/lib/templates/erb/scaffold/show.html.erb +10 -0
- data/lib/trireme/templates/spec/spec_helper.rb +60 -0
- data/lib/trireme/version.rb +3 -0
- data/lib/trireme.rb +48 -0
- data/trireme.gemspec +23 -0
- metadata +127 -0
@@ -0,0 +1,32 @@
|
|
1
|
+
module UtilityHelper
|
2
|
+
def title(page_title)
|
3
|
+
content_for(:title) { page_title }
|
4
|
+
end
|
5
|
+
|
6
|
+
def icon(name, opts = {})
|
7
|
+
opts[:size] = opts[:size] == 1 ? 'lg' : opts[:size].to_s + 'x' if opts[:size]
|
8
|
+
name = name.to_s.gsub('_', '-')
|
9
|
+
|
10
|
+
html_tag = ""
|
11
|
+
html_tag << '<div class="icon-wrapper">' if opts[:wrapper]
|
12
|
+
|
13
|
+
if opts[:circle]
|
14
|
+
html_tag << "<span class=\"fa-stack fa-#{opts[:size] || 'lg'}\">"
|
15
|
+
html_tag << '<i class="fa fa-circle fa-stack-2x"></i>'
|
16
|
+
html_tag << "<i class=\"fa fa-#{name} fa-stack-1x fa-inverse\"></i>"
|
17
|
+
html_tag << '</span>'
|
18
|
+
else
|
19
|
+
html_tag << "<i class=\"fa fa-#{name}"
|
20
|
+
html_tag << " #{opts[:additional]}" if opts.has_key? :additional
|
21
|
+
html_tag << " fa-border" if opts[:border]
|
22
|
+
html_tag << " fa-#{opts[:size]}" if opts[:size]
|
23
|
+
html_tag << '"></i>'
|
24
|
+
html_tag << '</div>' if opts[:wrapper]
|
25
|
+
end
|
26
|
+
html_tag.html_safe
|
27
|
+
end
|
28
|
+
|
29
|
+
def placeholder(width, height = nil, text = nil)
|
30
|
+
[["http://placehold.it/#{width}", *height].join("x"), *text].join("&text=")
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<!-- paulirish.com/2008/conditional-stylesheets-vs-css-hacks-answer-neither/ -->
|
3
|
+
<!--[if lt IE 7 ]> <html class="ie6" lang="en"> <![endif]-->
|
4
|
+
<!--[if IE 7 ]> <html class="ie7" lang="en"> <![endif]-->
|
5
|
+
<!--[if IE 8 ]> <html class="ie8" lang="en"> <![endif]-->
|
6
|
+
<!--[if (gte IE 9)|!(IE)]><!--> <html lang="en"> <!--<![endif]-->
|
7
|
+
<head>
|
8
|
+
<meta charset="utf-8" />
|
9
|
+
|
10
|
+
<!-- Uncomment to make IE8 render like IE7 -->
|
11
|
+
<!-- <meta http-equiv="X-UA-Compatible" content="IE=7" /> -->
|
12
|
+
|
13
|
+
<!-- Set the viewport width to device width for mobile -->
|
14
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
15
|
+
|
16
|
+
<title><%= content_for?(:title) ? yield(:title) : "Base Title" %></title>
|
17
|
+
|
18
|
+
<!-- Include google fonts -->
|
19
|
+
<!-- <link href='http://fonts.googleapis.com/css?family=Family1|Family2' rel='stylesheet' type='text/css'> -->
|
20
|
+
|
21
|
+
<%= stylesheet_link_tag "application", media: "all" %>
|
22
|
+
<%= csrf_meta_tags %>
|
23
|
+
</head>
|
24
|
+
|
25
|
+
<body>
|
26
|
+
|
27
|
+
<div class="container">
|
28
|
+
<%= render 'shared/flashes' %>
|
29
|
+
<%= yield %>
|
30
|
+
</div>
|
31
|
+
|
32
|
+
<%= javascript_include_tag "application" %>
|
33
|
+
</body>
|
34
|
+
</html>
|
@@ -0,0 +1,3 @@
|
|
1
|
+
<%= link_to "#{icon :info}".html_safe, send("admin_#{obj.class.name.underscore}_path", obj), class: 'btn btn-primary' %>
|
2
|
+
<%= link_to "#{icon :edit}".html_safe, send("edit_admin_#{obj.class.name.underscore}_path", obj), class: 'btn btn-warning' %>
|
3
|
+
<%= link_to "#{icon :trash_o}".html_safe, send("admin_#{obj.class.name.underscore}_path", obj), method: :delete, data: { confirm: "Are you sure you want to delete the #{obj.class.name} '#{obj}'?" }, class: 'btn btn-danger' %>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<% if notice %>
|
2
|
+
<div class="alert-box" data-alert>
|
3
|
+
<%= notice %>
|
4
|
+
<a href="#" class="close">×</a>
|
5
|
+
</div>
|
6
|
+
<% end -%>
|
7
|
+
<% if alert %>
|
8
|
+
<div class="alert-box alert" data-alert>
|
9
|
+
<%= alert %>
|
10
|
+
<a href="#" class="close">×</a>
|
11
|
+
</div>
|
12
|
+
<% end -%>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# Domain name for nginx config
|
2
|
+
set :domain_name, domain_base
|
3
|
+
|
4
|
+
# Remove www from incoming requests
|
5
|
+
set :rewrite_www, true
|
6
|
+
|
7
|
+
# Include ssl information for nginx
|
8
|
+
set :include_ssl, false
|
9
|
+
|
10
|
+
# Default, requires setting server_ip
|
11
|
+
set :default_host, true
|
12
|
+
set :server_ip, "#{server_ip}"
|
13
|
+
|
14
|
+
set :unicorn_workers, 1
|
15
|
+
|
16
|
+
set :rails_env, "production"
|
17
|
+
set :branch, "master"
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# Set these values for the particular application
|
2
|
+
set :domain_base, "<%= config[:domain_base] %>"
|
3
|
+
set :server_ip, "<%= config[:server_ip] %>"
|
4
|
+
set :application, "<%= app_name %>"
|
5
|
+
|
6
|
+
# Possibly set these values
|
7
|
+
set :repository, "git@git.cliftonlabs.com:web/#{application}"
|
8
|
+
set :user, "deployer"
|
9
|
+
|
10
|
+
set :stages, %w(staging production)
|
11
|
+
set :default_stage, "staging"
|
12
|
+
|
13
|
+
require "capistrano/ext/multistage"
|
14
|
+
require "bundler/capistrano"
|
15
|
+
|
16
|
+
load "config/recipes/base"
|
17
|
+
load "config/recipes/nginx"
|
18
|
+
load "config/recipes/unicorn"
|
19
|
+
load "config/recipes/postgresql"
|
20
|
+
load "config/recipes/check"
|
21
|
+
load "config/recipes/logrotate"
|
22
|
+
load "config/recipes/log"
|
23
|
+
|
24
|
+
server server_ip, :web, :app, :db, primary: true
|
25
|
+
|
26
|
+
set :shared_children, shared_children + %w{public/uploads}
|
27
|
+
|
28
|
+
set :deploy_via, :remote_cache
|
29
|
+
set :use_sudo, false
|
30
|
+
set :deploy_to, defer { "/home/#{user}/#{application}/#{stage}/" }
|
31
|
+
|
32
|
+
set :default_environment, {
|
33
|
+
'PATH' => "$HOME/.rbenv/shims:$HOME/.rbenv/bin:$PATH"
|
34
|
+
}
|
35
|
+
|
36
|
+
set :scm, "git"
|
37
|
+
|
38
|
+
default_run_options[:pty] = true
|
39
|
+
ssh_options[:forward_agent] = true
|
40
|
+
|
41
|
+
after "deploy", "deploy:cleanup" # keep only the last 5 releases
|
@@ -0,0 +1,45 @@
|
|
1
|
+
Meridian::Application.configure do
|
2
|
+
# Settings specified here will take precedence over those in config/application.rb
|
3
|
+
|
4
|
+
# In the development environment your application's code is reloaded on
|
5
|
+
# every request. This slows down response time but is perfect for development
|
6
|
+
# since you don't have to restart the web server when you make code changes.
|
7
|
+
config.cache_classes = false
|
8
|
+
|
9
|
+
# Log error messages when you accidentally call methods on nil.
|
10
|
+
config.whiny_nils = true
|
11
|
+
|
12
|
+
# Show full error reports and disable caching
|
13
|
+
config.consider_all_requests_local = true
|
14
|
+
config.action_controller.perform_caching = false
|
15
|
+
|
16
|
+
# Don't care if the mailer can't send
|
17
|
+
config.action_mailer.raise_delivery_errors = false
|
18
|
+
|
19
|
+
# Print deprecation notices to the Rails logger
|
20
|
+
config.active_support.deprecation = :log
|
21
|
+
|
22
|
+
# Only use best-standards-support built into browsers
|
23
|
+
config.action_dispatch.best_standards_support = :builtin
|
24
|
+
|
25
|
+
# Raise exception on mass assignment protection for Active Record models
|
26
|
+
config.active_record.mass_assignment_sanitizer = :strict
|
27
|
+
|
28
|
+
# Log the query plan for queries taking more than this (works
|
29
|
+
# with SQLite, MySQL, and PostgreSQL)
|
30
|
+
config.active_record.auto_explain_threshold_in_seconds = 0.5
|
31
|
+
|
32
|
+
# Do not compress assets
|
33
|
+
config.assets.compress = false
|
34
|
+
|
35
|
+
# Expands the lines which load the assets
|
36
|
+
config.assets.debug = true
|
37
|
+
|
38
|
+
config.action_mailer.default_url_options = { :host => 'localhost:3000' }
|
39
|
+
|
40
|
+
config.action_mailer.delivery_method = :letter_opener
|
41
|
+
|
42
|
+
# Add the fonts path
|
43
|
+
config.assets.paths << Rails.root.join('app', 'assets', 'fonts')
|
44
|
+
|
45
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
Meridian::Application.configure do
|
2
|
+
# Settings specified here will take precedence over those in config/application.rb
|
3
|
+
|
4
|
+
# Code is not reloaded between requests
|
5
|
+
config.cache_classes = true
|
6
|
+
|
7
|
+
# Full error reports are disabled and caching is turned on
|
8
|
+
config.consider_all_requests_local = false
|
9
|
+
config.action_controller.perform_caching = true
|
10
|
+
|
11
|
+
# Disable Rails's static asset server (Apache or nginx will already do this)
|
12
|
+
config.serve_static_assets = false
|
13
|
+
|
14
|
+
# Compress JavaScripts and CSS
|
15
|
+
config.assets.compress = true
|
16
|
+
|
17
|
+
# Don't fallback to assets pipeline if a precompiled asset is missed
|
18
|
+
config.assets.compile = false
|
19
|
+
|
20
|
+
# Generate digests for assets URLs
|
21
|
+
config.assets.digest = true
|
22
|
+
|
23
|
+
# Add the fonts path
|
24
|
+
config.assets.paths << Rails.root.join('app', 'assets', 'fonts')
|
25
|
+
|
26
|
+
# Precompile additional assets
|
27
|
+
config.assets.precompile += %w( .svg .eot .woff .ttf )
|
28
|
+
|
29
|
+
# Defaults to nil and saved in location specified by config.assets.prefix
|
30
|
+
# config.assets.manifest = YOUR_PATH
|
31
|
+
|
32
|
+
# Specifies the header that your server uses for sending files
|
33
|
+
# config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache
|
34
|
+
# config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx
|
35
|
+
|
36
|
+
# Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
|
37
|
+
# config.force_ssl = true
|
38
|
+
|
39
|
+
# See everything in the log (default is :info)
|
40
|
+
# config.log_level = :debug
|
41
|
+
|
42
|
+
# Prepend all log lines with the following tags
|
43
|
+
# config.log_tags = [ :subdomain, :uuid ]
|
44
|
+
|
45
|
+
# Use a different logger for distributed setups
|
46
|
+
# config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new)
|
47
|
+
|
48
|
+
# Use a different cache store in production
|
49
|
+
# config.cache_store = :mem_cache_store
|
50
|
+
|
51
|
+
# Enable serving of images, stylesheets, and JavaScripts from an asset server
|
52
|
+
# config.action_controller.asset_host = "http://assets.example.com"
|
53
|
+
|
54
|
+
# Disable delivery errors, bad email addresses will be ignored
|
55
|
+
# config.action_mailer.raise_delivery_errors = false
|
56
|
+
|
57
|
+
# Enable threaded mode
|
58
|
+
# config.threadsafe!
|
59
|
+
|
60
|
+
# Enable locale fallbacks for I18n (makes lookups for any locale fall back to
|
61
|
+
# the I18n.default_locale when a translation can not be found)
|
62
|
+
config.i18n.fallbacks = true
|
63
|
+
|
64
|
+
# Send deprecation notices to registered listeners
|
65
|
+
config.active_support.deprecation = :notify
|
66
|
+
|
67
|
+
# Log the query plan for queries taking more than this (works
|
68
|
+
# with SQLite, MySQL, and PostgreSQL)
|
69
|
+
# config.active_record.auto_explain_threshold_in_seconds = 0.5
|
70
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
Meridian::Application.configure do
|
2
|
+
# Settings specified here will take precedence over those in config/application.rb
|
3
|
+
|
4
|
+
# Code is not reloaded between requests
|
5
|
+
config.cache_classes = true
|
6
|
+
|
7
|
+
# Full error reports are disabled and caching is turned on
|
8
|
+
config.consider_all_requests_local = false
|
9
|
+
config.action_controller.perform_caching = true
|
10
|
+
|
11
|
+
# Disable Rails's static asset server (Apache or nginx will already do this)
|
12
|
+
config.serve_static_assets = false
|
13
|
+
|
14
|
+
# Compress JavaScripts and CSS
|
15
|
+
config.assets.compress = true
|
16
|
+
|
17
|
+
# Don't fallback to assets pipeline if a precompiled asset is missed
|
18
|
+
config.assets.compile = false
|
19
|
+
|
20
|
+
# Generate digests for assets URLs
|
21
|
+
config.assets.digest = true
|
22
|
+
|
23
|
+
# Defaults to nil and saved in location specified by config.assets.prefix
|
24
|
+
# config.assets.manifest = YOUR_PATH
|
25
|
+
|
26
|
+
# Specifies the header that your server uses for sending files
|
27
|
+
# config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache
|
28
|
+
config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx
|
29
|
+
|
30
|
+
# Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
|
31
|
+
# config.force_ssl = true
|
32
|
+
|
33
|
+
# See everything in the log (default is :info)
|
34
|
+
config.log_level = :debug
|
35
|
+
|
36
|
+
# Prepend all log lines with the following tags
|
37
|
+
# config.log_tags = [ :subdomain, :uuid ]
|
38
|
+
|
39
|
+
# Use a different logger for distributed setups
|
40
|
+
# config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new)
|
41
|
+
|
42
|
+
# Use a different cache store in production
|
43
|
+
# config.cache_store = :mem_cache_store
|
44
|
+
|
45
|
+
# Enable serving of images, stylesheets, and JavaScripts from an asset server
|
46
|
+
# config.action_controller.asset_host = "http://assets.example.com"
|
47
|
+
|
48
|
+
# Precompile additional assets (application.js, application.css, and all non-JS/CSS are already added)
|
49
|
+
config.assets.precompile += %w( application.css.scss )
|
50
|
+
|
51
|
+
# Disable delivery errors, bad email addresses will be ignored
|
52
|
+
# config.action_mailer.raise_delivery_errors = false
|
53
|
+
|
54
|
+
# Enable threaded mode
|
55
|
+
# config.threadsafe!
|
56
|
+
|
57
|
+
# Enable locale fallbacks for I18n (makes lookups for any locale fall back to
|
58
|
+
# the I18n.default_locale when a translation can not be found)
|
59
|
+
config.i18n.fallbacks = true
|
60
|
+
|
61
|
+
# Send deprecation notices to registered listeners
|
62
|
+
config.active_support.deprecation = :notify
|
63
|
+
|
64
|
+
# Log the query plan for queries taking more than this (works
|
65
|
+
# with SQLite, MySQL, and PostgreSQL)
|
66
|
+
# config.active_record.auto_explain_threshold_in_seconds = 0.5
|
67
|
+
|
68
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
Meridian::Application.configure do
|
2
|
+
# Settings specified here will take precedence over those in config/application.rb
|
3
|
+
|
4
|
+
# The test environment is used exclusively to run your application's
|
5
|
+
# test suite. You never need to work with it otherwise. Remember that
|
6
|
+
# your test database is "scratch space" for the test suite and is wiped
|
7
|
+
# and recreated between test runs. Don't rely on the data there!
|
8
|
+
config.cache_classes = true
|
9
|
+
|
10
|
+
# Configure static asset server for tests with Cache-Control for performance
|
11
|
+
config.serve_static_assets = true
|
12
|
+
config.static_cache_control = "public, max-age=3600"
|
13
|
+
|
14
|
+
# Log error messages when you accidentally call methods on nil
|
15
|
+
config.whiny_nils = true
|
16
|
+
|
17
|
+
# Show full error reports and disable caching
|
18
|
+
config.consider_all_requests_local = true
|
19
|
+
config.action_controller.perform_caching = false
|
20
|
+
|
21
|
+
# Raise exceptions instead of rendering exception templates
|
22
|
+
config.action_dispatch.show_exceptions = false
|
23
|
+
|
24
|
+
# Disable request forgery protection in test environment
|
25
|
+
config.action_controller.allow_forgery_protection = false
|
26
|
+
|
27
|
+
# Tell Action Mailer not to deliver emails to the real world.
|
28
|
+
# The :test delivery method accumulates sent emails in the
|
29
|
+
# ActionMailer::Base.deliveries array.
|
30
|
+
config.action_mailer.delivery_method = :test
|
31
|
+
|
32
|
+
# Raise exception on mass assignment protection for Active Record models
|
33
|
+
config.active_record.mass_assignment_sanitizer = :strict
|
34
|
+
|
35
|
+
# Print deprecation notices to the stderr
|
36
|
+
config.active_support.deprecation = :stderr
|
37
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
BetterErrors.editor = :sublime if defined? BetterErrors
|
@@ -0,0 +1,14 @@
|
|
1
|
+
namespace :check do
|
2
|
+
desc "Make sure local git is in sync with remote."
|
3
|
+
task :revision, roles: :web do
|
4
|
+
current_repository = "origin"
|
5
|
+
unless (`git rev-parse HEAD` == `git rev-parse #{current_repository}/#{branch}`)
|
6
|
+
puts "WARNING: HEAD is not the same as #{current_repository}/#{branch}"
|
7
|
+
puts "Run `git push` to sync changes."
|
8
|
+
exit
|
9
|
+
end
|
10
|
+
end
|
11
|
+
before "deploy", "check:revision"
|
12
|
+
before "deploy:migrations", "check:revision"
|
13
|
+
before "deploy:cold", "check:revision"
|
14
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
namespace :logrotate do
|
2
|
+
desc "Setup logrotate for all log files in log directory"
|
3
|
+
task :setup, roles: :app do
|
4
|
+
template "logrotate.erb", "/tmp/logrotate"
|
5
|
+
run "#{sudo} mv /tmp/logrotate /etc/logrotate.d/#{application}_#{stage}"
|
6
|
+
end
|
7
|
+
after "deploy:setup", "logrotate:setup"
|
8
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
namespace :nginx do
|
2
|
+
desc "Setup nginx configuration for this application"
|
3
|
+
task :setup, roles: :web do
|
4
|
+
template "nginx_unicorn.erb", "/tmp/nginx_conf"
|
5
|
+
run "#{sudo} mv /tmp/nginx_conf /etc/nginx/sites-enabled/#{application}_#{stage}"
|
6
|
+
run "#{sudo} rm -f /etc/nginx/sites-enabled/default"
|
7
|
+
restart
|
8
|
+
end
|
9
|
+
after "deploy:setup", "nginx:setup"
|
10
|
+
|
11
|
+
%w[start stop restart].each do |command|
|
12
|
+
desc "#{command} nginx"
|
13
|
+
task command, roles: :web do
|
14
|
+
run "#{sudo} service nginx #{command}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
set_default(:postgresql_host, "localhost")
|
2
|
+
set_default(:postgresql_user) { application }
|
3
|
+
set_default(:postgresql_password) { Capistrano::CLI.password_prompt "PostgreSQL Password: " }
|
4
|
+
set_default(:postgresql_database) { "#{application}_#{rails_env}" }
|
5
|
+
set_default(:postgresql_pid) { "/var/run/postgresql/9.1-main.pid" }
|
6
|
+
|
7
|
+
namespace :postgresql do
|
8
|
+
desc "Create a user for this application."
|
9
|
+
task :create_user, roles: :db, only: {primary: true} do
|
10
|
+
run %Q{#{sudo} -u postgres psql -c "create user \"#{postgresql_user}\" with password '#{postgresql_password}';"; true}
|
11
|
+
end
|
12
|
+
after "deploy:setup", "postgresql:create_user"
|
13
|
+
|
14
|
+
desc "Create a database for this application."
|
15
|
+
task :create_database, roles: :db, only: {primary: true} do
|
16
|
+
run %Q{#{sudo} -u postgres psql -c "create database \"#{postgresql_database}\" owner \"#{postgresql_user}\";"; true}
|
17
|
+
end
|
18
|
+
after "deploy:setup", "postgresql:create_database"
|
19
|
+
|
20
|
+
desc "Generate the database.yml configuration file."
|
21
|
+
task :setup, roles: :app do
|
22
|
+
run "mkdir -p #{shared_path}/config"
|
23
|
+
template "postgresql.yml.erb", "#{shared_path}/config/database.yml"
|
24
|
+
end
|
25
|
+
after "deploy:setup", "postgresql:setup"
|
26
|
+
|
27
|
+
desc "Symlink the database.yml file into latest release"
|
28
|
+
task :symlink, roles: :app do
|
29
|
+
run "ln -nfs #{shared_path}/config/database.yml #{release_path}/config/database.yml"
|
30
|
+
end
|
31
|
+
after "deploy:finalize_update", "postgresql:symlink"
|
32
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
CREATE OR REPLACE FUNCTION create_role_if_not_exists(r_name TEXT, r_pass TEXT)
|
2
|
+
RETURNS void AS $$
|
3
|
+
BEGIN
|
4
|
+
IF NOT EXISTS (
|
5
|
+
SELECT *
|
6
|
+
FROM pg_catalog.pg_user
|
7
|
+
WHERE usename = $1) THEN
|
8
|
+
EXECUTE format('CREATE ROLE %s LOGIN PASSWORD ''%s'' CREATEDB', $1, $2);
|
9
|
+
END IF;
|
10
|
+
END;
|
11
|
+
$$ LANGUAGE plpgsql;
|
12
|
+
|
13
|
+
CREATE OR REPLACE FUNCTION create_database_if_not_exists(db_name TEXT, db_owner TEXT)
|
14
|
+
RETURNS void AS $$
|
15
|
+
BEGIN
|
16
|
+
IF NOT EXISTS (
|
17
|
+
SELECT *
|
18
|
+
FROM pg_catalog.pg_database
|
19
|
+
WHERE datname = $1) THEN
|
20
|
+
EXECUTE format('CREATE DATABASE %s OWNER %s', $1, $2);
|
21
|
+
END IF;
|
22
|
+
END;
|
23
|
+
$$ LANGUAGE plpgsql;
|
@@ -0,0 +1,69 @@
|
|
1
|
+
upstream unicorn_<%= "#{application}_#{rails_env}" %> {
|
2
|
+
server unix:/tmp/unicorn.<%= "#{application}_#{rails_env}" %>.sock fail_timeout=0;
|
3
|
+
}
|
4
|
+
|
5
|
+
<% if rewrite_www %>
|
6
|
+
##############################
|
7
|
+
# Rewrite non-www to www #
|
8
|
+
##############################
|
9
|
+
server {
|
10
|
+
server_name www.<%= domain_name %>;
|
11
|
+
rewrite ^(.*) http://<%= domain_name %>$1 permanent;
|
12
|
+
}
|
13
|
+
<% end %>
|
14
|
+
|
15
|
+
############################
|
16
|
+
# Server configuration #
|
17
|
+
############################
|
18
|
+
server {
|
19
|
+
listen 80<%= " default_server" if (defined? default_host) && default_host %>;
|
20
|
+
server_name <%= domain_name %>;
|
21
|
+
root /home/<%= user %>/<%= application %>/<%= stage %>/current/public;
|
22
|
+
|
23
|
+
location ^~ /assets/ {
|
24
|
+
gzip_static on;
|
25
|
+
expires max;
|
26
|
+
add_header Cache-Control public;
|
27
|
+
}
|
28
|
+
|
29
|
+
try_files $uri @unicorn;
|
30
|
+
location @unicorn {
|
31
|
+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
32
|
+
proxy_set_header Host $http_host;
|
33
|
+
proxy_redirect off;
|
34
|
+
proxy_pass http://unicorn_<%= application %>_<%= stage %>;
|
35
|
+
}
|
36
|
+
|
37
|
+
error_page 500 502 503 504 /500.html;
|
38
|
+
client_max_body_size 4G;
|
39
|
+
keepalive_timeout 10;
|
40
|
+
}
|
41
|
+
|
42
|
+
<% if include_ssl %>
|
43
|
+
server {
|
44
|
+
listen 443;
|
45
|
+
server_name <%= domain_name %>;
|
46
|
+
ssl on;
|
47
|
+
ssl_certificate /path/to/certificate/certificate.combined.crt;
|
48
|
+
ssl_certificate_key /path/to/key/server.key;
|
49
|
+
root /home/<%= user %>/apps/<%= application %>/<%= stage %>/current/public;
|
50
|
+
|
51
|
+
location ^~ /assets/ {
|
52
|
+
gzip_static on;
|
53
|
+
expires max;
|
54
|
+
add_header Cache-Control public;
|
55
|
+
}
|
56
|
+
|
57
|
+
try_files $uri @unicorn;
|
58
|
+
location @unicorn {
|
59
|
+
proxy_set_header X-Forwarded-Proto $scheme;
|
60
|
+
proxy_set_header Host $http_host;
|
61
|
+
proxy_redirect off;
|
62
|
+
proxy_pass http://unicorn_<%= application %>_<%= stage %>;
|
63
|
+
}
|
64
|
+
|
65
|
+
error_page 500 502 503 504 /500.html;
|
66
|
+
client_max_body_size 4G;
|
67
|
+
keepalive_timeout 10;
|
68
|
+
}
|
69
|
+
<% end %>
|
@@ -0,0 +1,14 @@
|
|
1
|
+
working_directory "<%= current_path %>"
|
2
|
+
pid "<%= unicorn_pid %>"
|
3
|
+
stderr_path "<%= unicorn_log %>"
|
4
|
+
stdout_path "<%= unicorn_log %>"
|
5
|
+
preload_app true
|
6
|
+
|
7
|
+
listen "/tmp/unicorn.<%= "#{application}_#{stage}" %>.sock"
|
8
|
+
worker_processes <%= unicorn_workers %>
|
9
|
+
timeout 30
|
10
|
+
|
11
|
+
after_fork do |server, worker|
|
12
|
+
child_pid = server.config[:pid].sub(".pid", "#{worker.nr}.pid")
|
13
|
+
system("echo #{Process.pid} > #{child_pid}")
|
14
|
+
end
|