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.