Перезапустите мое приложение heroku автоматически - PullRequest
63 голосов
/ 24 января 2012

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

heroku restart

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

Ответы [ 7 ]

33 голосов
/ 21 августа 2013

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

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

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:

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

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

Мой оригинальный пост с закаленным CSS (см. Обновление 2 ниже):

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

ОБНОВЛЕНИЕ

Я изменил название задачи с «взорвать» на «перезапуск», чтобы было более понятно, что происходит.Implode - забавное имя, но в целом бесполезное.

UPDATE2

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

14 голосов
/ 24 января 2012

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

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

7 голосов
/ 23 ноября 2016

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

Мы добавили 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 (если вы перезапускаете работу, чтобы обойти утечку памяти).

6 голосов
/ 09 мая 2013

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

Только не делайте это чаще, чем раз в десять минут, иначе Heroku установит для вас 10-минутный тайм-аут.

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

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

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

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

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

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

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

4 голосов
/ 26 ноября 2015

Вдохновленный 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
2 голосов
/ 19 августа 2017

Я решил это с помощью очень простого командного сценария curl в репо, который запускается с помощью бесплатного планировщика 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.

0 голосов
/ 15 ноября 2016

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...