vendredi 17 juin 2011

Hébergement node.js avec Heroku Celadon Cedar Stack

Le service PaaS Heroku a lancé il y a peu de temps en beta publique sa nouvelle stack, Celadon Cedar.

Une des nouveautés apportée par cette version est le support de node.js, framework destiné à développer des applications réseau facilement scalables en JavaScript (du côté serveur), utilisant la machine virtuelle V8.

Installation de heroku

$ gem install heroku

Application basique

On va écrire une application la plus simple possible, le but n'étant pas d'apprendre le node.js, donc un "hello world" fera parfaitement l'affaire.
var express = require('express');

var app = express.createServer(express.logger());

app.get('/', function(request, response) {
  response.send('Hello World!');
});

var port = process.env.PORT || 3000;
app.listen(port, function(){
  console.log("Listening on " + port);
});

Utilisation de npm

Cedar reconnait une app node.js si il y a un fichier package.json, donc même si l'application n'a pas de dépendance, il faut inclure ce fichier.

{
  "name": "node-example",
  "version": "0.0.1",
  "dependencies": {
    "express": "2.2.0"
  }
}

Il est préférable de ne pas déployer le fichier node_modules, donc ajoutons le au .gitignore.

Déclaration des "process types" with Foreman/Procfile

Pour exécuter l'application, nous devons déclarer la commande à utiliser pour la lancer, donc simplement lancer notre script.

Dans le fichier Procfile :

web: node web.js

On peut donc maintenant lancer l'appli avec Foreman

$ gem install foreman
$ foreman start
14:39:04 web.1     | started with pid 24384
14:39:04 web.1     | Listening on 5000

L'application est donc accessible sur le port 5000.

Déploiement

Heroku nécessitant git, la première chose à faire est de versionner l'application :
$ git init
Initialized empty Git repository in .git/
$ git add .
$ git commit -m "new app"
Created initial commit 5df2d09: new app

Ensuite, il faut créer l'application Heroku sur la plateforme, via l'api en ligne de commande :
$ heroku create --stack cedar
Creating radiant-river-296... done, stack is cedar
http://radiant-river-296.herokuapp.com/ | git@heroku.com:radiant-river-296.git
Git remote heroku added

Une application appname vierge nous attend donc chez Heroku, il suffit de pousser notre application avec git pour la voir en ligne immédiatement :
$ git push heroku master
Counting objects: 9, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (7/7), done.
Writing objects: 100% (9/9), 923 bytes, done.
Total 9 (delta 2), reused 0 (delta 0)

-----> Heroku receiving push
-----> Node.js app detected
-----> Vendoring node 0.4.7
-----> Installing dependencies with npm 1.0.6
       mime@1.2.2 ./node_modules/express/node_modules/mime
       connect@1.4.1 ./node_modules/express/node_modules/connect
       qs@0.1.0 ./node_modules/express/node_modules/qs
       express@2.1.0 ./node_modules/express
       Dependencies installed
-----> Discovering process types
       Procfile declares types -> web
-----> Compiled slug size is 3.1MB
-----> Launching... done, v4
       http://radiant-river-296.herokuapp.com deployed to Heroku

To git@heroku.com:radiant-river-296.git
 * [new branch]      master -> master

Avant de voir notre application en ligne, il faut la scaler :
Before looking at the app on the web, we’ll need to scale the web process:

$ heroku ps:scale web=1
Scaling web processes... done, now running 1
Now, let’s check the state of the app’s processes:

$ heroku ps
Process       State               Command
------------  ------------------  --------------------------------------------
web.1         up for 10s          node web.js
The web process is up. Review the logs for more information:

$ heroku logs
2011-03-10T10:22:30-08:00 heroku[web.1]: State changed from created to starting
2011-03-10T10:22:32-08:00 heroku[web.1]: Running process with command: `node web.js`
2011-03-10T10:22:33-08:00 heroku[web.1]: Listening on 18320
2011-03-10T10:22:34-08:00 heroku[web.1]: State changed from starting to up

Tout est ok, notre app est accessible, on peut l'ouvrir via un simple heroku open.

Aucun commentaire:

Enregistrer un commentaire