Installation Heroku CLI

Avant de commencer, vous devez installer heroku en ligne de commande. Pour cela, suivez les différentes étapes en suivant ce lien ci-dessous.

Créer votre application

Dans notre exemple, nous allons créer une API qui permet d'accéder à des films. Pour cela, rien de plus simple. Nous créons d'abord un dossier nommé movies-api et nous importons celui-ci dans VS Code. Nous ouvrons un terminal et nous tapons la commande ci-dessous suivi de la touche entrée (enter). Nous pouvons remarquer qu'un fichier package.json a été créé

npm init -y

Ajouter engines pour Heroku

Pour connaitre la version de Node installée sur notre système, tapez la commande ci-dessous dans  votre terminal.

node -v

Nous connaissons maintenant la version de node ici 12.6.1

Nous allons maintenant ajouter cette version dans notre package.json

Ajouter engines pour Heroku

{
  "name": "movies-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "engines": {
    "node": "12.x"
  }
}

Voici la nouvelle tête de notre fichier package.json

Elle est ajoutée au package.json afin de permettre à heroku de déterminer quelle version de Node il faut utiliser pour votre application. Pour information, j'ai mis volontairement 12.x pour éviter les erreurs possibles lors du déploiement. II se peut que votre version fasse planter le script de déploiement.

Ajouter les dépendances utiles au projet 

{
  "name": "movies-api",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "engines": {
    "node": "12.x"
  },
  "dependencies": {
    "cors": "^2.8.5",
    "dotenv": "^8.2.0",
    "express": "^4.17.1",
    "express-prettify": "^0.1.1",
    "helmet": "^3.22.0",
    "json-beautify": "^1.1.1",
    "pg": "^8.0.3"
  }
}

Voici la nouvelle tête de notre fichier package.json

Installer les dépendances

npm i

Nous pouvons voir que le fichier package.lock.json a été créé ainsi que le dossier node_modules.

Ajouter notre API

Nous allons créer un fichier index.js et y insérer le code suivant :

const express = require("express");
const pretty = require('express-prettify');
const cors = require('cors');
const helmet = require("helmet");

const app = express();

app.use(helmet());
app.use(pretty({ query: 'pretty' }));
app.use(cors());

app.get('/', function (req, res) {
  res.send('Welcome in Movies API');
});

app.listen(5000, () => {
  console.log('API Movies listen on port 5000');
})

Testons notre API

Nous allons tester notre script à l'aide de la commande ci-dessous

node index.js

Nous pouvons voir que le message "API Movies listen on port 5000" s'affiche et nous n'avons pas d'erreurs.

Testons notre API dans le navigateur

Nous allons tester notre API dans le navigateur. Pour cela, ouvrez un nouvel onglet et tapez l'url ci-dessous

On accède bien à la route présente dans notre fichier index.js

app.get('/', function (req, res) {
  res.send('Welcome in Movies API');
});

Pour stopper notre API dans le terminal, vous pouvez faire ctrl + C

Ajouter la commande start

Nous allons ajouter une commande dans notre projet ce qui évitera de taper la même commande sans arrêt.

Text

node index.js

Ajouter .gitignore

Nous allons créer un fichier qui se nomme .gitignore (attention à ne pas oublier le point)

à l'intérieur de ce fichier, nous allons simplement lister les fichiers qui nous souhaitons ignorer car inutiles de pousser sur le dépôt git les node_modules par exemple ou les clés d'API...

Se connecter à Heroku

A l'aide d'un terminal, vous devez taper la commande ci-dessous.

heroku login

Créer une application

A l'aide d'un terminal, vous devez taper la commande ci-dessous.

heroku create

L'application à bien été créée chez Heroku.

Test de notre application

Visualisation du projet

Nous avons bien accès à notre projet sur l'interface Heroku.

Création du fichier Procfile 

Cette ligne permet au serveur heroku de déterminer la commande de lancement de votre application.

Créer un nouveau repository sur github 

Donner un nom à votre repository par exemple movies-api

Suivez les instructions pas à pas

Le déroulé dans les écrans suivants...

echo "# movies-api" >> README.md

Cette commande permet de créer un fichier README.md utile ici pour faire la description technique de votre projet ou de laisser des indications sur comment l'installer. Vous pouvez aussi y joindre des images.

Initialiser le repository

git init

Voir le status des fichiers

git status

Les fichiers ne sont pas encore trackés par git d'ou la couleur rouge. Nous allons utiliser la commande git add pour ajouter les fichiers.

Ajouter un fichier

git add <nom du fichier>

Ici, nous avons juste le tracking sur le fichier README.md

Ajouter les fichiers

git add .

Petite différence avec l'écran précèdent, nous avons le tracking sur tous les fichiers sauf le dossier node_modules que nous avons ajouté dans le fichier gitignore.

Commit nos fichiers

git commit -m "<message>"

Voici ce que vous devez normalement voir dans votre terminal lorsque vous utiliser la commande git commit . Attention à rester le plus précis possible dans votre message de commit. En entreprise, vous avez des normes à respecter. Le but étant de décrire ce que vous faites (bug fix, feature etc...).

Le remote origin github

git remote add origin https://github.com/nicolashedoire/movies-api.git

Cette commande permet de faire le lien entre votre code local sur votre machine et le repository permettant de versionner votre code. Maintenant que le lien est fait, vous pouvez pousser tranquillement votre code grace à la dernière commande.

Poussez votre code sur les serveurs

git push -u origin master

Notre code est poussé sur la branche master de notre repository

Rendu de notre dépôt

Vous pouvez constater que les fichiers sont maintenant disponibles sur note dépôt github.

Ajouter le remote heroku

