From 034ecfeacde3d883969cbf019a10c2ca760f6196 Mon Sep 17 00:00:00 2001 From: taitus Date: Tue, 13 May 2025 18:42:35 +0200 Subject: [PATCH] Copy Puma systemd unit template from capistrano3-puma This commit copies the default puma.service.erb template from the capistrano3-puma gem into lib/capistrano/templates. This allows us to customize the generated systemd unit file during deploy. Note that we are also removing the `:puma_conf` variable from `config/deploy.rb`, as the new ExecStart line in the systemd template (based on capistrano3-puma 6.0.0) does not rely on a separate Puma config file. The command now directly invokes: ExecStart=<%= expanded_bundle_command %> exec puma -e <%= fetch(:puma_env) %> This replaces the older format used in 5.2.0: ExecStart=<%= expanded_bundle_command %> exec --keep-file-descriptors puma -C <%= fetch(:puma_conf) %> which required explicitly setting the Puma config path. --- .erb_lint.yml | 1 + config/deploy.rb | 1 - lib/capistrano/templates/puma.service.erb | 40 +++++++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 lib/capistrano/templates/puma.service.erb 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/config/deploy.rb b/config/deploy.rb index f6f56bd5a..f9ddff364 100644 --- a/config/deploy.rb +++ b/config/deploy.rb @@ -49,7 +49,6 @@ 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"] diff --git a/lib/capistrano/templates/puma.service.erb b/lib/capistrano/templates/puma.service.erb new file mode 100644 index 000000000..e546f11dc --- /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=syslog.target network.target + +[Service] +Type=<%= service_unit_type %> +WatchdogSec=10 +<%="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=<%= fetch(:puma_service_unit_name) %> +[Install] +WantedBy=<%=(fetch(:puma_systemctl_user) == :system) ? "multi-user.target" : "default.target"%>