68 votes

Redémarrer mon application heroku automatiquement

Cette commande de terminal redémarre mon application heroku :

heroku restart

Existe-t-il un moyen d'exécuter un script qui lancera cette commande et redémarrera mon application toutes les heures ?

0 votes

J'ai besoin de la même chose. Ma raison est que je mets à jour les traductions I18n sur cron, et que je dois redémarrer l'application pour vider le cache I18n.

0 votes

@Oded vous devriez choisir une réponse, s'il vous plaît, afin que les gens ne continuent pas à voir ceci dans leurs flux de "sans réponse". Merci !

36voto

WattsInABox Points 1349

En fait, je viens de résoudre ce problème pour mes applications et j'ai écrit un article à ce sujet avec plus de détails. En gros, vous avez besoin de la gemme heroku-api maintenant que la gemme heroku est remplacée par la CLI. Ensuite, vous avez besoin d'une tâche rake, de quelques variables de configuration et du plugin heroku scheduler (gratuit sauf pour un temps minimal de dyno).

La tâche de rake 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 qu'il utilise votre jeton d'API au lieu de mettre votre nom d'utilisateur et votre mot de passe dans la configuration. Cela n'a d'importance que si vous ne voulez pas que vos co-contributeurs/collaborateurs 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-y, 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 exécuter le programme. 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 rake quand vous le souhaitez. Nous n'en avons besoin qu'une fois par jour et nous choisissons de l'exécuter avant notre première tâche planifiée de la journée.

Mon message original avec un CSS détraqué (voir la mise à jour 2 ci-dessous) :

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

UPDATE

J'ai changé le nom de la tâche de "implode" à "restart" pour être beaucoup plus clair sur ce qui se passe. Implode est un nom amusant mais plutôt inutile autrement.

UPDATE2

Apparemment, mon entreprise a supprimé l'article du blog. J'ajoute plus de code ici et j'ai mis à jour le lien, mais le CSS semble avoir été jeté par un chien. Toutes mes excuses.

1 votes

Voici une tâche rake prête à être déployée basée sur votre solution : github.com/demental/herokustarter . La raison pour laquelle j'avais besoin de cela était que je devais effacer une mémorisation de l'extérieur de l'application (I18n ActiveRecord Backend). Je ne vois pas d'autre moyen.

1 votes

Erreur "site non trouvé" lors de l'ouverture du lien. Pouvez-vous mettre à jour le lien

0 votes

Désolé si je l'ai manqué, mais quelqu'un pourrait-il m'indiquer le format du nom d'utilisateur et du nom de l'application ici ? Est-ce que c'est nom d'utilisateur = adresse email et nom d'application = nom d'application.com ou nom d'application.herokuapp.com ?

14voto

John Beynon Points 23163

Vous pourriez créer une tâche cron Heroku qui utilise l'api Heroku sur votre application pour se redémarrer...

Une question cependant : pourquoi ?

12 votes

J'ai une fuite de mémoire dans mon application, et le redémarrage de l'application réinitialise l'utilisation de la mémoire. Cela pourrait donc être une solution temporaire jusqu'à ce que nous réglions le problème de mémoire.

3 votes

A côté de l'add-on cron, vous pouvez créer un cron à partir de votre système local ou de n'importe quel autre serveur (qui fonctionne avec Internet) pour exécuter le "heroku restart" toutes les heures.

1 votes

La principale raison pour laquelle je pense avoir quelque chose comme ça est qu'Heroku redémarre chaque banc d'essai 24 heures après qu'il ait été lancé. Si vous ne faites rien, ce sera plutôt un moment aléatoire. Si au lieu de cela vous redémarrez votre application à votre propre moment pendant une période de faible trafic, vous pouvez minimiser l'impact sur votre activité. L'OP dit "toutes les heures" mais ces solutions peuvent être adaptées à n'importe quelle période de redémarrage.

9voto

DrFriedParts Points 266

Un script n'est pas nécessaire, il suffit de "planter" votre application et Heroku la relancera.

Ne le faites pas plus d'une fois toutes les dix minutes, sinon Heroku vous soumettra à un délai de 10 minutes.

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

De Chris à Heroku Support :

Un banc tombé en panne sera redémarré immédiatement. Si le banc passe d'un état à l'état "en marche" (ce qui signifie que le banc est lié à l'ordinateur de bord). $PORT), il est alors sujet à un fonctionnement normal. S'il se plante à nouveau pendant la séquence de démarrage, il ne sera pas redémarré avant la fin de la période redémarré qu'après la période TIMEOUT. La période TIMEOUT est est actuellement de 10 minutes, mais elle est susceptible d'être modifiée. Cela empêche dynos qui tombent continuellement en panne de mettre une charge étrangère sur la la plate-forme.

Cependant, aussi bon que cela puisse paraître, cela ne fonctionne pas dans la pratique. Vous vous heurterez au délai d'attente chaque quand vous sortez parce que le gestionnaire du banc attend que votre application soit en place :

Pour la gestion de votre processus de travail, vous quittez le processus proprement. mais la plateforme s'attend à ce que le banc d'essai soit en place. Il semble que vous essentiellement le crash du dyno en conséquence.

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 facile et simple de gérer le nettoyage de la mémoire. Si vous avez besoin de redémarrer dynamiquement (par exemple, lorsque l'inactivité est détectée) ou fréquemment, vous devrez explorer d'autres options.

Vous pouvez accéder au nom du dyno (ex. "worker.3", "web.1") par le biais de la variable d'environnement "PS" et lancer une commande heroku API restart de manière programmatique.

3 votes

C'est nécessaire pour certains, dans notre cas, notre application prend 80 secondes pour démarrer sur heroku et quand ils font leurs cycles quotidiens automatisés de dyno, cela provoque des erreurs de timeout pour les utilisateurs. Si nous faisons un redémarrage sur Heroku, il utilise le pré-démarrage, et les dynos sont en place avant qu'ils aient du trafic.

1 votes

Cette solution fonctionne très bien pour les applications ruby on rails. Il suffit de planifier une tâche qui exécute une seule commande exit et c'est tout !

9voto

Henrik N Points 4447

Nous avons résolu ce problème en utilisant un pack de construction pour obtenir le fichier heroku disponible pour le dyno lui-même, puis en utilisant Heroku Scheduler.

Nous avons ajouté le https://github.com/gregburek/heroku-buildpack-toolbelt buildpack 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`

Puis je me suis assuré que l'application slug a été reconstruite selon les instructions :

git push heroku master

Dans Heroku Scheduler, nous l'avons ajouté comme une tâche horaire :

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

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

2 votes

Nous sommes depuis passés à ce buildpack qui n'est pas déprécié : github.com/heroku/heroku-buildpack-cli Sa configuration est légèrement différente.

0 votes

Notez que github.com/heroku/heroku-buildpack-cli utilise un autre chemin pour son heroku binaire.

6voto

grosser Points 4300

Inspiré par 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 votes

Je l'utilise encore aujourd'hui, donc oui :)

2 votes

Je peux confirmer qu'il fonctionne comme prévu. <3

0 votes

FYI. Vous pouvez supprimer le besoin de APP_NAME et utiliser HEROKU_APP_NAME à la place si vous utilisez les métadonnées de la dynamo. devcenter.heroku.com/articles/dyno-metadata

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X