@vadimstroganov

Почему не перезапускается Puma (Rails)?

Привет! Не могу понять в чем проблема.

Мой конфиг capistrano:
deploy.rb
# config valid only for current version of Capistrano
lock '3.8.1'

require 'capistrano-db-tasks'

set :application, 'app'
set :repo_url, 'git@example.com/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

Первый деплой прошел успешно; все запустилось, все работает.
Второй и последующие деплои не срабатывают, пишет:
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

Если руками удалить .sock и .pid файлы, то деплой пройдет.
Еще, после успешного деплоя, команда bundle exec cap production puma:status выдает:
WARN Puma not running

Но приложение работает.
Кто нибудь сталкивался с такой проблемой? Что делать?
  • Вопрос задан
  • 628 просмотров
Пригласить эксперта
Ответы на вопрос 2
c3gdlk
@c3gdlk
Ментор в http://rubyboost.ru/
У Вас не убивается пума, поэтому и не стартует новый инстанс сервера

Решения Вашей проблемы 3
1 Очень простой, но может и не получиться. Поиграть с версиями капистрано и пумы., может какае-то связка и заработает
2 Ковырнуть исходники, посмотреть какие команды выполняются на restart и почему текущий сервер не убивается
3 Использовать какую-либо тулзу для мониторинга сервера. Она же будет его перезапускать и будет делать это правильно. Простой вариант - гем https://github.com/ddollar/foreman, получше (но сложнее) -тулза https://mmonit.com/monit/
Ответ написан
Комментировать
etspring
@etspring
Начитанное быдло
Добавлять require для пумы в Capfile не пробовали?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы