2012-01-24 3 views
61

Этот терминал перезапускает мой Heroku приложение:Перезапуск мой Heroku приложение автоматически

heroku restart 

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

+0

У меня есть потребность в том же. Моя причина в том, что я обновляю переводы I18n на cron и должен перезапустить приложение, чтобы очистить кеш I18n. –

+0

@Однако вы должны выбрать ответ, пожалуйста, чтобы люди не видели это в своих кормах «без ответа». Благодаря! – WattsInABox

ответ

31

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

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

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

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

Мой оригинальный пост с ебаный до CSS (см Update2 ниже):

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

UPDATE

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

UPDATE2

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

+1

Вот готовая к развертыванию грабли на основе вашего решения: https://github.com/demental/herokustarter. Причина, по которой я нуждался в этом, заключалась в том, что мне пришлось очистить некоторые мемуары вне приложения (I18n ActiveRecord Backend). Я не вижу другого пути. – demental

+1

Сайт не найден Ошибка при открытии ссылки. Можете ли вы обновить ссылку – coderVishal

+1

@coderVishal Спасибо, я обновил сообщение сейчас – WattsInABox

13

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

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

+8

У меня есть утечка памяти в моем приложении, и перезапуск приложения сбрасывает использование памяти. Таким образом, это может быть временное исправление, пока мы не исправим проблему с памятью. –

+3

рядом с дополнением cron вы можете сделать cron из локальной системы ur или любого другого сервера (который живет в Интернете) для запуска «перезагрузки героя» почасово. – Gull

+0

Основная причина, по которой я думаю, что это что-то вроде этого, - геройку перезапускает каждый дино через 24 часа после его воспитания. Это будет в значительной степени случайным временем, если вы ничего не сделаете. Если вместо этого вы перезагружаете приложение в свое время в течение некоторого времени с низким трафиком, вы можете свести к минимуму влияние на ваш бизнес. OP говорит «каждый час», но эти решения могут быть адаптированы для любого периода времени перезапуска. – WattsInABox

5

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

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

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

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

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

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

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

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

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

+3

Это необходимо для некоторых, в нашем случае, наше приложение занимает 80 секунд для загрузки на героку, а когда они выполняют свои автоматизированные ежедневные циклы dyno, это вызывает ошибки времени для пользователей. Если мы перезагружаем герою, он использует preboot, а dynos - до того, как они получат трафик. –

2

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

Было ли это когда-либо проверено и подтверждено для работы? –

+1

все еще использует его сегодня, поэтому да :) – grosser

+0

Я могу подтвердить, что он работает по назначению. <3 –

-1

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

+0

Я просто попробовал это, и не было перезапуска dyno. Журнал Heroku для планировщика предполагает, что команда не удалась. На динамиках нет «героику». Вы можете попробовать это, выполнив 'heroku run bash' в терминале, а затем попытавшись запустить команды heroku. Может быть, у вас есть специальный сборщик или есть какой-то специальный стек? Я на кедре-14. –

+0

Извините за поздний ответ. У меня есть несколько приложений на Heroku (все на кедре-14), некоторые из них находятся в Ruby, а некоторые - в Go. Я только что протестировал 'heroku ps: restart --app APPNAME' на моем Ruby dyno с Heroku Scheduler, и он сработал. Я также попробовал «heroku run bash» на этом dyno и смог выполнить команды «heroku» внутри него. Я не использую какие-либо специальные buildpacks, а только конфигурацию по умолчанию для Rails-приложений. Однако я попытался сделать то же самое в приложении Go, и команда 'heroku' была недоступна. Поэтому он должен быть включен в Ruby buildpack (и, возможно, другие), но не все из них. –

+0

Ага, это странно. Я попробовал его в приложении Rails (поэтому у него был Ruby buildpack - я думаю, что это более конкретно Ruby 2.2.5), и там мне пришлось специально добавить героин-buildpack-toolbelt. –

5

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

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

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

+0

С тех пор мы перешли на этот buildpack, который не устарел: https://github.com/heroku/heroku-buildpack-cli Его конфигурация немного отличается. –

+0

Обратите внимание, что https://github.com/heroku/heroku-buildpack-cli использует другой путь для своего бинарного файла 'heroku'. –

2

Я решил это с помощью очень простого скрипта команды 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.

Смежные вопросы