Как управлять задачами cron с помощью Capistrano для NodeJS проектов
Я уже рассказывал о том как доставлять NodeJS проект на сервер с помощью Capistrano, теперь я расскажу как можно управлять задачами cron с помощью все того же Capistrano.
Для начала нам понадобится whenever — это замечательная библиотека для удобной работы с задачами крона. Библиотека написана на Ruby, но так как у вас уже стоит Capistrano это не должно быть проблемой. Устанавливаем:
gem install whenever
Чтобы создать структуру для работы с whenever, вызываем в кроне вашего проекта следующую команду:
wheneverize .
В проект будет добавлен один единственный файл config/schedule.rb
, именно в нем будут описаны все задачи для исполения кроном. Для примера хочу показать как с помошью whenever можно запускать CoffeeScript файлы.
job_type :coffee, "cd :path && /usr/local/bin/coffee :task :output"
every 2.hours do
coffee "import.coffee"
end
То есть, каждые 2 часа из папки проекта будет запущен файл import.coffee
. Больше примеров по работе с whenever можно посмотреть здесь.
Теперь нам осталось обновить config/deploy.rb
, который мы разобрали в прошлый раз, и добавить в него два новых этапа, это task :update_crontab
и task :clear_crontab
. Результат:
set :application, "simonenko.su"
set :node_file, "server.coffee"
set :host, "178.79.189.200"
set :repository, "git@github.com:meritt/simonenko.su.git"
set :user, "root"
set :admin_runner, "www"
set :scm, :git
set :branch, "master"
set :deploy_via, :remote_cache
set :deploy_to, "/usr/www/#{application}"
set :keep_releases, 4
role :app, host
namespace :deploy do
desc "Start application with forever"
task :start, :roles => :app, :except => { :no_release => true } do
run "forever start -c coffee #{current_path}/#{node_file}"
end
desc "Stop application"
task :stop, :roles => :app, :except => { :no_release => true } do
run "forever stop #{current_path}/#{node_file}"
end
desc "Restart application"
task :restart, :roles => :app, :except => { :no_release => true } do
stop
sleep 1
start
end
desc "Install npm modules"
task :npm_install do
run "cd #{release_path} && npm link"
end
desc "Update node_modules symlink"
task :npm_update_symlink do
run "rm -rf #{release_path}/node_modules"
run "ln -s #{shared_path}/node_modules #{release_path}/node_modules"
end
desc "Update access to application"
task :final_options, roles => :app do
run "chown -R #{admin_runner}:#{admin_runner} #{deploy_to}"
run "chmod 777 #{release_path}/cache"
end
desc "Clear cron jobs"
task :clear_crontab, :roles => :app do
run "cd #{current_path} && whenever --clear-crontab #{application}"
end
desc "Update cron jobs"
task :update_crontab, :roles => :app do
run "cd #{current_path} && whenever --update-crontab #{application}"
end
task :symlink_configs, :roles => :app do
%w[app_config.yml].each do |f|
run "ln -sf #{shared_path}/config/#{f} #{release_path}/config/#{f}"
end
end
desc "Create folders for nodejs application"
task :setup_for_nodejs, :roles => :app do
run "mkdir -p #{deploy_to}"
run "mkdir -p #{shared_path}/node_modules"
run "chown -R #{admin_runner}:#{admin_runner} #{deploy_to}"
end
end
before 'deploy:setup', 'deploy:setup_for_nodejs'
after "deploy:finalize_update", "deploy:cleanup", "deploy:symlink_configs", "deploy:update_crontab", "deploy:final_options"
after "deploy:update_code", "deploy:npm_update_symlink", "deploy:npm_install", "deploy:clear_crontab"
Думаю доставка ваших приложений с whenever будет еще проще, ведь теперь вы можете удаленно управлять кроном.