mina-puma-systemd 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ad4af73589fe1c4dcb53e8816185ef82340a7c3534fb6454084bb4e328858d08
4
- data.tar.gz: c2977d9ac9933c091a584e8eabc245634a8e04539a5e00727a3c4a1b70b70b3c
3
+ metadata.gz: cee49f9c394f0983df8630691473adf2ba83c7f63380457d327edb635d5f68bf
4
+ data.tar.gz: ee26eed2ddaf3f0ee8601c5ccf9072fee4ec4a116ea31ac3c6a3f32f35a361cf
5
5
  SHA512:
6
- metadata.gz: 54f162124df84afbdf1930a45e6f050683e2164e580a221ef6b5d84f99bf8c774e462ab6dad3d121765dcd1fb2a83dda477c306dac82e0c908e72f16311c5b51
7
- data.tar.gz: 1f640b0744defe3e0fc4e8a1408973d3f21f93a09ae093bb40743da5a77f1fe955f6b503a86d8f86ca2dc03ff6efa176a25e4ad60f273b71f302353ed050796e
6
+ metadata.gz: 536e4e40908b2ec4588bd22763e76c8e9495a60f728839eb65975bacf64eb66e0ee733d45d035faad65e8342dfd2542dcc57efaefc9210a418d5fbe50a268eb3
7
+ data.tar.gz: 7b9a8996aeece1afb2845439d3dea35dd1c5bc58813c976475b4154670962e848b28db3a011edc945c271a132454cd03816368c340db889669119ae3a2df127a
data/README.md CHANGED
@@ -10,6 +10,8 @@ This gem provides several mina tasks:
10
10
  mina puma:start # Start puma
11
11
  mina puma:stop # Stop puma
12
12
  mina puma:status # Get status
13
+ mina puma:enable # Enables systemd service
14
+ mina puma:disable # Disables systemd service
13
15
 
14
16
  ## Installation
15
17
 
@@ -22,7 +24,6 @@ And then execute:
22
24
  $ bundle
23
25
 
24
26
  Note: by just including this gem, does not mean your development server will be Puma, for that, you need explicitly add `gem 'puma'` to your Gemfile and configure it.
25
- This gem does not (yet) create puma and systemd service config files, you have to do it manually.
26
27
 
27
28
  ## Usage
28
29
 
@@ -45,6 +46,16 @@ You can tweak some settings:
45
46
  * `puma_systemctl` - systemctl command, default is ` sudo systemctl`. Other option would be `systemctl --user` if you have setup pumas as user service.
46
47
  * `puma_service_name` - puma service name , default is `puma_#{fetch(:application_name)}_#{fetch(:puma_env)}`
47
48
 
49
+ ## Setting up server
50
+
51
+ mina puma:install # copies templates for puma config and systemd service to config/deploy/templates
52
+ mina puma:print # prints generated config files to stdout
53
+ mina puma:print_service # prints generated systemd service to stdout
54
+ mina puma:print_config # prints generated puma.rb to stdout
55
+ mina puma:setup # install config files on service in enables systemd service
56
+
57
+ Later commmand relies on sudo to work. If you don't want to grant sudo, print config files to console and install em manually.
58
+
48
59
 
49
60
  Then:
50
61
 
@@ -80,10 +91,6 @@ deploy ALL=(ALL) NOPASSWD: SERVICES
80
91
 
81
92
  If you are paranoid, substitute `*` with exact service name. Better option would be to run as user service, but it did not work for me out of box on AWS AMI2.
82
93
 
83
- ## TODO
84
- * Generate and upload puma.rb file
85
- * Generate and upload puma systemd service
86
-
87
94
  ## Contributing
88
95
 
89
96
  1. Fork it
@@ -4,12 +4,25 @@ require 'mina/rails'
4
4
  namespace :puma do
5
5
  set :shared_dirs, fetch(:shared_dirs, []).push("tmp/sockets", "tmp/pids")
6
6
 
7
- set :puma_role, -> { fetch(:user) }
7
+ set :puma_user, -> { fetch(:user) }
8
+ set :puma_group, -> { fetch(:user) }
8
9
  set :puma_env, -> { fetch(:rails_env, 'production') }
9
10
  set :puma_root_path, -> { fetch(:current_path) }
10
11
 
12
+ set :puma_bundle_exec, -> { "/home/#{fetch(:puma_user)}/.rbenv/bin/rbenv exec bundle exec" }
13
+ set :systemd_root, -> { "/etc/systemd/system" }
14
+
11
15
  set :puma_systemctl, -> { fetch(:systemctl, "sudo systemctl")}
12
16
  set :puma_service_name, -> { "puma_#{fetch(:application_name)}_#{fetch(:puma_env)}" }
