web-dev-qa-db-ja.com

Herokuアプリケーションを自動的に再起動する

次の端末コマンドは、herokuアプリケーションを再起動します。

heroku restart

このコマンドを実行し、アプリケーションを1時間ごとに再起動するスクリプトを実行する方法はありますか?

63
Oded Harth

私は実際に自分のアプリでこの問題を解決しなければならなかったので、詳細を書いた投稿を書きました。基本的に、heroku gemはCLIに置き換えられているため、heroku-api gemが必要になりました。次に、rakeタスク、いくつかの構成変数、およびherokuスケジューラプラグイン(最小限のdyno時間を除いて無料)が必要です。

Rakeタスクは次のようになります。

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]

これにより、ブラウザでスケジューラUIが開き、いつでも好きなときにrakeタスクを実行するスケジュールされたワーカーを作成できます。必要なのは1日に1回だけで、その日の最初のスケジュールされたジョブの前に実行することを選択しています。

冷ややかなCSSを使用した元の投稿(下記のupdate2を参照):

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

[〜#〜] update [〜#〜]

何が起きているかをより明確にするために、タスクの名前を「破裂」から「再起動」に変更しました。 Implodeは楽しい名前ですが、それ以外ではほとんど役に立ちません。

UPDATE2

どうやら私の会社はブログの投稿を削除しました。ここにコードを追加し、リンクを更新しましたが、CSSは犬が投げたように見えます。謝罪いたします。

33
WattsInABox

アプリケーションでHeroku APIを使用して自身を再起動するheroku cronジョブを作成できます...

しかし、1つの質問-なぜですか?

14
John Beynon

これを解決するには、ビルドパックを使用して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スケジューラでは、これを1時間ごとのジョブとして追加しました。

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

Herokuログでスケジューラ出力を検索することで動作するかどうかを判断できます。もちろん、Herokuダッシュボードのアプリのメモリグラフで確認できます(メモリリークを回避するために再起動する場合)。

7
Henrik N

スクリプトは必要ありません。アプリケーションを「クラッシュ」させると、Herokuが再起動します。

10分に1回よりも頻繁にこれを行わないでください。そうしないと、Herokuによって10分のタイムアウトが発生します。

Node.jsでは、process.exit(0)でこれを行います。

Herokuサポートのクリスから:

クラッシュしたdynoはすぐに再起動されます。 dynoがクラッシュ状態から「up」状態(dynoが$ PORTにバインドされていることを意味する)に移行する場合、通常の実行dynoになります。ブートまたは「開始」シーケンス中に再びクラッシュした場合、タイムアウト期間が経過するまで再起動されません。タイムアウト期間は現在10分ですが、変更される可能性があります。これにより、絶えずクラッシュするdynoがプラットフォームに余分な負荷をかけるのを防ぎます。

しかし、それはいいように思えますが、実際には機能しません。 dynoマネージャーはアプリが起動することを期待しているため、タイムアウトになりますevery終了する時間:

ワーカープロセス管理では、プロセスを正常に終了しますが、プラットフォームはdynoが起動することを期待しています。その結果、基本的にダイノをクラッシュさせているように聞こえます。

繰り返しになりますが、定期的に再起動する必要がある場合(その期間を10分以上に設定できる場合)、これはメモリクリアを管理する簡単で簡単な方法です。動的に再起動する必要がある場合(アイドル状態が検出された場合など)、または頻繁に他のオプションを調べる必要があります。

環境変数「PS」を介してdynoの名前(「worker.3」、「web.1」など)にアクセスし、プログラムでheroku APIの再起動コマンドを発行できます。

6
DrFriedParts

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
4
grosser

free Heroku scheduler を使用してトリガーされるリポジトリ内の非常に簡単なcurlコマンドスクリプトでこれを解決しました。

#!/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 を参照してください。

2