Автоматического перезапуска моего приложения в Heroku


эта команда терминала перезапускает мое приложение heroku:

heroku restart

есть ли способ запустить скрипт, который будет запускать эту команду и перезагрузить приложение каждый час?

7 62

7 ответов:

Я на самом деле просто должен был решить эту проблему для моих приложений и написал сообщение об этом с более подробной информацией. В принципе, вам нужно в Heroku-АФИ самоцвет с тех пор, как в Heroku камень будет заменен командной строкой. Затем вам нужна задача rake, несколько переменных конфигурации и плагин Heroku scheduler (бесплатно, за исключением минимального времени dyno).

задача рейка выглядит так:

namespace :heroku do
  desc 'restarts all the heroku dynos so we can control when they restart'
  task :restart do
    Heroku::API.
      new(username: ENV['HEROKU_USERNAME'], password: ENV['HEROKU_PASSWORD']).
      post_ps_restart(ENV['HEROKU_APP_NAME'])
  end
end

вы также можете настроить его на использование вашего маркера API вместо того, чтобы вводить свое имя пользователя и пароль в конфиг. Это имеет значение только в том случае, если вы не хотите, чтобы ваши соавторы/коллеги знали ваш пароль или пароль к вашей основной учетной записи на Heroku.

heroku config:set HEROKU_USERNAME=[username] HEROKU_PASSWORD=[password] HEROKU_APP_NAME=[app_name] -a [app_name]

теперь, идти вперед и развернуть и протестировать:

git push [heroku_remote_name] [feature_branch]:master
heroku run rake heroku:restart -a [app_name]

наконец, нам нужно настроить задачу, чтобы запустить это по расписанию. Я решил пойти с бесплатным Heroku cron add-on:

heroku addons:add scheduler:standard -a [app_name]
heroku addons:open scheduler -a [app_name]

это откроет интерфейс планировщика в вашем браузере, и вы можете создать запланированного работника для запуска задачи rake всякий раз, когда тебе бы понравилось. Нам нужно только один раз в день и мы решили запустить его до нашего первого задания в день.

мой оригинальный пост с холодильником CSS (см. update2 ниже):

https://web.archive.org/web/20150612091315/http://engineering.korrelate.com/2013/08/21/restart-heroku-dynos-on-your-terms/

обновление

Я изменил имя задачи с "implode" на "restart", чтобы быть более понятным, что такое событие. Implode-забавное имя, но в остальном почти бесполезное.

обновление 2

видимо, моя компания удалила сообщение в блоге. Я добавляю больше кода здесь, и я обновил ссылку, но CSS выглядит как собака бросила его. Мое извинение.

вы можете создать задание Heroku cron, которое использует api Heroku в вашем приложении для перезапуска...

один вопрос - почему?

мы решили это с помощью buildpack, чтобы получить heroku команда доступна для самого dyno, а затем с помощью Планировщика Heroku.

мы добавили https://github.com/gregburek/heroku-buildpack-toolbelt buildpack в соответствии с его инструкциями:

heroku buildpacks:add https://github.com/gregburek/heroku-buildpack-toolbelt.git
heroku config:add HEROKU_TOOLBELT_API_EMAIL=`heroku whoami`
heroku config:add HEROKU_TOOLBELT_API_PASSWORD=`heroku auth:token`

затем убедитесь, что приложение slug был перестроен в соответствии с инструкциями:

git push heroku master

в Heroku Scheduler мы добавили это как почасовую работу:

vendor/heroku-toolbelt/bin/heroku ps:restart -a $HEROKU_APP_NAME

вы можете определить, работает ли он поиск выходных данных планировщика в журналах Heroku и, конечно же, по графику памяти приложения на панели управления Heroku (если вы перезапускаете, чтобы обойти утечку памяти).

скрипт не нужен, просто "сбой" вашего приложения и Heroku перезапустит его.

просто не делайте этого чаще, чем раз в десять минут или в Heroku будет тебе 10 минут ожидания.

в узел.js вы делаете это с process.exit(0).

от Криса в Heroku поддержки:

разбившийся Дино будет немедленно перезапущен. Если Дино переходит от разбитое состояние в состояние "вверх" (что означает, что Дино привязан к $PORT), то он подлежит нормальному запуску dyno. Если он падает снова во время загрузки или" запуска " последовательности, то это не будет перезапуск снова до окончания периода ожидания. Период ожидания составляет в настоящее время 10 минут, но это может измениться. Это предотвращает Динамо, которые постоянно рушатся от посторонней нагрузки платформа.

однако, как бы хорошо это ни звучало, на практике это не работает. Вы нажмете тайм-аут время выхода, потому что менеджер dyno ожидает, что ваше приложение будет работать:

для управления рабочими процессами вы выходите из процесса чисто но платформа ожидает, что Дино будет поднят. Это звучит, как вы по существу, сбой Дино в результате.

Итак, если вам нужно периодически перезапускать - и этот период может быть установлен в > 10 минут - это простой и простой способ управления очисткой памяти. Если вам нужно перезагрузить динамически (например, при обнаружении простоя) или часто вам нужно будет изучить другие варианты.

вы можете получить доступ к имени dyno (ex. "работник.3", " web.1") через переменную среды" PS " и выполните команду перезапуска Heroku API программно.

вдохновленный https://www.stormconsultancy.co.uk/blog/development/ruby-on-rails/automatically-restart-struggling-heroku-dynos-using-logentries/

# Setup
heroku plugins:install https://github.com/heroku/heroku-oauth
heroku authorizations:create -s write
heroku config:add RESTART_API_KEY=<API KEY>
heroku config:add APP_NAME=<App Name>

heroku addons:add scheduler:standard -a <App Name>
heroku addons:open scheduler -a <App Name>
add `rake restart`

# Gemfile
gem 'platform-api', require: false

# Rakefile
task :restart do
  require 'platform-api'
  app_name = ENV.fetch('APP_NAME')
  key = ENV.fetch('RESTART_API_KEY')
  connection = PlatformAPI.connect_oauth(key)
  connection.dyno.list(app_name).map do |info|
    if info['type'] == 'web' && info['state'] == 'up'
      puts "Restarting #{info.inspect}"
      connection.dyno.restart(app_name, info['name'])
    else
      puts "Skipping #{info.inspect}"
    end
  end
end

Я решил это с помощью очень простого командного скрипта curl в РЕПО, который запускается с помощью free Heroku scheduler.

#!/bin/sh curl -X DELETE "https://api.heroku.com/apps/${HEROKU_APP_NAME}/dynos" \ --user "${HEROKU_CLI_USER}:${HEROKU_CLI_TOKEN}" \ -H "Content-Type: application/json" \ -H "Accept: application/vnd.heroku+json; version=3"

см.https://gist.github.com/mattheworiordan/f052b7693aacd025f025537418fa5708.

насколько я могу судить, просто работает heroku ps:restart --app APPNAME в Heroku планировщик надстройка работает нормально. Мне непонятно, зачем нужны дополнительные шаги в других ответах.