17
+ set :puma_service_config, -> { "#{fetch(:systemd_root)}/#{fetch(:puma_service_name)}.service" }
18
+ set :puma_config, -> { "#{fetch(:shared_path)}/puma.rb" }
19
+
20
+ set :puma_workers, 0
21
+ set :puma_threads, "1,5"
22
+
23
+ set :puma_restart_command, "bundle exec puma"
24
+ set :puma_preload_app, false
25
+ set :puma_init_active_record, true
13
26
 
14
27
  desc 'Enable puma'
15
28
  task enable: :remote_environment do
@@ -60,4 +73,99 @@ namespace :puma do
60
73
  command "#{fetch(:puma_systemctl)} status -l #{fetch(:puma_service_name)}"
61
74
  end
62
75
 
76
+
77
+ desc 'Install Puma config template to repo'
78
+ task :install do
79
+ run :local do
80
+ if File.exist? path_for_service_template
81
+ error! %(file exists; please rm to continue: #{path_for_service_template})
82
+ else
83
+ command %(mkdir -p config/deploy/templates)
84
+ command %(cp #{path_for_service_template(installed: false)} #{path_for_service_template})
85
+ end
86
+ if File.exist? path_for_config_template
87
+ error! %(file exists; please rm to continue: #{path_for_config_template})
88
+ else
89
+ command %(mkdir -p config/deploy/templates)
90
+ command %(cp #{path_for_config_template(installed: false)} #{path_for_config_template})
91
+ end
92
+ end
93
+ end
94
+
95
+ desc 'Print nginx config in local terminal'
96
+ task :print do
97
+ puts "---- puma.service ----------"
98
+ puts processed_puma_service_template
99
+ puts "---- puma.rb ---------------"
100
+ puts processed_puma_config_template
101
+ end
102
+
103
+ desc 'Print puma service config in local terminal'
104
+ task :print_service do
105
+ puts processed_puma_service_template
106
+ end
107
+
108
+ desc 'Print puma config in local terminal'
109
+ task :print_config do
110
+ puts processed_puma_config_template
111
+ end
112
+
113
+ desc 'Setup puma service on server'
114
+ task :setup do
115
+ puma_service_config = fetch(:puma_service_config)
116
+ puma_config = fetch(:puma_config)
117
+
118
+ comment %(Installing puma service config file to #{puma_service_config})
119
+ command %(echo -ne '#{escaped_puma_service_template}' | sudo tee #{puma_service_config} > /dev/null)
120
+
121
+ comment %(Installing puma.rb config file to #{puma_config})
122
+ command %(echo -ne '#{escaped_puma_config_template}' > #{puma_config})
123
+
124
+ invoke :'puma:enable'
125
+ end
126
+
127
+ def path_for_service_template installed: true
128
+ installed ?
129
+ File.expand_path('./config/deploy/templates/puma.service.template') :
130
+ File.expand_path('../../templates/puma.service.template', __FILE__)
131
+ end
132
+
133
+ def path_for_config_template installed: true
134
+ installed ?
135
+ File.expand_path('./config/deploy/templates/puma.rb.template') :
136
+ File.expand_path('../../templates/puma.rb.template', __FILE__)
137
+ end
138
+
139
+ def puma_service_template
140
+ installed_path = path_for_service_template
141
+ template_path = path_for_service_template installed: false
142
+
143
+ File.exist?(installed_path) ? installed_path : template_path
144
+ end
145
+
146
+ def processed_puma_service_template
147
+ erb = File.read(puma_service_template)
148
+ ERB.new(erb, trim_mode: '-').result(binding)
149
+ end
150
+
151
+ def escaped_puma_service_template
152
+ processed_puma_service_template.gsub("\n","\\n").gsub("'","\\'")
153
+ end
154
+
155
+ def puma_config_template
156
+ installed_path = path_for_config_template
157
+ template_path = path_for_config_template installed: false
158
+
159
+ File.exist?(installed_path) ? installed_path : template_path
160
+ end
161
+
162
+ def processed_puma_config_template
163
+ erb = File.read(puma_config_template)
164
+ ERB.new(erb, trim_mode: '-').result(binding)
165
+ end
166
+
167
+ def escaped_puma_config_template
168
+ processed_puma_config_template.gsub("\n","\\n").gsub("'","\\'")
169
+ end
170
+
63
171
  end
@@ -1,5 +1,5 @@
1
1
  module Mina
2
2
  module PumaSystemd
3
- VERSION = "1.0.1"
3
+ VERSION = "1.0.2"
4
4
  end
5
5
  end
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env puma
2
+
3
+ environment "<%= fetch(:puma_env) %>"
4
+
5
+ app_dir = "<%= fetch(:current_path) %>"
6
+
7
+ directory app_dir
8
+ rackup "#{app_dir}/config.ru"
9
+ pidfile "#{app_dir}/tmp/pids/puma.pid"
10
+ state_path "#{app_dir}/tmp/pids/puma.state"
11
+ stdout_redirect "#{app_dir}/log/puma_access.log", "#{app_dir}/log/puma_error.log", true
12
+ bind "unix://#{app_dir}/tmp/sockets/puma.sock"
13
+ <% if fetch(:puma_tag) %>
14
+ tag "<%= fetch(:puma_tag)%>"
15
+ <% end %>
16
+
17
+ threads <%= fetch(:puma_threads) %>
18
+ workers <%= fetch(:puma_workers) %>
19
+
20
+ restart_command "<%= fetch(:puma_restart_command) %>"
21
+
22
+ <% if fetch(:puma_preload_app) %>
23
+ preload_app!
24
+ <% else %>
25
+ prune_bundler
26
+ <% end %>
27
+
28
+ on_restart do
29
+ puts "Refreshing Gemfile"
30
+ ENV["BUNDLE_GEMFILE"] = "<%= fetch(:bundle_gemfile, "#{fetch(:current_path)}/Gemfile") %>"
31
+ end
32
+
33
+ <% if fetch(:puma_preload_app) && fetch(:puma_init_active_record) %>
34
+ before_fork do
35
+ ActiveRecord::Base.connection_pool.disconnect!
36
+ end
37
+
38
+ on_worker_boot do
39
+ ActiveSupport.on_load(:active_record) do
40
+ ActiveRecord::Base.establish_connection
41
+ end
42
+ end
43
+ <% end %>
@@ -0,0 +1,34 @@
1
+ [Unit]
2
+ Description=Puma HTTP Server for <%= "#{fetch(:application)} (#{fetch(:stage)})" %>
3
+ After=network.target
4
+ <%= "Requires=#{fetch(:puma_service_name)}.socket" if fetch(:puma_enable_socket_service) %>
5
+
6
+ [Service]
7
+ Type=notify
8
+ WatchdogSec=10
9
+
10
+ User=<%= fetch(:puma_user) %>
11
+ Group=<%= fetch(:puma_group) %>
12
+ WorkingDirectory=<%= fetch(:current_path) %>
13
+
14
+ ExecStart=<%= fetch(:puma_bundle_exec) %> puma -C <%= fetch(:shared_path) %>/puma.rb config.ru
15
+ ExecStop=<%= fetch(:puma_bundle_exec) %> pumactl -S <%= fetch(:shared_path) %>/pids/puma.state stop
16
+ ExecReload=<%= fetch(:puma_bundle_exec) %> pumactl -F <%= fetch(:shared_path) %>/puma.rb phased-restart
17
+
18
+ PIDFile=<%= fetch(:shared_path) %>/tmp/pids/puma.pid
19
+
20
+ <%="EnvironmentFile=#{fetch(:puma_service_unit_env_file)}" if fetch(:puma_service_unit_env_file) %>
21
+
22
+ <% fetch(:puma_service_unit_env_vars, []).each do |environment_variable| %>
23
+ <%="Environment=#{environment_variable}" %>
24
+ <% end -%>
25
+ Environment=ALLOC_ARENA_MAX=2
26
+
27
+
28
+ Restart=always
29
+ RestartSec=1
30
+
31
+ SyslogIdentifier=puma_<%= "#{fetch(:application)}_#{fetch(:stage)}" %>
32
+
33
+ [Install]
34
+ WantedBy=multi-user.target
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mina-puma-systemd
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vladimir Elchinov
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-09-25 00:00:00.000000000 Z
11
+ date: 2023-12-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mina
@@ -81,12 +81,14 @@ files:
81
81
  - lib/mina/puma_systemd.rb
82
82
  - lib/mina/puma_systemd/tasks.rake
83
83
  - lib/mina/puma_systemd/version.rb
84
+ - lib/mina/templates/puma.rb.template
85
+ - lib/mina/templates/puma.service.template
84
86
  - mina-puma-systemd.gemspec
85
87
  homepage: https://github.com/railsblueprint/mina-puma-systemd
86
88
  licenses:
87
89
  - MIT
88
90
  metadata: {}
89
- post_install_message:
91
+ post_install_message:
90
92
  rdoc_options: []
91
93
  require_paths:
92
94
  - lib
@@ -102,7 +104,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
102
104
  version: '0'
103
105
  requirements: []
104
106
  rubygems_version: 3.0.3
105
- signing_key:
107
+ signing_key:
106
108
  specification_version: 4
107
109
  summary: Puma tasks for Mina and systemd
108
110
  test_files: []