No release in over a year
MagicRecipesTwo contains our most used deployment recipes for Capistrano-3.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies
 Project Readme

MagicRecipesTwo

Our most used recipes for Capistrano-3!

Not using capistrano-3, see Capistrano 2 version

Includes

  • assets compile assets locally, than upload them (fully integrated)
  • db seed task + backup task
  • exception_pages copy exception pages from assets to public (if you generate them with sprockets)
  • inform_slack inform a slack channel about successful upload
  • lets encrypt install certs, add cron job, create Diffie-Hellman
  • monit control monit with monit-webinterface
  • nginx control nginx with several instances and ssl
  • redirect_page a page that redirects to new domain after 10 sec. info old-page -> new-page
  • redis control redis
  • secrets handling of rails 4 secrets
  • sidekiq control sidekiq
  • sidekiq_six control sidekiq with systemd deamon
  • thin control thin
  • thin_sysd control thin with systemd deamon

ChangeLog:

DOCU:


Still work in progress .. so maybe not ready for your needs! .. but also used a lot in production :)


Usage

  • add Gem to your gemfile
  gem 'magic_recipes_two', '>= 0.0.95', group: :development
  • run bundle
  • run bundle exec cap install
  • add the following:

in Capfile

    ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## 
    ## MagicRecipes .. pick what you need
    
    # => require 'capistrano/rvm'
    # => require 'rvm1/capistrano3'
    # => require 'capistrano/bundler'
    # => require 'capistrano/rails/assets'
    # => require 'capistrano/rails/migrations'
    # => require 'capistrano/postgresql'
    
    # => require 'capistrano/magic_recipes/assets'
    # => require 'capistrano/magic_recipes/db'
    # => require 'capistrano/magic_recipes/exception_pages'
    # => require 'capistrano/magic_recipes/inform_slack'
    # => require 'capistrano/magic_recipes/lets_encrypt'
    # => require 'capistrano/magic_recipes/logs'
    # => require 'capistrano/magic_recipes/monit'
    # => require 'capistrano/magic_recipes/nginx'
    # => require 'capistrano/magic_recipes/pwa'
    # => require 'capistrano/magic_recipes/redis'
    # => require 'capistrano/magic_recipes/redirect_page'
    # => require 'capistrano/magic_recipes/secrets'
    # => require 'capistrano/magic_recipes/sidekiq'
		# => require 'capistrano/magic_recipes/sidekiq_six'
    # => require 'capistrano/magic_recipes/thin'
		# => require 'capistrano/magic_recipes/thin_sysd'
    
    ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## 

in deploy file

## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## 
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## 
## MagicRecipes .. pick what you need
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## 
    
    # => set :user,        'deployuser'
    # => set :deploy_to,   "/home/#{fetch(:user)}/#{fetch(:application)}-#{fetch(:stage)}"
    
    
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
## => bundler
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
    
    # => set :bundle_roles,         :all                                  # this is default
    # => set :bundle_servers,       release_roles(fetch(:bundle_roles)) } # this is default
    # => set :bundle_binstubs,      shared_path.join('bin') }             # default: nil
    # => set :bundle_gemfile,       release_path.join('MyGemfile') }      # default: nil
    # => set :bundle_path,          shared_path.join('my_special_bundle') # default: nil
    # => set :bundle_without,       %w{development test}.join(' ')        # this is default
    # => set :bundle_flags,         '--deployment --quiet'                # this is default
    # => set :bundle_env_variables, {}                                    # this is default
    # => set :bundle_bins, fetch(:bundle_bins, []).push('my_new_binary')  # You can add any custom executable to this list
    
    
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
## => db
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
    
    # => set :db_roles,             :db
    # => set :db_backup_on_deploy,  false   # make DB backup (yaml_db) before deployment
    
    
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
## => inform slack
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
    
    # => set :slack_token,           "xxx-xxx-xxx-xxx"
    # => set :slack_channel,         "xxx-xxx-xxx-xxx" # "channel_id" or "#channel_name"
    # => set :slack_text,            "New Deployment on *#{ fetch(:stage) }* ... check:  #{fetch(:nginx_use_ssl) ? 'https': 'htpp'}://#{ fetch(:nginx_major_domain) ? fetch(:nginx_major_domain).gsub(/^\*?\./, "") : Array( fetch(:nginx_domains) ).first.gsub(/^\*?\./, "") }"
    # => set :slack_username,        "capistrano (#{fetch(:stage)})"
    # => set :slack_production_icon, "http://icons.iconarchive.com/icons/itzikgur/my-seven/128/Backup-IBM-Server-icon.png"
    # => set :slack_staging_icon,    "http://itekblog.com/wp-content/uploads/2012/07/railslogo.png"
    
    
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
## => lets encrypt  .. needs *nginx* :allow_well_known to be true!
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
    
    # => set :lets_encrypt_roles,         :web
    # => set :lets_encrypt_path,          "~"
    # Array without www.domains "www" will be auto-added! .. First domain is main one!
    # => set :lets_encrypt_domains,       fetch(:nginx_major_domain,false) ? [fetch(:nginx_major_domain)] + Array(fetch(:nginx_domains)) : Array(fetch(:nginx_domains))
    # => set :lets_encrypt__www_domains,  true # also encrypt www. domains
    # => set :lets_encrypt_cron_log,      "#{shared_path}/log/lets_encrypt_cron.log"
    # => set :lets_encrypt_email,         "admin@example.com"
	# Client type: new: "certbot" or old "certbot-auto"
	# => set :lets_encrypt_client,        "certbot-auto"
    
    
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
## => logs .. (if you need to check app log-files)
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
    
    # => set :logs_roles,                 :web    # on roles ..
    # => set :logs_show_lines,            500     # show the last .. lines of log-file
    
    
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
## => monit
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
    
    ## Status (monit is running or not .. activate monit hooks in deploy chain)
    # => set :monit_active,                         true
    ## Main-Instance (write monitrc?)
    # => set :monit_main_rc,                        true
    ## Monit-Processes (what should be monitored) = nginx pm2 postgresql pwa redis sidekiq thin website
    # => set :monit_processes,                      %w[nginx postgresql thin website]
    # => set :monit_name,                           "#{ fetch(:application) }_#{ fetch(:stage) }"
    ## Monit System
    # => set :monit_roles,                          :web
    # => set :monit_interval,                       30
    # => set :monit_bin,                            '/usr/bin/monit'
    ## Monit Log-File (Monit default: '/var/log/monit.log')
    # => set :monit_logfile,                        "#{shared_path}/log/monit.log"
    # => set :monit_idfile,                         '/var/lib/monit/id'
    # => set :monit_statefile,                      '/var/lib/monit/state'
    ## Downgrade to 5.16 on deploy (to fix action problems):
    # => set :monit_downgrade_on_deploy,            false
    ## Mailer
    # => set :monit_mail_server,                    "smtp.gmail.com"
    # => set :monit_mail_port,                      587
    # => set :monit_mail_authentication,            false # SSLAUTO|SSLV2|SSLV3|TLSV1|TLSV11|TLSV12
    # => set :monit_mail_username,                  "foo@example.com"
    # => set :monit_mail_password,                  "secret"
    # => set :monit_ignore,                         []  # %w[action pid]
    ## Change me!!
    # => set :monit_mail_to,                        "foo@example.com"
    # => set :monit_mail_from,                      "monit@foo.bar"
    # => set :monit_mail_reply_to,                  "support@foo.bar"
    ## Additional stuff for postrgres
    # => set :monit_pg_pid,                       	"/var/run/postgresql/12-main.pid"
    ## Additional stuff for thin (need secrets_key_base to be set)
    # => set :monit_thin_totalmem_mb,               300
    ## Additional stuff for sidekiq (need secrets_key_base to be set)
    # => set :monit_sidekiq_totalmem_mb,            300
    # => set :monit_sidekiq_timeout_sec,            90
    ## Additional App helpers (for in app processes like: thin, sidekiq)
    # => set :monit_app_worker_command,             "cd #{ current_path } ; #{fetch(:rvm_path)}/bin/rvm #{fetch(:rvm_ruby_version)} do bundle exec MONIT_CMD"
    #   needs to include at least MONIT_CMD, which gets replaced with current command
    #   ## RVM:
    #    - "cd #{ current_path } ; #{fetch(:rvm_path)}/bin/rvm #{fetch(:rvm_ruby_version)} do bundle exec MONIT_CMD"
    #   ## RVM1Caspistrano3:
    #    - "cd #{ current_path } ; #{fetch(:rvm1_auto_script_path)}/rvm-auto.sh #{fetch(:rvm1_ruby_version)} bundle exec MONIT_CMD"
    #   ## if all is root
    #    - "/usr/bin/env cd #{current_path} ; bundle exec MONIT_CMD"
    #   ## last option (if nothing else helps)
    #    - "/bin/su - #{@role.user} -c 'cd #{current_path} ; bundle exec MONIT_CMD'"
    ## WebClient
    # => set :monit_http_client,                    true
    # => set :monit_http_port,                      2812
    # => set :monit_http_username,                  "admin"
    # => set :monit_http_password,                  "monitor"
    # use a domain / subdomain for monit?
    # => set :monit_webclient,             					false
    # => set :monit_webclient_domain,      					false
    # => set :monit_webclient_use_ssl,     					false
    # => set :monit_webclient_ssl_cert,    					false
    # => set :monit_webclient_ssl_key,     					false
    # => set :monit_nginx_template,        					:default
    ## Website
    # => set :monit_website_check_content,          false
    # => set :monit_website_check_path,             "/"
    # => set :monit_website_check_text,             "<!DOCTYPE html>"
    # => set :monit_website_check_timeout,          20
    # => set :monit_website_check_cycles,           3
    ## check other Sites:
    set :monit_websites_to_check,     							[]  # instance => { name: String, domain: String, ssl: Boolean, check_content: Boolean, path: String, content: String }
    ## M/Monit
    # => set :monit_mmonit_url,                     false
    ## PM2 - JS - App
    # set :monit_pm2_app_name,                      "app"
    # set :monit_pm2_app_instances,                 1
    # set :monit_pm2_app_path,                      "/home/#{fetch(:user)}/pm2_app"
    # set :monit_pm2_pid_path,                      "/home/#{fetch(:user)}/.pm2/pids"
    # set :monit_pm2_start_script,                  "ecosystem.config.js"
    # set :monit_pm2_stage,                         "production"
    # set :pm2_roles,                               :web
    # set :monit_pm2_worker_role,                   :user
    ## if prefix for monit command is needed .. ie: "[ -s \"$HOME/.nvm/nvm.sh\" ] && \. \"$HOME/.nvm/nvm.sh\" ; nvm use 9.9.0 ; "
    # set :monit_pm2_worker_prefix,                 ""
		## check website powered by pm2 .. for more settings use :monit_websites_to_check
    # set :monit_pm2_check_website,     						false
    # set :monit_pm2_website_name,      						"PM2 #{fetch(:application)} #{fetch(:stage)}"
    # set :monit_pm2_website_url,       						"example.com"
    # set :monit_pm2_website_ssl,       						false
    ## check other Sites:
    set :monit_websites_to_check,     							[]
    # Website: { name: String, domain: String, ssl: Boolean, check_content: Boolean, path: String, content: String }
    ## Check files
    set :monit_files_to_check,        							[]
    ## FILE: { name: String, path: String, max_size: Integer, clear: Boolean }
    ## Slack Alerts
    set :monit_use_slack,             							false
    set :monit_slack_webhook,         							"" # your Slack webhook URL
    set :monit_slack_bin_path,        							"/etc/monit/alert_slack.sh"
    
    
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
## => nginx
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
    
    # => set :app_server_ip,                   "127.0.0.1"
    ## all domains the app uses
    # => set :nginx_domains,                   []               # array of domains
    ## app is the default site for this server?
    # => set :default_site,                    false            # true | false
    ## all domains are redirected to this one, domain
    # => set :nginx_major_domain,              false            # "domain-name.tld" | false
    ## remove "www" from each request?
    # => set :nginx_remove_www,                true             # true | false
    ## how many (thin) server instances 
    # => set :app_instances,                   1                # number >= 1
    ## use wildcard for domain?
    # => set :nginx_domain_wildcard,           false
    ## redirect all subdomains?
    # => set :nginx_redirect_subdomains,       false
    ## nginx service path
    # => set :nginx_service_path,              'service nginx'
    # => set :nginx_roles,                     :web
    # => set :nginx_log_path,                  "#{shared_path}/log"
    # => set :nginx_root_path,                 "/etc/nginx"
    # => set :nginx_static_dir,                "public"
    # => set :nginx_sites_enabled,             "sites-enabled"
    # => set :nginx_sites_available,           "sites-available"
    # => set :nginx_template,                  :default
    # => set :nginx_use_ssl,                   false
    ## ssl certificates
    # => set :nginx_ssl_cert,                  "/etc/ssl/certs/#{fetch(:application)}.crt"
    # => set :nginx_ssl_key,                   "/etc/ssl/private/#{fetch(:application)}.key"
    ## certs for other domains (when :nginx_major_domain is set)
    # => set :nginx_other_ssl_cert,            fetch(:nginx_ssl_cert)
    # => set :nginx_other_ssl_key,             fetch(:nginx_ssl_key)
    ## activate nginx hooks in deploy chain ?
    # => set :nginx_hooks,                     true
    ## Lets Encrypt - Challenge Path
    # => set :allow_well_known,                false
    ## only turn on, when rails :force_ssl is false !
    # => set :nginx_strict_security,           false
    # Diffie-Hellman settings
    # => set :nginx_use_diffie_hellman,        false
    # => set :nginx_diffie_hellman_param,      "/etc/ssl/certs/dhparam.pem"
    # => set :nginx_ssl_ciphers,               ".. long cipher string .." # check: https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html
    
    
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
## => NginX - Proxy-Cache
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
    
    # -> Send appropriate cache headers ( Cache-Control: max-age=X, public ) to activate cache
    # -> Send bypass headers ( bypass_proxy: true ) to bypass cache
    ## ## ##
    ## Cache Rails-App
    ## ## ##
    # => set :proxy_cache_rails,           false                                                   # cache active?
    # => set :proxy_cache_rails_directory, "#{shared_path}/tmp/proxy_cache/rails"                  # cache directory
    # => set :proxy_cache_rails_levels,    "1:2"                                                   # cache level
    # => set :proxy_cache_rails_name,      "RAILS_#{fetch(:application)}_#{fetch(:stage)}_CACHE"   # cache name
    # => set :proxy_cache_rails_size,      "4m"                                                    # max-key-size ( 1m = 8000 keys)
    # => set :proxy_cache_rails_time,      "24h"                                                   # cache invalidate after
    # => set :proxy_cache_rails_max,       "1g"                                                    # max-cache-size
    # cache 200 / 302 Pages ?
    # => set :proxy_cache_rails_200,       false                                                   # false | time
    # cache 404 Pages ?
    # => set :proxy_cache_rails_404,       "60m"                                                   # false | time
    # use stale content when state is in:
    # => set :proxy_cache_rails_stale,     ["error", "timeout", "invalid_header", "updating"]      # stale when (array)
    ## ## ##
    ## Cache Media (Dragonfly/Paperclip/..) 
    ## ## ##
    # => set :proxy_cache_media,           false                                                   # cache active?
    # media-path ('media' for dargonfly, 'system' for paperclip)
    # => set :proxy_cache_media_path,      "media"                                                 # media path (string)
    # => set :proxy_cache_media_directory, "#{shared_path}/tmp/proxy_cache/media"                  # cache directory
    # => set :proxy_cache_media_levels,    "1:2"                                                   # cache level
    # => set :proxy_cache_media_name,      "MEDIA_#{fetch(:application)}_#{fetch(:stage)}_CACHE"   # cache name
    # => set :proxy_cache_media_size,      "2m"                                                    # max-key-size ( 1m = 8000 keys)
    # => set :proxy_cache_media_time,      "48h"                                                   # cache invalidate after
    # => set :proxy_cache_media_max,       "1g"                                                    # max-cache-size
    
    
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
## => pwa
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
    
    # => set :pwa_roles,           :web
    # => set :pwa_application,     "#{fetch(:application)}_mobile"
    ## Pathes
    # => set :pwa_root_path,       "#{ current_path }/dist"
    # => set :pwa_local_path,      "./dist/"
    ## Site (nginx helper)
    # => set :pwa_domains,         []
    # => set :pwa_major_domain,    false
    # => set :pwa_ssl_domains,     fetch(:pwa_major_domain,false) ? [fetch(:pwa_major_domain)] + Array(fetch(:pwa_domains)) : Array(fetch(:pwa_domains))
    # => set :pwa_is_default_site, false
    # => set :pwa_nginx_hooks,     false
    # => set :pwa_nginx_template,  :default
    ## SSL (lets_encrypt helper)
    # => set :pwa_use_ssl,         false
    # => set :pwa_ssl_cert,        ""
    # => set :pwa_ssl_key,         ""
    
    
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
## => postgresql
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
    
    # => set :pg_database,         "#{fetch(:application)}_#{fetch(:stage)}"
    # => set :pg_user,             fetch(:pg_database)
    # => set :pg_ask_for_password, false
    # => set :pg_password,         ask_for_or_generate_password
    # => set :pg_system_user,      'postgres'
    # => set :pg_system_db,        'postgres'
    # => set :pg_use_hstore,       false
    # => set :pg_extensions,       []
    ## template only settings
    # => set :pg_templates_path,   'config/deploy/templates'
    # => set :pg_env,              fetch(:rails_env) || fetch(:stage)
    # => set :pg_pool,             5
    # => set :pg_encoding,         'unicode'
    ## for multiple release nodes automatically use server hostname (IP?) in the database.yml
    # => set :pg_host, -> do
    # =>   if release_roles(:all).count == 1 && release_roles(:all).first == primary(:db)
    # =>     'localhost'
    # =>   else
    # =>     primary(:db).hostname
    # =>   end
    # => end
    
    
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
## => rails
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
    
    # => set :rails_env, 'staging'                  # If the environment differs from the stage name
    # => set :migration_role, 'migrator'            # Defaults to 'db'
    # => set :conditionally_migrate, true           # Defaults to false. If true, it's skip migration if files in db/migrate not modified
    # => set :assets_roles, [:web, :app]            # Defaults to [:web]
    # => set :assets_prefix, 'prepackaged-assets'   # Defaults to 'assets' this should match config.assets.prefix in your rails config/application.rb
    ## If you need to touch public/images, public/javascripts and public/stylesheets on each deploy:
    # => set :normalize_asset_timestamps, %{public/images public/javascripts public/stylesheets}
    
    
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
## => redirect_page
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
    
    # => set :redirect_page_active,        false  # auto-include on each deploy ?
    # => set :redirect_old_domains,        []     # list of old sites to redirect (ie:  ['test.com', 'try.com'])
    # => set :redirect_old_ssl_domains,    []     # which old_sites have ssl (ie:  ['test.com'])
    # => set :redirect_new_domain,         ''     # domain of new page (ie:  https://example.com)
    # => set :redirect_new_name,           ''     # name of new page (ie:  example.com)
    # => set :redirect_ssl_cert,           ''     # path to cert for all old_ssl_domains
    # => set :redirect_ssl_key,            ''     # path to key for all old_ssl_domains
    ## deeper configs
    # => set :redirect_roles,              :app
    # => set :redirect_index_path,         "redirector"
    # => set :redirect_index_parent,       "#{ shared_path }"
    # => set :redirect_index_template,     :default
    # => set :redirect_nginx_template,     :default
    # => set :redirect_conf_name,          "redirector_#{fetch(:application)}_#{fetch(:stage)}"
    
    
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
## => redis
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
    
    # => set :redis_roles,            :web
    # => set :redis_pid,              "/var/run/redis/redis-server.pid"
    
    
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
## => rvm  (if used)
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
    
    # => set :rvm_type,               :user               # Defaults to: :auto .. (:auto | :system | :user)
    # => set :rvm_ruby_version,       '2.0.0-p247'        # Defaults to: 'default'
    # => set :rvm_custom_path,        '~/.myveryownrvm'   # only needed if not detected
    # => set :rvm_roles,              [:app, :web]
    # => set :rvm_map_bins,           %w{gem rake ruby bundle}
	# => set :rvm_path,               '/usr/local/rvm'
    
        
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
## => rvm1capistrano3  (if used)
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
    
    # => set :rvm1_ruby_version,      "."
    # => set :rvm1_map_bins,          %w{rake gem bundle ruby}
    # => set :rvm1_alias_name,        fetch(:application)
    # => set :rvm1_auto_script_path,  "#{fetch(:deploy_to)}/rvm1scripts"
    
    
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
## => secrets
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
    
    # => set :secrets_roles,       :app
    # => set :secrets_profile,     "bashrc" # "profile" | "bashrc" | "bach_profile" | "bash_login"
    # => set :secrets_key_base,    generate_secrect_key
    # => set :secrets_key_name,    "#{ fetch(:application) }_#{ fetch(:stage) }_SECRET_KEY_BASE".gsub(/-/, "_").gsub(/[^a-zA-Z_]/, "").upcase
    # => set :secrets_user_path,   { "/home/#{fetch(:user)}"
    # => set :secrets_set_both,    false  # also save usual SECRET_KEY_BASE 
    # => set :secrets_hooks,       true   # activate secrets hooks in setup chain ?
    # => set :secrets_set_env,     true   # also set in /etc/environment (for rvm usage)
    # => set :secrets_set_etc,     false  # also set in /etc/profile (for all machine users)
    # => set :secrets_symlink,     false  # auto symlink secrets.yml on each deploy (not needed if set in :linked_files)
    
    
    
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
## => sidekiq
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
    
    # => set :sidekiq_default_hooks,   true
    # => set :sidekiq_pid,             File.join(shared_path, 'pids', 'sidekiq.pid')
    # => set :sidekiq_env,             fetch(:rack_env, fetch(:rails_env, fetch(:stage)))
    # => set :sidekiq_log,             File.join(shared_path, 'log', 'sidekiq.log')
    # => set :sidekiq_timeout,         10
    # => set :sidekiq_roles,           :app
    # => set :sidekiq_processes,       1
    # => set :sidekiq_concurrency,     3      # how many threads to spawn
    ## If needed, you can set special queues and configure it seperately .. options:
    ##    - queue:      string    # => queue-name       (default: "default")
    ##    - processes:  integer   # => number processes (default: 1)
    ##    - worker:     integer   # => concurrency      (default: 7)
    ##      ie: [ {queue: "default", processes: 1, worker: 15}, {queue: "single", processes: 1, worker: 1} ]
    # => set :sidekiq_special_queues,   false
    # => set :sidekiq_queued_processes, []
    ## Rbenv and RVM integration
    # => set :rbenv_map_bins,          fetch(:rbenv_map_bins).to_a.concat(%w(sidekiq sidekiqctl))
    # => set :rvm_map_bins,            fetch(:rvm_map_bins).to_a.concat(%w(sidekiq sidekiqctl))
	
    
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
## => sidekiq_six  *(sidekiq 6+ on sysd)*
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
    
	## CAUTION: if used with rvm, set `:rvm_custom_path` to `/home/YOUR_USER/.rvm` or whatever absolute path .. 
	## new systemd doesn't like `~/..` path in ExecCommand !!! (stderr: Failed to start ...service has a bad unit file setting.)
	##
	# => set :sidekiq_six_default_hooks,     true
    # => set :sidekiq_six_deamon_file,       "sidekiq_#{fetch(:application)}_#{fetch(:stage)}"
    # => set :sidekiq_six_timeout,           10
    # => set :sidekiq_six_roles,             :app
    # => set :sidekiq_six_processes,         1
    # => # Sidekiq queued processes:
    # => 
    # => set :sidekiq_six_special_queues,    false
    # => set :sidekiq_six_queued_processes,  []
    # => 
	## If needed you can set special queues and configure it seperately
    ## .. options:  
    ##    - queue:      string    # => queue-name       (default: "default")
    ##    - processes:  integer   # => number processes (default: 1)
    ##    - worker:     integer   # => concurrency      (default: 7)
    ## => [ { queue: "queue_name", processes: "count", worker: "count" }]
    # => 
    # => set :sidekiq_six_deamon_path,       "/lib/systemd/system"
    # => set :sidekiq_six_deamon_template,   :default
	# => 
    # => set :sidekiq_six_ruby_vm,           :system   	## ( :rvm | :rbenv | :system )
	# => set :sidekiq_six_user,              fetch(:user, 'deploy')   ## role-user
    
    
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
## => thin
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
    
    # => set :thin_path,                  '/etc/thin'     # => thin path on your server
    # => set :thin_roles,                 :web            # => thin roles
    # => set :thin_timeout,               30              # => Request or command timeout in sec (default: 30)
    # => set :thin_max_conns,             1024            # => Maximum number of open file descriptors (default: 1024)
    # => set :thin_max_persistent_conns,  512             # => Maximum number of persistent connections (default: 100)
    # => set :thin_require,               []              # => require the library
    # => set :thin_wait,                  90              # => Maximum wait time for server to be started in seconds
    # => set :thin_onebyone,              true            # => for zero-downtime deployment (only works with restart command)
    # => set :thin_daemonize,             true 			  # => daemonize ? default = true
    # => set :thin_hooks,                 true            # => activate thin hooks in deploy chain ?
    
    
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
## => thin_sysd   *.. thin with systemd managed process*
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
    
	## CAUTION: if used with rvm, set `:rvm_custom_path` to `/home/YOUR_USER/.rvm` or whatever absolute path .. 
	## new systemd doesn't like `~/..` path in ExecCommand !!! (stderr: Failed to start ...service has a bad unit file setting.)
	## 
    # => set :thin_path,                  '/etc/thin'     # => thin path on your server
    # => set :thin_roles,                 :web            # => thin roles
    # => set :thin_timeout,               30              # => Request or command timeout in sec (default: 30)
    # => set :thin_max_conns,             1024            # => Maximum number of open file descriptors (default: 1024)
    # => set :thin_max_persistent_conns,  512             # => Maximum number of persistent connections (default: 100)
    # => set :thin_require,               []              # => require the library
    # => set :thin_wait,                  90              # => Maximum wait time for server to be started in seconds
    # => set :thin_onebyone,              true            # => for zero-downtime deployment (only works with restart command)
	# => set :thin_daemonize,             true 			  # => daemonize ? default = true
    # => set :thin_hooks,                 true            # => activate thin hooks in deploy chain ?
	## New control thin daemon
    # => set :thin_daemon_file,           "thin_#{fetch(:application)}_#{fetch(:stage)}"
    # => set :thin_daemon_path,           "/lib/systemd/system"
	# => set :thin_daemon_ruby_vm,        :system   	  ## ( :rvm | :rbenv | :system )
    # => set :thin_daemon_template,       :default
    # => set :thin_daemon_log_lines,      100
    # => set :thin_daemon_user,           fetch(:user, 'deploy')	 # => daemon user
    
    
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## 
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## 

ToDos

  • clean up code
  • write some generators
  • testing

LICENSE

This project rocks and uses MIT-LICENSE.