V
V
vadimstroganov2017-06-04 23:39:22
Nginx
vadimstroganov, 2017-06-04 23:39:22

Why won't Puma (Rails) restart?

Hey! I can't figure out what the problem is.
My capistrano config:

deploy.rb
# config valid only for current version of Capistrano
lock '3.8.1'

require 'capistrano-db-tasks'

set :application, 'app'
set :repo_url, '[email protected]/app.git'

set :whenever_identifier, -> { "#{fetch(:application)}_#{fetch(:stage)}" }
set :whenever_roles, -> { [:web, :app]}

set :pty,             true
set :use_sudo,        false
set :puma_threads,    [4, 16]
set :puma_workers,    1
set :puma_bind,       "unix://#{shared_path}/tmp/sockets/puma.sock"
set :puma_state,      "#{shared_path}/tmp/pids/puma.state"
set :puma_pid,        "#{shared_path}/tmp/pids/puma.pid"
set :puma_access_log, "#{release_path}/log/puma.error.log"
set :puma_error_log,  "#{release_path}/log/puma.access.log"
set :puma_preload_app, true
set :puma_worker_timeout, nil
set :puma_init_active_record, true

# Default value for :log_level is :debug
set :log_level, :debug

set :linked_files, %w(config/database.yml config/secrets.yml)

set :linked_dirs, %w(log tmp/pids tmp/sockets tmp/cache vendor/bundle public/system)
set :linked_dirs, fetch(:linked_dirs) + %w(public/uploads public/certs)

# Default value for keep_releases is 5
# set :keep_releases, 5

namespace :puma do
  desc 'Create Directories for Puma Pids and Socket'
  task :make_dirs do
    on roles(:app) do
      execute "mkdir #{shared_path}/tmp/sockets -p"
      execute "mkdir #{shared_path}/tmp/pids -p"
    end
  end

  before :start, :make_dirs
end

namespace :deploy do
  desc 'Make sure local git is in sync with remote.'
  task :check_revision do
    on roles(:app) do
      unless `git rev-parse HEAD` == `git rev-parse origin/master`
        puts 'WARNING: HEAD is not the same as origin/master'
        puts 'Run `git push` to sync changes.'
        exit
      end
    end
  end

  desc 'Initial Deploy'
  task :initial do
    on roles(:app) do
      before 'deploy:restart', 'puma:start'
      invoke 'deploy'
    end
  end

  after :publishing, :restart

  desc 'Restart application'
  task :restart do
    on roles(:app), in: :sequence, wait: 5 do
      invoke 'puma:restart'
    end
  end

  before :starting,  :check_revision
  after  :finishing, :compile_assets
  after  :finishing, :cleanup
  after  :finishing, :restart
end

The first deployment was successful; everything started, everything works.
The second and subsequent deployments do not work, writes:
bundler: failed to load command: puma (/home/rubyist/www/app/shared/bundle/ruby/2.3.0/bin/puma)
RuntimeError: There is already a server bound to: /home/rubyist/www/app/shared/tmp/sockets/puma.sock

If you manually delete the .sock and .pid files, then the deployment will pass.
Also, after a successful deployment, the bundle exec cap production puma:status command gives:
WARN Puma not running
But the application works.
Has anyone encountered such a problem? What to do?

Answer the question

In order to leave comments, you need to log in

2 answer(s)
Z
Zaporozhchenko Oleg, 2017-06-04
@c3gdlk

Your cougar is not killed, and therefore a new server instance does not start.
Solutions to your problem 3
1 Very simple, but it may not work. Play with versions of capistrano and puma., maybe some combination will work
2 Tweak the sources, see what commands are executed on restart and why the current server is not killed
3 Use some tool to monitor the server. She will restart it and will do it right. A simple option is the gem https://github.com/ddollar/foreman, a better (but more difficult) tool is https://mmonit.com/monit/

V
Vayladion Gognazdiak, 2017-06-08
@etspring

Have you tried adding require for puma to Capfile?

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question