pixelforce_kit 0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +2 -0
  3. data/Gemfile +4 -0
  4. data/Gemfile.lock +299 -0
  5. data/LICENSE +21 -0
  6. data/README.md +73 -0
  7. data/Rakefile +6 -0
  8. data/app/controllers/admin/api/admin_base_controller.rb +116 -0
  9. data/app/controllers/admin/api/app_versions_controller.rb +26 -0
  10. data/app/controllers/admin/api/available_modules_controller.rb +20 -0
  11. data/app/controllers/api/base_controller.rb +82 -0
  12. data/app/controllers/api/v1/health_check_controller.rb +12 -0
  13. data/app/controllers/application_controller.rb +10 -0
  14. data/app/controllers/auth/passwords_controller.rb +7 -0
  15. data/app/controllers/concerns/.keep +0 -0
  16. data/app/controllers/concerns/exception_handler.rb +57 -0
  17. data/app/controllers/concerns/request_header_handler.rb +35 -0
  18. data/app/controllers/concerns/response_handler.rb +51 -0
  19. data/app/controllers/concerns/search_params_parser.rb +35 -0
  20. data/app/controllers/pages_controller.rb +36 -0
  21. data/app/controllers/users_controller.rb +3 -0
  22. data/app/models/ahoy/event.rb +8 -0
  23. data/app/models/ahoy/visit.rb +6 -0
  24. data/app/models/application_record.rb +11 -0
  25. data/app/models/concerns/account_deletable.rb +26 -0
  26. data/app/models/concerns/assets_uploadable.rb +20 -0
  27. data/app/models/concerns/codenamable.rb +13 -0
  28. data/app/models/concerns/image_sizable.rb +58 -0
  29. data/app/models/concerns/isolationable.rb +18 -0
  30. data/app/models/concerns/searchable.rb +94 -0
  31. data/app/models/concerns/taggable.rb +57 -0
  32. data/app/models/tag.rb +13 -0
  33. data/app/models/tag_attachable.rb +6 -0
  34. data/app/models/tag_category.rb +5 -0
  35. data/bin/console +14 -0
  36. data/bin/setup +8 -0
  37. data/db/migrate/20220617021719_create_ahoy_visits_and_events.rb +67 -0
  38. data/db/migrate/20240828040425_create_tags.rb +12 -0
  39. data/db/migrate/20240828040646_create_tag_attachables.rb +9 -0
  40. data/db/migrate/20240912054241_create_tag_categories.rb +11 -0
  41. data/db/schema.rb +24 -0
  42. data/lib/pixelforce_kit/engine.rb +17 -0
  43. data/lib/pixelforce_kit/initializer/ahoy.rb +50 -0
  44. data/lib/pixelforce_kit/railtie.rb +4 -0
  45. data/lib/pixelforce_kit/recipes/capistrano_recipes/base.rb +4 -0
  46. data/lib/pixelforce_kit/recipes/capistrano_recipes/elbas.rb +10 -0
  47. data/lib/pixelforce_kit/recipes/capistrano_recipes/logrotate.rb +10 -0
  48. data/lib/pixelforce_kit/recipes/capistrano_recipes/puma.rb +46 -0
  49. data/lib/pixelforce_kit/recipes/capistrano_recipes/resque.rb +43 -0
  50. data/lib/pixelforce_kit/recipes/capistrano_recipes/resque_scheduler.rb +43 -0
  51. data/lib/pixelforce_kit/recipes/capistrano_recipes/sidekiq.rb +88 -0
  52. data/lib/pixelforce_kit/recipes/capistrano_recipes/supervisor.rb +9 -0
  53. data/lib/pixelforce_kit/recipes/capistrano_recipes/unicorn.rb +58 -0
  54. data/lib/pixelforce_kit/recipes/templates/logrotate.erb +10 -0
  55. data/lib/pixelforce_kit/recipes/templates/nginx_config.erb +32 -0
  56. data/lib/pixelforce_kit/recipes/templates/nginx_puma_config.erb +43 -0
  57. data/lib/pixelforce_kit/recipes/templates/puma.rb.erb +34 -0
  58. data/lib/pixelforce_kit/recipes/templates/puma_systemd.erb +19 -0
  59. data/lib/pixelforce_kit/recipes/templates/resque_init.erb +49 -0
  60. data/lib/pixelforce_kit/recipes/templates/resque_scheduler_init.erb +49 -0
  61. data/lib/pixelforce_kit/recipes/templates/resque_scheduler_supervisor.erb +13 -0
  62. data/lib/pixelforce_kit/recipes/templates/resque_supervisor.erb +13 -0
  63. data/lib/pixelforce_kit/recipes/templates/sidekiq_init.erb +49 -0
  64. data/lib/pixelforce_kit/recipes/templates/sidekiq_supervisor.erb +12 -0
  65. data/lib/pixelforce_kit/recipes/templates/sidekiq_systemd.erb +17 -0
  66. data/lib/pixelforce_kit/recipes/templates/supervisor.erb +19 -0
  67. data/lib/pixelforce_kit/recipes/templates/unicorn_init.erb +55 -0
  68. data/lib/pixelforce_kit/recipes/templates/unicorn_supervisor.erb +13 -0
  69. data/lib/pixelforce_kit/recipes.rb +4 -0
  70. data/lib/pixelforce_kit/spec_helper.rb +120 -0
  71. data/lib/pixelforce_kit/version.rb +3 -0
  72. data/lib/pixelforce_kit.rb +8 -0
  73. data/pixelforce_kit.gemspec +33 -0
  74. metadata +269 -0
