Перезапустите приложение heroku автоматически

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

heroku restart

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

Ответ 1

Мне просто нужно было решить эту проблему для своих приложений и написать сообщение на нем с более подробной информацией. В принципе, вам нужен герой героя-апи сейчас, так как герой герою заменяется CLI. Тогда вам понадобится задача рейка, пара конфигурационных переменных и плагин планировщика героя (бесплатно, за исключением минимального времени диноза).

Задача грабли выглядит следующим образом:

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]

Наконец, нужно настроить задачу для запуска по расписанию. Ive решил пойти со свободным дополнением Heroku cron:

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

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

Мое первоначальное сообщение с фризовым CSS (см. обновление 2 ниже):

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

UPDATE

Я изменил имя задачи с "implode" на "restart", чтобы быть более понятным в отношении того, что происходит. Implode - забавное имя, но в значительной степени бесполезно в противном случае.

UPDATE2

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

Ответ 2

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

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

Ответ 3

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

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

В node.js вы делаете это с помощью process.exit(0).

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

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

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

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

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

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

Ответ 4

Мы решили это, используя 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`

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

git push heroku master

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

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

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

Ответ 5

Вдохновленный 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

Ответ 6

Я решил это с помощью очень простой команды curl script в репо, которая запускается с помощью бесплатного планировщика Heroku.

#!/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.

Ответ 7

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