Redémarrer automatiquement mon application Heroku

Cette commande de terminal redémarre mon application heroku:

heroku restart 

Est-il possible d’exécuter un script qui exécutera cette commande et redémarrera mon application toutes les heures?

En fait, je devais simplement résoudre ce problème pour mes applications et y écrire un article avec plus de détails. Fondamentalement, vous avez besoin de la gem heroku-api maintenant que la gem heroku est remplacée par la CLI. Ensuite, vous avez besoin d’une tâche de rake, de deux variables de configuration et du plugin heroku scheduler (gratuit sauf pour un temps de dyno minimal).

La tâche de râteau ressemble à ceci:

 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 

Vous pouvez également le configurer pour utiliser votre jeton API au lieu de mettre votre nom d’utilisateur et votre mot de passe dans la configuration. Cela ne compte que si vous ne voulez pas que vos co-consortingbuteurs / collègues connaissent votre mot de passe ou le mot de passe de votre compte principal sur Heroku.

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

Maintenant, allez de l’avant et déployez et testez:

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

Enfin, nous devrons configurer la tâche pour l’exécuter dans les délais. J’ai choisi d’utiliser le module complémentaire gratuit Heroku cron:

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

Cela ouvrira l’interface utilisateur du planificateur dans votre navigateur et vous pourrez créer un travailleur planifié pour exécuter la tâche à tout moment. Nous n’en avons besoin qu’une fois par jour et nous choisissons de l’exécuter avant notre premier travail programmé de la journée.

Mon post original avec frigged up CSS (voir update2 ci-dessous):

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

METTRE À JOUR

J’ai changé le nom de la tâche de “implode” à “redémarrer” pour être plus clair sur ce qui se passe. Implode est un nom amusant mais quasiment inutile autrement.

MISE À JOUR2

Apparemment, mon entreprise a supprimé le blog. J’ajoute plus de code ici et j’ai mis à jour le lien, mais le CSS ressemble à un chien qui l’a lancé. Mes excuses.

Vous pouvez créer un travail crok heroku qui utilise l’API Heroku sur votre application pour redémarrer lui-même …

Une question cependant – pourquoi?

Nous avons résolu ce problème en utilisant un buildpack pour mettre la commande heroku à la disposition du dyno lui-même, puis en utilisant Heroku Scheduler.

Nous avons ajouté le buildpack https://github.com/gregburek/heroku-buildpack-toolbelt selon ses instructions:

 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` 

Ensuite, assurez-vous que le slug de l’application a été reconstruit selon les instructions:

 git push heroku master 

Dans Heroku Scheduler, nous avons ajouté ceci comme travail horaire:

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

Vous pouvez déterminer si cela fonctionne en recherchant la sortie du planificateur dans les journaux Heroku, et bien sûr avec le graphique de mémoire de l’application dans le tableau de bord Heroku (si vous redémarrez pour contourner une fuite de mémoire).

Un script n’est pas nécessaire, il suffit de “planter” votre application et Heroku le redémarrera.

Ne le faites pas plus souvent qu’une fois toutes les dix minutes ou Heroku vous soumettra à un délai de 10 minutes.

Dans node.js, vous faites cela avec process.exit(0) .

De Chris chez Heroku Support:

Un dyno écrasé sera redémarré immédiatement. Si le dyno passe d’un état en panne à un état “up” (ce qui signifie que le dyno est lié à $ PORT), il est sujet à un dyno en cours d’exécution. S’il se bloque à nouveau pendant le démarrage ou la séquence de démarrage, il ne sera redémarré qu’après la période TIMEOUT. La période TIMEOUT est actuellement de 10 minutes, mais cela peut changer. Cela empêche les dynos qui se brisent continuellement de mettre une charge externe sur la plate-forme.

Cependant, aussi bon que cela puisse paraître, cela ne fonctionne pas dans la pratique. Vous atteindrez le délai d’attente chaque fois que vous quitterez, car le gestionnaire dyno s’attend à ce que votre application soit active:

Pour la gestion de vos processus de travail, vous quittez le processus proprement, mais la plate-forme s’attend à ce que le dyno soit opérationnel. Il semble que vous tombiez essentiellement sur le dyno.

Donc, encore une fois, si vous avez besoin de redémarrer périodiquement – et cette période peut être définie à> 10 minutes – c’est un moyen simple et facile de gérer la compensation de la mémoire. Si vous devez redémarrer dynamicment (par exemple, en cas d’inactivité) ou fréquemment, vous devrez explorer d’autres options.

Vous pouvez accéder au nom du dyno (ex. “Worker.3”, “web.1”) via la variable d’environnement “PS” et émettre par programmation une commande de redémarrage de l’API Heroku.

Inspiré par https://www.stormconsultancy.co.uk/blog/development/ruby-on-rails/automatically-restart-struggling-heroku-dynos-using-logensortinges/

 # Setup heroku plugins:install https://github.com/heroku/heroku-oauth heroku authorizations:create -s write heroku config:add RESTART_API_KEY= heroku config:add APP_NAME= heroku addons:add scheduler:standard -a  heroku addons:open scheduler -a  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 

J’ai résolu ce problème avec un script de commande curl très simple dans le repository qui est déclenché à l’aide du planificateur gratuit 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"

Voir https://gist.github.com/mattheworiordan/f052b7693aacd025f025537418fa5708 .

Pour autant que je heroku ps:restart --app APPNAME , il suffit de heroku ps:restart --app APPNAME dans le heroku ps:restart --app APPNAME Heroku Scheduler. Je ne comprends pas pourquoi les étapes supplémentaires des autres réponses sont nécessaires.