@@ -0,0 +1,9 @@
1
+ class CreateTagAttachables < ActiveRecord::Migration[7.1]
2
+ def change
3
+ create_table :tag_attachables do |t|
4
+ t.references :tag
5
+ t.references :taggable, polymorphic: true
6
+ t.timestamps
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,11 @@
1
+ class CreateTagCategories < ActiveRecord::Migration[7.1]
2
+ def change
3
+ create_table :tag_categories do |t|
4
+ t.string :name
5
+ t.string :code_name
6
+ t.timestamps
7
+ end
8
+
9
+ add_index :tag_categories, :code_name, unique: true
10
+ end
11
+ end
data/db/schema.rb ADDED
@@ -0,0 +1,24 @@
1
+ ActiveRecord::Schema.define do
2
+ create_table "users", force: :cascade do |t|
3
+ t.string :email
4
+ t.string :provider
5
+ t.string :country
6
+ t.string :first_name
7
+ t.string :last_name
8
+ t.date :dob
9
+ t.string :timezone
10
+ t.datetime :last_visit_at
11
+ t.boolean :global_notification
12
+ t.bigint :turned_off_notification_category_ids, array: true
13
+ t.timestamps
14
+ end
15
+
16
+ create_table "admin_users", force: :cascade do |t|
17
+ t.string :email
18
+ t.string :first_name
19
+ t.string :last_name
20
+ t.string :provider
21
+ t.boolean :global_notification
22
+ t.timestamps
23
+ end
24
+ end
@@ -0,0 +1,17 @@
1
+ module PixelforceKit
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace PixelforceKit
4
+
5
+ initializer :append_migrations do |app|
6
+ unless app.root.to_s.match root.to_s
7
+ config.paths["db/migrate"].expanded.each do |expanded_path|
8
+ ActiveRecord::Migrator.migrations_paths << expanded_path
9
+ end
10
+ end
11
+ end
12
+
13
+ initializer :initializer_ahoy do
14
+ require_relative 'initializer/ahoy'
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,50 @@
1
+ class Ahoy::Store < Ahoy::DatabaseStore
2
+ def track_visit(data)
3
+ if @cloudfront_headers.present?
4
+ data[:country] = @cloudfront_headers[:cloudfront_viewer_country_name]
5
+ data[:region] = @cloudfront_headers[:cloudfront_viewer_country_region_name]
6
+ data[:city] = @cloudfront_headers[:cloudfront_viewer_city]
7
+ end
8
+ super(data)
9
+ end
10
+
11
+ def track_event(data)
12
+ params = data[:properties][:params].deep_dup
13
+ sanitized_params = remove_password_params(params)
14
+ data[:properties][:method] = request.method
15
+ data[:properties][:params] = sanitized_params
16
+ data[:user_type] = controller.try('current_user')&.class&.name || controller.try('current_admin_user')&.class&.name
17
+ data[:user_id] = controller.current_admin_user.id if controller.try('current_admin_user').present?
18
+ data[:admin_action_on_user_id] = controller.admin_action_on_user_id if controller.try('admin_action_on_user_id').present?
19
+ data[:cloudfront_headers] = @cloudfront_headers if @cloudfront_headers.present?
20
+ super(data)
21
+ end
22
+
23
+ private
24
+
25
+ def remove_password_params(params)
26
+ case params
27
+ when Hash
28
+ params.each_with_object({}) do |(key, value), result|
29
+ if key.to_s == 'controller' || key.to_s == 'action'
30
+ result[key] = remove_password_params(value)
31
+ elsif !(key.to_s.downcase.include?('password') || value.to_s.downcase.include?('password'))
32
+ result[key] = remove_password_params(value)
33
+ end
34
+ end
35
+ when Array
36
+ params.map { |item| remove_password_params(item) }
37
+ else
38
+ params
39
+ end
40
+ end
41
+ end
42
+
43
+ # set to true for JavaScript tracking
44
+ Ahoy.api = true
45
+ Ahoy.track_bots = true
46
+
47
+ # set to true for geocoding (and add the geocoder gem to your Gemfile)
48
+ # we recommend configuring local geocoding as well
49
+ # see https://github.com/ankane/ahoy#geocoding
50
+ Ahoy.geocode = false
@@ -0,0 +1,4 @@
1
+ module PixelforceKit
2
+ class Railtie < ::Rails::Railtie
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ def template(from, to)
2
+ erb = File.read(File.expand_path("../../templates/#{from}", __FILE__))
3
+ upload! StringIO.new(ERB.new(erb).result(binding)), to
4
+ end
@@ -0,0 +1,10 @@
1
+ namespace :elbas do
2
+ desc 'Sync files before creating AMI'
3
+ task :sync do
4
+ on roles(:app) do
5
+ execute "sync"
6
+ end
7
+ end
8
+
9
+ before "elbas:deploy", "elbas:sync"
10
+ end
@@ -0,0 +1,10 @@
1
+ namespace :logrotate do
2
+ desc "Setup logrotate configuration for this application"
3
+ task :setup do
4
+ on roles(:app) do
5
+ template "logrotate.erb", "/tmp/logrotate"
6
+ sudo "mv /tmp/logrotate /etc/logrotate.d/#{fetch(:application)}"
7
+ sudo "chown root:root /etc/logrotate.d/#{fetch(:application)}"
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,46 @@
1
+ namespace :puma do
2
+ desc 'Setup puma configuration for this application'
3
+ task :config do
4
+ on roles(:web) do
5
+ template 'puma.rb.erb', '/tmp/puma_conf'
6
+ sudo "mv /tmp/puma_conf #{shared_path}/config/puma.rb"
7
+ execute "mkdir -p #{shared_path}/pids"
8
+ template "nginx_puma_config.erb", "/tmp/nginx_puma_config"
9
+ sudo "mv /tmp/nginx_puma_config /etc/nginx/sites-enabled/#{fetch(:application)}"
10
+ end
11
+ end
12
+
13
+ namespace :systemd do
14
+ task :setup do
15
+ on roles(:web) do
16
+ template 'puma_systemd.erb', '/tmp/puma.service'
17
+ sudo 'mv /tmp/puma.service /etc/systemd/system/puma.service'
18
+ sudo 'systemctl daemon-reload'
19
+ sudo 'systemctl enable puma.service'
20
+ sudo 'systemctl start puma.service'
21
+ end
22
+ end
23
+
24
+ task :restart do
25
+ on roles(:web) do
26
+ sudo 'systemctl restart puma'
27
+ end
28
+ end
29
+
30
+ task :reload do
31
+ on roles(:web) do
32
+ sudo 'systemctl reload puma'
33
+ end
34
+ end
35
+ end
36
+
37
+ namespace :supervisor do
38
+ task :uninstall do
39
+ on roles(:web) do
40
+ sudo "rm /etc/supervisor/conf.d/#{fetch(:application)}.conf"
41
+ sudo 'supervisorctl reread'
42
+ sudo 'supervisorctl update'
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,43 @@
1
+ namespace :resque do
2
+ desc "Install resque"
3
+
4
+ desc "Setup resque configuration for this application"
5
+ namespace :sysvinit do
6
+ task :setup do
7
+ on roles(:resque) do
8
+ template "resque_init.erb", "/tmp/resque"
9
+ sudo "mv /tmp/resque /etc/init.d/resque"
10
+ sudo "chmod +x /etc/init.d/resque"
11
+ sudo "update-rc.d resque defaults"
12
+ end
13
+ end
14
+
15
+ %w[start stop restart].each do |command|
16
+ desc "#{command} resque"
17
+ task command do
18
+ on roles(:resque) do
19
+ execute "/etc/init.d/resque #{command}"
20
+ end
21
+ end
22
+ end
23
+ end
24
+ namespace :supervisor do
25
+ task :setup do
26
+ on roles(:resque) do
27
+ template "resque_supervisor.erb", "/tmp/resque"
28
+ sudo "mv /tmp/resque /etc/supervisor/conf.d/resque.conf"
29
+ sudo "supervisorctl reread"
30
+ sudo "supervisorctl update" # it will auto start the application
31
+ end
32
+ end
33
+
34
+ %w[start stop restart].each do |command|
35
+ desc "#{command} resque"
36
+ task command do
37
+ on roles(:resque) do
38
+ execute "supervisorctl #{command} resque"
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,43 @@
1
+ namespace :resque_scheduler do
2
+ desc "Install resque scheduler"
3
+
4
+ desc "Setup resque scheduler configuration for this application"
5
+ namespace :sysvinit do
6
+ task :setup do
7
+ on roles(:resque) do
8
+ template "resque_scheduler_init.erb", "/tmp/resque_scheduler"
9
+ sudo "mv /tmp/resque_scheduler /etc/init.d/resque_scheduler"
10
+ sudo "chmod +x /etc/init.d/resque_scheduler"
11
+ sudo "update-rc.d resque_scheduler defaults"
12
+ end
13
+ end
14
+
15
+ %w[start stop restart].each do |command|
16
+ desc "#{command} resque_scheduler"
17
+ task command do
18
+ on roles(:resque) do
19
+ execute "/etc/init.d/resque_scheduler #{command}"
20
+ end
21
+ end
22
+ end
23
+ end
24
+ namespace :supervisor do
25
+ task :setup do
26
+ on roles(:resque) do
27
+ template "resque_scheduler_supervisor.erb", "/tmp/resque_scheduler"
28
+ sudo "mv /tmp/resque_scheduler /etc/supervisor/conf.d/resque_scheduler.conf"
29
+ sudo "supervisorctl reread"
30
+ sudo "supervisorctl update" # it will auto start the application
31
+ end
32
+ end
33
+
34
+ %w[start stop restart].each do |command|
35
+ desc "#{command} resque_scheduler"
36
+ task command do
37
+ on roles(:resque) do
38
+ execute "supervisorctl #{command} resque_scheduler"
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,88 @@
1
+ namespace :sidekiq do
2
+ desc 'Install sidekiq'
3
+
4
+ namespace :systemd do
5
+ task :setup do
6
+ on roles(:app) do
7
+ template 'sidekiq_systemd.erb', '/tmp/sidekiq.service'
8
+ sudo 'mv /tmp/sidekiq.service /etc/systemd/system/sidekiq.service'
9
+ sudo 'systemctl daemon-reload'
10
+ sudo 'systemctl enable sidekiq'
11
+ sudo 'systemctl start sidekiq'
12
+ end
13
+ end
14
+
15
+ task :unload do
16
+ on roles(:app) do
17
+ sudo 'systemctl kill -s TSTP sidekiq'
18
+ end
19
+ end
20
+
21
+ task :restart do
22
+ on roles(:app) do
23
+ sudo 'systemctl restart sidekiq'
24
+ end
25
+ end
26
+ end
27
+
28
+ namespace :supervisor do
29
+ task :uninstall do
30
+ on roles(:sidekiq) do
31
+ sudo 'rm /etc/supervisor/conf.d/sidekiq.conf'
32
+ sudo 'supervisorctl reread'
33
+ sudo 'supervisorctl update'
34
+ end
35
+ end
36
+
37
+ task :setup do
38
+ on roles(:sidekiq) do
39
+ template "sidekiq_supervisor.erb", "/tmp/sidekiq"
40
+ sudo "mv /tmp/sidekiq /etc/supervisor/conf.d/sidekiq.conf"
41
+ sudo "supervisorctl reread"
42
+ sudo "supervisorctl update" # it will auto start the application
43
+ end
44
+ end
45
+
46
+ %w[start stop restart].each do |command|
47
+ desc "#{command} sidekiq"
48
+ task command do
49
+ on roles(:sidekiq) do
50
+ execute "supervisorctl #{command} sidekiq"
51
+ end
52
+ end
53
+ end
54
+ task :unload do
55
+ desc "tell sidekiq stop receive new jobs, called at the beginning"
56
+ on roles(:sidekiq) do
57
+ execute "supervisorctl signal TSTP sidekiq"
58
+ end
59
+ end
60
+ task :rolling_restart do
61
+ desc "used for rolling restart, only available on enterprise version"
62
+ on roles(:sidekiq) do
63
+ execute "supervisorctl signal USR2 sidekiq"
64
+ end
65
+ end
66
+
67
+ %w[start_group stop_group restart_group].each do |command|
68
+ desc "#{command} sidekiq"
69
+ task command do
70
+ on roles(:sidekiq) do
71
+ execute "supervisorctl #{command.split('_')[0]} sidekiq:*"
72
+ end
73
+ end
74
+ end
75
+ task :unload_group do
76
+ desc "tell sidekiq stop receive new jobs, called at the beginning"
77
+ on roles(:sidekiq) do
78
+ execute "supervisorctl signal TSTP sidekiq:*"
79
+ end
80
+ end
81
+ task :rolling_restart_group do
82
+ desc "used for rolling restart, only available on enterprise version"
83
+ on roles(:sidekiq) do
84
+ execute "supervisorctl signal USR2 sidekiq:*"
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,9 @@
1
+ namespace :supervisor do
2
+ desc "Setup supervisor configuration for this application"
3
+ task :setup do
4
+ on roles(:app) do
5
+ template "supervisor.erb", "/tmp/supervisor"
6
+ sudo "mv /tmp/supervisor /etc/supervisor/supervisord.conf"
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,58 @@
1
+ namespace :unicorn do
2
+ desc "Install unicorn"
3
+ namespace :sysvinit do
4
+ task :setup do
5
+ on roles(:web) do
6
+ template "unicorn_init.erb", "/tmp/unicorn"
7
+ sudo "mv /tmp/unicorn /etc/init.d/#{fetch(:application)}"
8
+ sudo "chmod +x /etc/init.d/#{fetch(:application)}"
9
+ sudo "update-rc.d #{fetch(:application)} defaults"
10
+ template "nginx_config.erb", "/tmp/nginx_config"
11
+ sudo "mv /tmp/nginx_config /etc/nginx/sites-enabled/#{fetch(:application)}"
12
+ end
13
+ end
14
+
15
+ %w[start stop restart reload].each do |command|
16
+ desc "#{command} unicorn"
17
+ task command do
18
+ on roles(:web) do
19
+ execute "/etc/init.d/#{fetch(:application)} #{command}"
20
+ end
21
+ end
22
+ end
23
+ end
24
+ namespace :supervisor do
25
+ desc "Setup unicorn configuration for this application"
26
+ task :setup do
27
+ on roles(:web) do
28
+ template "unicorn_supervisor.erb", "/tmp/unicorn"
29
+ sudo "mv /tmp/unicorn /etc/supervisor/conf.d/#{fetch(:application)}.conf"
30
+ sudo "supervisorctl reread"
31
+ sudo "supervisorctl update" # it will auto start the application
32
+ template "nginx_config.erb", "/tmp/nginx_config"
33
+ sudo "mv /tmp/nginx_config /etc/nginx/sites-enabled/#{fetch(:application)}"
34
+ end
35
+ end
36
+
37
+ task :start do
38
+ on roles(:web) do
39
+ execute "supervisorctl start #{fetch(:application)}"
40
+ end
41
+ end
42
+ task :stop do
43
+ on roles(:web) do
44
+ execute "supervisorctl signal QUIT #{fetch(:application)}"
45
+ end
46
+ end
47
+ task :restart do
48
+ on roles(:web) do
49
+ execute "supervisorctl signal USR2 #{fetch(:application)}"
50
+ end
51
+ end
52
+ task :reload do
53
+ on roles(:web) do
54
+ execute "supervisorctl signal HUP #{fetch(:application)}"
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,10 @@
1
+ <%= fetch(:deploy_to) %>/shared/log/*.log {
2
+ su <%= fetch(:user) %> <%= fetch(:user) %>
3
+ maxsize 1G
4
+ daily
5
+ missingok
6
+ copytruncate
7
+ rotate 7
8
+ compress
9
+ notifempty
10
+ }
@@ -0,0 +1,32 @@
1
+ upstream <%= fetch(:application) %> {
2
+ server unix:/tmp/<%= fetch(:application) %>.sock fail_timeout=0;
3
+ }
4
+
5
+ server {
6
+ listen 80;
7
+ server_name <%= fetch(:server_address) %>;
8
+ root <%= fetch(:deploy_to) %>/current/public;
9
+
10
+ try_files $uri/index.html $uri @<%= fetch(:application) %>;
11
+
12
+ location ~* ^(/assets|/favicon.ico) {
13
+ access_log off;
14
+ expires max;
15
+ }
16
+
17
+ location @<%= fetch(:application) %> {
18
+ proxy_set_header X-Forwarded-Proto $scheme;
19
+ proxy_set_header X-Forwarded-Ssl on;
20
+ proxy_set_header X-Forwarded-Port 443;
21
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
22
+ proxy_set_header Host $http_host;
23
+ proxy_redirect off;
24
+ proxy_buffering on;
25
+ proxy_set_header X-Real-IP $remote_addr;
26
+ proxy_pass http://<%= fetch(:application) %>;
27
+ }
28
+
29
+ error_page 500 502 503 504 /500.html;
30
+ client_max_body_size 1G;
31
+ keepalive_timeout 10;
32
+ }
@@ -0,0 +1,43 @@
1
+ upstream <%= fetch(:application) %> {
2
+ server unix:/tmp/<%= fetch(:application) %>.sock fail_timeout=0;
3
+ }
4
+
5
+ server {
6
+ listen 80 default_server deferred;
7
+ server_name <%= fetch(:server_address) %>;
8
+
9
+ root <%= fetch(:deploy_to) %>/current/public;
10
+
11
+ location ^~ /packs/ {
12
+ gzip_static on;
13
+ expires max;
14
+ add_header Cache-Control public;
15
+ }
16
+
17
+ try_files $uri $uri @<%= fetch(:application) %>;
18
+ location @<%= fetch(:application) %> {
19
+ proxy_set_header X-Forwarded-Proto https;
20
+ proxy_set_header X-Url-Scheme https;
21
+ proxy_set_header X-Forwarded-Ssl on;
22
+ proxy_set_header Front-End-Https on;
23
+
24
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
25
+ proxy_set_header Host $http_host;
26
+ proxy_redirect off;
27
+ proxy_buffering on;
28
+ proxy_set_header X-Real-IP $remote_addr;
29
+
30
+ proxy_pass http://<%= fetch(:application) %>;
31
+ }
32
+
33
+ location /cable {
34
+ proxy_pass http://<%= fetch(:application) %>;
35
+ proxy_http_version 1.1;
36
+ proxy_set_header Upgrade $http_upgrade;
37
+ proxy_set_header Connection "upgrade";
38
+ }
39
+
40
+ error_page 500 502 503 504 /500.html;
41
+ client_max_body_size 10M;
42
+ keepalive_timeout 10;
43
+ }
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env puma
2
+
3
+ directory '<%= current_path %>'
4
+ rackup '<%= current_path %>/config.ru'
5
+ environment '<%= fetch(:rails_env, 'production') %>'
6
+ tag '<%= fetch(:application)%>'
7
+ pidfile '<%= shared_path %>/pids/puma.pid'
8
+ state_path '<%= shared_path %>/pids/puma.state'
9
+ stdout_redirect '<%= shared_path %>/log/<%= fetch(:application)%>.log', '<%= shared_path %>/log/<%= fetch(:application)%>.log', true
10
+
11
+ threads <%= fetch(:puma_threads, [0, 1]).join(',')%>
12
+
13
+ bind 'unix:///tmp/<%= fetch(:application)%>.sock'
14
+
15
+ activate_control_app 'unix://<%= shared_path %>/tmp/sockets/pumactl.sock'
16
+
17
+ workers <%= fetch(:puma_workers, 2) %>
18
+
19
+ preload_app!
20
+
21
+ on_restart do
22
+ puts 'Refreshing Gemfile'
23
+ ENV['BUNDLE_GEMFILE'] = '<%= current_path %>/Gemfile'
24
+ end
25
+
26
+ before_fork do
27
+ ActiveRecord::Base.connection_pool.disconnect!
28
+ end
29
+
30
+ on_worker_boot do
31
+ ActiveSupport.on_load(:active_record) do
32
+ ActiveRecord::Base.establish_connection
33
+ end
34
+ end
@@ -0,0 +1,19 @@
1
+ [Unit]
2
+ Description=Puma HTTP Server
3
+ After=network.target
4
+
5
+ [Service]
6
+ Type=simple
7
+ User=<%= fetch(:user) %>
8
+ WorkingDirectory=<%= fetch(:deploy_to) %>/current
9
+
10
+ # Helpful for debugging socket activation, etc.
11
+ # Environment=PUMA_DEBUG=1
12
+
13
+ ExecStart=/bin/bash -l -c 'bundle exec puma -C <%= fetch(:deploy_to) %>/shared/config/puma.rb -e <%= fetch(:rails_env) %>'
14
+ ExecStop=/bin/bash -l -c 'bundle exec pumactl -F <%= fetch(:deploy_to) %>/shared/config/puma.rb stop'
15
+ ExecReload=/bin/bash -l -c 'bundle exec pumactl -F <%= fetch(:deploy_to) %>/shared/config/puma.rb phased-restart'
16
+ Restart=always
17
+
18
+ [Install]
19
+ WantedBy=multi-user.target
@@ -0,0 +1,49 @@
1
+ #!/bin/bash
2
+
3
+ ### BEGIN INIT INFO
4
+ # Provides: resque
5
+ # Required-Start: $local_fs $remote_fs $network $syslog
6
+ # Required-Stop: $local_fs $remote_fs $network $syslog
7
+ # Default-Start: 2 3 4 5
8
+ # Default-Stop: 0 1 6
9
+ # Short-Description: resque worker via init.d
10
+ # Description: starts resque
11
+ ### END INIT INFO
12
+
13
+ USER="<%= fetch(:user) %>"
14
+ PROJECT_PATH="<%= fetch(:deploy_to) %>"
15
+ NAME=resque
16
+ DESC="Resque app for $USER"
17
+ PID="$PROJECT_PATH/shared/pids/resque.pid"
18
+ LOGFILE="$PROJECT_PATH/shared/log/resque.log"
19
+ CD_TO_APP_DIR="cd $PROJECT_PATH/current"
20
+
21
+
22
+ case "$1" in
23
+ start)
24
+ START_DAEMON_PROCESS="bundle exec rake RAILS_ENV=<%= fetch(:rails_env) %> QUEUE='*' PIDFILE=$PID BACKGROUND=yes environment resque:work 2>&1 > $LOGFILE"
25
+ echo -n "Starting $DESC: "
26
+ if [ `whoami` = 'root' ]; then
27
+ su - $USER -c "$CD_TO_APP_DIR > /dev/null 2>&1 && $START_DAEMON_PROCESS"
28
+ else
29
+ /bin/bash -l -c "$CD_TO_APP_DIR > /dev/null 2>&1 && $START_DAEMON_PROCESS"
30
+ fi
31
+ echo "$NAME."
32
+ ;;
33
+ stop)
34
+ STOP_DAEMON_PROCESS="test -f $PID && kill -s QUIT `cat $PID` && rm -f $PID"
35
+ echo -n "Stopping $DESC: "
36
+ if [ `whoami` = 'root' ]; then
37
+ su - $USER -c "$CD_TO_APP_DIR && $STOP_DAEMON_PROCESS"
38
+ else
39
+ /bin/bash -l -c "$CD_TO_APP_DIR && $STOP_DAEMON_PROCESS"
40
+ fi
41
+ echo "$NAME."
42
+ ;;
43
+ *)
44
+ echo "Usage: $NAME {start|stop|restart|reload}" >&2
45
+ exit 1
46
+ ;;
47
+ esac
48
+
49
+ exit 0