diff --git a/.erb_lint.yml b/.erb_lint.yml index aeb957940..e103da640 100644 --- a/.erb_lint.yml +++ b/.erb_lint.yml @@ -2,6 +2,7 @@ EnableDefaultLinters: false exclude: - '**/vendor/**/*' + - 'lib/capistrano/templates/*' linters: AllowedScriptType: enabled: true diff --git a/Gemfile b/Gemfile index 658e904c5..75e6a59e3 100644 --- a/Gemfile +++ b/Gemfile @@ -91,7 +91,7 @@ group :development do gem "capistrano-npm", "~> 1.0.3", require: false gem "capistrano-rails", "~> 1.7.0", require: false gem "capistrano3-delayed-job", "~> 1.7.6" - gem "capistrano3-puma", "~> 5.2.0" + gem "capistrano3-puma", "~> 6.0.0" gem "erb_lint", "~> 0.9.0", require: false gem "faraday-retry", "~> 2.2.1", require: false gem "htmlbeautifier", "~> 1.4.3", require: false diff --git a/Gemfile.lock b/Gemfile.lock index 718009567..f22dd1570 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -139,10 +139,10 @@ GEM capistrano3-delayed-job (1.7.6) capistrano (~> 3.0, >= 3.0.0) daemons (~> 1.3) - capistrano3-puma (5.2.0) + capistrano3-puma (6.0.0) capistrano (~> 3.7) capistrano-bundler - puma (>= 4.0, < 6.0) + puma (>= 5.1, < 7.0) capybara (3.40.0) addressable matrix @@ -751,7 +751,7 @@ DEPENDENCIES capistrano-npm (~> 1.0.3) capistrano-rails (~> 1.7.0) capistrano3-delayed-job (~> 1.7.6) - capistrano3-puma (~> 5.2.0) + capistrano3-puma (~> 6.0.0) capybara (~> 3.40.0) capybara-webmock (~> 0.7.0) caxlsx (~> 4.2.0) diff --git a/config/deploy.rb b/config/deploy.rb index 84d1e6fcc..3b1ab6d2c 100644 --- a/config/deploy.rb +++ b/config/deploy.rb @@ -49,10 +49,13 @@ set :fnm_setup_command, -> do set :fnm_install_node_command, -> { "#{fetch(:fnm_setup_command)} && fnm use --install-if-missing" } set :fnm_map_bins, %w[node npm rake yarn] -set :puma_conf, "#{release_path}/config/puma/#{fetch(:rails_env)}.rb" set :puma_systemctl_user, :user set :puma_enable_socket_service, true set :puma_service_unit_env_vars, ["EXECJS_RUNTIME=Disabled"] +set :puma_service_unit_name, -> { "puma_#{fetch(:application)}_#{fetch(:stage)}" } +set :puma_bind, "unix://#{shared_path}/tmp/sockets/puma.sock" +set :puma_access_log, -> { File.join(shared_path, "log", "puma_access.log") } +set :puma_error_log, -> { File.join(shared_path, "log", "puma_error.log") } set :delayed_job_workers, 2 set :delayed_job_roles, :background @@ -170,6 +173,6 @@ task :setup_puma do end end - after "setup_puma", "puma:systemd:config" - after "setup_puma", "puma:systemd:enable" + after "setup_puma", "puma:install" + after "setup_puma", "puma:enable" end diff --git a/lib/capistrano/templates/puma.service.erb b/lib/capistrano/templates/puma.service.erb new file mode 100644 index 000000000..9571a15ad --- /dev/null +++ b/lib/capistrano/templates/puma.service.erb @@ -0,0 +1,40 @@ +# This file tells systemd how to run Puma as a 24/7 long-running daemon. +# +# Customize this file based on your bundler location, app directory, etc. +# Customize and copy this into /usr/lib/systemd/system (CentOS) or /lib/systemd/system (Ubuntu). +# Then run: +# - systemctl enable <%= fetch(:puma_service_unit_name) %> +# - systemctl {start,stop,restart} <%= fetch(:puma_service_unit_name) %> +# +# +# Use `journalctl -u <%= fetch(:puma_service_unit_name) %> -rn 100` to view the last 100 lines of log output. +# +[Unit] +Description=Puma HTTP Server for <%= "#{fetch(:application)} (#{fetch(:stage)})" %> +<%= "Requires=#{fetch(:puma_service_unit_name)}.socket" if fetch(:puma_enable_socket_service) %> +After=network.target + +[Service] +Type=<%= service_unit_type %> +WatchdogSec=0 +<%="User=#{puma_user(@role)}" if fetch(:puma_systemctl_user) == :system %> +WorkingDirectory=<%= current_path %> +ExecStart=<%= expanded_bundle_command %> exec puma -e <%= fetch(:puma_env) %> +ExecReload=/bin/kill -USR1 $MAINPID +<%- Array(fetch(:puma_service_unit_env_files)).each do |file| %> +<%="EnvironmentFile=#{file}" -%> +<% end -%> +<% Array(fetch(:puma_service_unit_env_vars)).each do |environment_variable| %> +<%="Environment=\"#{environment_variable}\"" -%> +<% end -%> + +# if we crash, restart +RestartSec=1 +Restart=on-failure + +<%="StandardOutput=append:#{fetch(:puma_access_log)}" if fetch(:puma_access_log) %> +<%="StandardError=append:#{fetch(:puma_error_log)}" if fetch(:puma_error_log) %> + +SyslogIdentifier=puma +[Install] +WantedBy=<%=(fetch(:puma_systemctl_user) == :system) ? "multi-user.target" : "default.target"%>