Il ne reste plus qu'à faire le lien avec heroku et github. Vous avez la commande disponible dans votre interface de projet Heroku.

heroku git:remote -a desolate-journey-34342

Deployer notre application

git add .
git commit m "make it better"
git push heroku master

Effectuer une modification sur votre projet, ajoutez les nouvelles modifications, faites un commit et faites un push en indiquant heroku au lieu de master.

 

Nous pouvons remarquer que le build s'est bien déroulé.

Tester notre application

On peut remarquer ici que notre application ne fonctionne pas et nous allons aller voir pourquoi grace à la commande indiquée sur la page.

Logs notre application

heroku logs --tail

Et maintenant ? Google est ton ami je dirais !

Chercher la solution

Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch

On tombe sur un premier lien que l'on peut aller voir et découvrir ce qu'il se dit et peut-être trouver la solution à notre problème.

Chercher la solution

Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch

Nous allons donc effectuer une petite modification dans notre code afin de laisser Heroku assigner le port.

Update du code

const express = require("express");
const pretty = require('express-prettify');
const cors = require('cors');
const helmet = require("helmet");

const app = express();

app.use(helmet());
app.use(pretty({ query: 'pretty' }));
app.use(cors());

app.get('/', function (req, res) {
  res.send('Welcome in Movies API');
});

app.listen(process.env.PORT || 5000, () => {
  console.log(`API Movies listen on port ${process.env.PORT} || 5000`);
});


Nous allons maintenant redéployer notre application afin de voir si cette modification fonctionne.

Les logs après déploiement

On peut constater que notre API est écoute sur le port 18332 et qu'il n'y a plus d'erreurs. La page est bien servie avec un status 304

Tester notre application

heroku ps:scale web=1

Cette commande permet de s'assurer le l'état de santé de notre application.

Tester not application

heroku open

Nous sommes ravis de constater que notre API à correctement été déployée mais pour tout dire, elle ne sert pas de données pour le moment donc c'est un peu inutile...

 

Dans cette deuxième partie, nous allons voir comment créer une base de données avec Heroku.

Créer une base de données

heroku addons:create heroku-postgresql:hobby-dev

Pour créer une nouvelle base de données, rien de plus simple. Une seule commande permet de faire cela avec Heroku.

Ajouter la connection à la base de données

const dotenv = require('dotenv');
const { Pool } = require('pg');

dotenv.config();

let pool = null;

if(process.env.NODE_ENV === 'PRODUCTION'){
  const dbProdConfig = {
    connectionString: process.env.DATABASE_URL,
    ssl: true
  }
  pool = new Pool(dbProdConfig);
}else{
  const dbDevConfig = {
    host: process.env.DB_HOST,
    port: process.env.DB_PORT,
    database: process.env.DB_NAME,
    user: process.env.DB_USER,
    password: process.env.DB_PASSWORD,
  };
  pool = new Pool(dbDevConfig);
}

pool.connect((err, client) => {
    if (err) {
      console.log(err);
    }
    console.log(`connection à la base de données ok...`);
});

Je crée un nouveau fichier nommé db.js dans mon projet API et je n'oublie pas de redéployer mon API avec le nouveau code. dans mon fichier index.js, j'importe mon fichier avec un require('./db');

Utilisation de la commande Heroku postgres

heroku pg:psql

Je souhaite me connecter à la base de données pour pouvoir l'initialiser.

Je constate qu'il y a un petit problème avec cette commande étant donné que je n'ai pas postgres installé sur ma machine. Mais comment est ce que je fais me direz vous ? J'utilise tout simplement un conteneur docker.

Solution BIS

heroku pg:credentials:url

Grace à cette commande je vais pourvoir me connecter à ma base via PG admin

Je pose mon regard sur connection info string et je remarque que j'ai le nom de la db, l'hôte, le port, le user et le password. Nous allons tester tout cela.

Connection via un client lourd

J'utilise PG admin 4 pour me connecter. Pour information PG admin 3 ne fonctionnera pas car trop ancien.

Connection via un client lourd

La client charge toutes les bases disponibles sur le serveur. Il ne reste plus qu'à trouver la mienne.

Astuce

Je souhaite uniquement charger ma base. Je me déconnecte du serveur et je vais éditer la configuration en ajoutant le nom de ma base dans DB restriction

Avoir des informations sur notre base

heroku pg:info

Copier notre base locale

pg_dump --file "/Users/linkvalue/Desktop/movies.tar" --host "localhost" --port "5432" --username "postgres" --no-password --verbose --role "postgres" --format=t --blobs --encoding "UTF8" "movies"

Pour effectuer un dump de notre base locale, vous pouvez utiliser cette commande ci-dessus. On indique d'abord le chemin vers lequel le fichier sera enregistré, ensuite les différents paramètres de votre serveur, le format d'encodage et le nom de votre base.

Maintenant que nous avons notre dump de la base locale, nous allons pouvoir l'importer sur heroku.

Copier notre base locale en CSV

psql" --command " "\\copy public.movies (id, allocine_id, genders, title, synopsis, creation_date, image, director, duration, created_at) TO '/Users/linkvalue/Desktop/movies.csv' DELIMITER ';' CSV ENCODING 'UTF8' QUOTE '\"' ESCAPE '''';""

Text

Text

Faire une restauration de la base sur heroku

pg_restore --host "ec2-54-146-91-153.compute-1.amazonaws.com" --port "5432" --username "qjxyagxnrkrcxg" --no-password --dbname "d37m29h7uoaurf" --verbose "/Users/linkvalue/Desktop/movies.tar"

Effectuer une creation de table sur heroku

Accéder au bash heroku 

heroku run bash

Made with Slides.com