Déployer efficacement ses applications Node.js

Hello ! J'ai récemment dû trouver un moyen pour déployer facilement mon app Node sur un serveur dédié ou un VPS. Cet article s'adresse uniquement aux utilisateurs de GNU/Linux et ne vaut rien non plus si vous utilisez une plateforme comme Heroku en tant que serveur. Vous devez aussi utiliser git. On peut même déployer sur plusieurs serveurs, par exemple, un pour le développement et un pour la production.

Tout d'abord, je vous propose de suivre un tutoriel pour vous connecter sans mot de passe à votre serveur via SSH. Enfin après si vous aimez taper votre mot de passe, libre à vous. :-)

Installation des outils

Pour déployer, j'utilise deploy. On va donc devoir le télécharger et l'installer :

1
2
3
4
$ cd /tmp # Ne polluons pas nos dossiers :-)
$ git clone https://github.com/visionmedia/deploy.git # blop blop ça télécharge
$ cd deploy
$ make install

Configuration

Nous devons ensuite créer un fichier de configuration. Par défaut, il doit se nommer deploy.conf. Je l'ai placé pour ma part à la racine de mon app. Il doit avoir une tête similaire à ça :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# Entre crochet, le nom de votre serveur
[development]
# L'utilisateur qui va lancer votre app sur le serveur
user node
# L'adresse IP ou l'url vers votre serveur
host blog.alexis.delrieu.me
# Votre dépôt git
repo git@git.assembla.com:foobarbaz.git
# Le chemin vers lequel déployer sur le serveur
path /home/node/app1
# La branche à déployer
ref origin/dev
# Une commande à exécuter après le déploiement,
# ici un script qui installe les dépendances via npm et qui (re)lance le serveur
post-deploy ./update.sh

# Bien évidemment, vous pouvez ajouter d'autres serveurs, par exemple pour la prod' :
[production]
user node
host blog.alexis.delrieu.me
repo git@git.assembla.com:foobarbaz.git
path /home/node/app2
ref origin/master
post-deploy ./update.sh

Installation sur le serveur

Attention, si votre dépôt est privé et que vous utilisez github ou assembla (ou d'autres services similaires) pour héberger votre dépôt git, il vous faudra probablement ajouter la clef publique (~/.ssh/id_rsa.pub) de votre serveur à votre compte github/assembla.

Une petite commande pour installer les dossiers nécessaires à deploy :

1
$ deploy development setup

Un script pour (re)lancer notre serveur

J'ai créé un mini script bash (update.sh dans la conf' précédente) pour installer automatiquement les dépendances de node puis de lancer ensuite notre app.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash

# update dependencies
echo "Update dependencies..."
npm install

# (re)Start the server

list=`forever list --plain`
condition='info:    No forever processes running'

if [ "$list" == "$condition" ]
then
	echo "No process running: start the server..."
	forever start -l forever.log -o out.log -e err.log -a app.js
else
	echo "Restart the server..."
	forever restartall
fi

Il lance Node avec forever. C'est un module qui permet de lancer Node et qui le relance en cas de crash. Assurez-vous qu'il est bien installé sur votre serveur, dans le cas contraire, faites un simple :

1
$ npm install forever -g

DÉ-PLOIIIE-MEEEEENNNT ! \o/

Vérifiez que vous avez bien fait vos commit et vos push puis exécutez cette commande pour déployer :

1
$ deploy development

Et voilà, normalement c'est bon. Vous n'aurez qu'à réitérer la dernière commande à chaque fois que vous voudrez mettre à jour votre application sur votre serveur. Il faut noter que cette méthode ne fait quasiment pas de downtime. Cependant, on ne peut pas déployer sur un cluster. Comme je n'en ai pas eu le besoin, je n'ai pas fait de script pour le faire, mais je suis certain que c'est réalisable sans trop de difficultés.