Catégories
Devops

Heroku

Heroku est un Paas (service en ligne)  qui nous permet de déployer, gérer et faire tourner des applications (Node.js, Python, Go, Scala, Ruby, Clojure, Java et PHP) sur des containers Linux appelés dynos (infrastructure Heroku) et offre un Dashboard d’administration plutôt bien fait.

Une application au sens Heroku est un ensemble de fichiers source ainsi qu’un fichier de dépendances (package.json pour du Node) et un Procfile (qui défini les commandes pour lancer les différentes instances des composants de votre application).

La méthode de déploiement préconisée sur l’infra Heroku est la CLI Heroku avec Git bien qu’il soit possible d’utiliser leurs API ou l’intégration GitHub.

Terminologie

  • les Dynos sont des containers Unix virtualisés isolés, qui fournissent l’environnement requis pour lancer une application
  • un Slug est une archive compressée regroupant les sources, les dépendances, le runtime et les éléments compilés par le système de build

Fonctionnement

Pré requis

Pour déployer une application NodeJs sur Heroku, il faut disposer en local de :

  1. Nodejs et npm
  2. client git
  3. CLI Heroku à installer :
    • sous Windows via choco : choco install heroku-cli /y
    • sous Ubuntu avec snap : sudo snap install heroku --classic
    • sous Mac avec brew : brew tap heroku/brew && brew install heroku
    • sous Linux: curl https://cli-assets.heroku.com/install.sh | sh

Déploiement

Pour une nouvelle app Heroku

Exécuter les commandes suivantes une fois un nouveau shell ouvert dans le dossier de votre projet, en utilisant la CLI Heroku :

heroku login                                # demande les login/pass de votre compte heroku
heroku create nomDeVotreAppli --region eu   # cré un projet nomDeVotreAppli sur heroku et le git remote associé
git push heroku master                      # déploie les sources et lance le process de Build sur heroku

Pour une app Heroku existante

Si l’on souhaite reprendre une application existante sur Heroku et pousser nos sources (en local sous git), il faudra ajouter le git remote associé à l’application Heroku via un heroku git:remote -a nomDeVotreAppli
et vérifier avec un git remote -v

Vie de la dyno

Il est possible de surveiller l’état de nos dynos grâces aux commandes suivantes :

heroku info             # liste toutes les caractéristiques de la dyno
heroku logs --tail      # suit les logs (équivalent à un tail -f en bash)
heroku ps               # affiche le nombre et l'état des dynos (runnig, crash etc)
heroku ps:scale web=3   # augmente le nombre de dynos pour cette instance à 3
heroku open             # ouvre l'URL de votre appli hébergé dans votre Navigateur !
heroku git:clone -a nomDeVotreAppli  # récupère les sources du code déployé
heroku config:add TZ="Europe/Paris"  # corrige le Timezone pour Paris 😀

Pour la modification de la Timezone (dans l’ex précédent « Euruope/Paris ») se référer à la base de données TimeZone (tz database).

Pour lancer l’appli web en local et vérifier notre procfile, heroku nous propose la commande : heroku local web

Nous avons également la possibilité d’accéder à un shell bash sur notre instance via la commande : heroku run bash

RAM

La mémoire étant limitée (surtout pour les plans gratuit et hobbie 512Mo) il faut pouvoir surveiller la consommation mémoire de sa dyno, il est possible d’utiliser une Heroku Lab (fonctionnalité expérimentale) qui est le log-runtime-metrics, qui comme son nom l’indique va logger visible dans PaperTrail ou les logs heroku la consommation mémoire :

heroku labs:enable log-runtime-metrics   # installe la fonctionnalité
heroku labs:disable log-runtime-metrics  # commande pour la désinstaller
heroku restart

Variables d’environnements

Les variables d’environnements peuvent être settées de différentes façon.

Local

En local, heroku nous mets à disposition le fichier .env pour y positionner les variables d’environnement souhaités.

Sur notre dynos

Un set de commandes dédiés aux créations/suppressions de variables d’environnement sont disponibles pour nos instances Heroku :

heroku config:set NODE_ENV="production"   # pour setter la variable d'environnement NODE_ENV 
heroku config                             # visualiser les variables d'environnement de la dyno
heroku config -a nom-app-heroku           # pour lister les vars de cette app spécifiquement

#=== monApp Config Vars
#NODE_ENV:             production
#NODE_PORT:            8080
#PAPERTRAIL_API_TOKEN: xxxxxxxxxxxxxxx
heroku config:unset NODE_PORT             # pour supprimer la variable

Interface Web Heroku

Troubleshooting

J’ai été confronté à une impossibilité de démarrer mon projet (Nextjs/Node) sur Heroku, qui après un git push heroku tentait d’effectuer le npm build de mon package.json plusieurs fois avant de tomber en timeout… et le heroku logs -t me donnait :

State changed from starting to crashed
Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
Stopping process with SIGKILL
Process exited with status 137

La solution m’a été apportée par cet issue Github dans lequel il est question d’une entrée prestart (entrée de npm scripts) qui permet d’exécuter une commande avant un npm start, et en cherchant dans la doc Heroku on trouve qu’il existe également 2 entrées scripts spécifique à Heroku heroku-prebuild and heroku-postbuild et un post SO sur la différence entre les prestart et heroku-prebuild.
heroku-prebuild m’a donc sauvé de ces erreurs et on peut y placer le build de NextJS sans limite de temps !

Addons

Heroku propose un système d’add-ons, permettant d’outiller notre environnement, avec par exemple un PaperTrail :

heroku addons:create papertrail    # ajoute l'addon PaperTrail
heroku addons                      # liste les addons 'installés' sur notre dyno
heroku addons:open papertrail      # ouvre la page web de Papertrail

Les addons installés sont également accessible aussi depuis l’onglet ressources de notre dyno.

Addons intéressants

PaperTrail : centralise les logs de nos différentes dynos ou apps et propose une WebUI permettant de filtrer les évènements

Librato : permet de monitorer vos dynos et propose une interface sympa

Liens