======Instance Node.js====== Simple Hosting Node.js vous permet d'héberger des applications [[https://nodejs.org|Node.js]] qui montent en échelle simplement et de manière économique. =====Prérequis===== * Connaissances basiques de Node.js et du protocole HTTP * Votre site doit utiliser NPM pour gérer ses dépendances ===== Support des versions ===== ====Versions supportées==== **Node.js 6 LTS** est installé par défaut et supporté sur les nouvelles instances Node.js Vous pouvez néanmoins choisir votre propre version de Node.js et de npm en configuration le fichier ''package.json''. Pour choisir la version de Node.js à utiliser pour exécuter votre application, voir [[#selection_de_la_version_de_nodejs|Sélection de la version de Node.js]]. Sur les instances précédentes, nous supportons les versions 4 LTS, 0.12.x 0.10.x et 0.8.x de Node.js et vous pouvez également utiliser la version de Node.js votre choix (mais pas de npm pour la série 0.x.x). ====Version de votre choix==== Vous pouvez installer d'autres versions de Node.js, à partir du moment où elle est supportée et distribuée par [[https://github.com/creationix/nvm | Node Version Manager ("nvm")]]. Veuillez consulter la section [[#selection_de_la_version_de_nodejs|Sélection de la version de Node.js]] pour en savoir plus. =====Fonctionnement général===== Votre application Node.js doit être composée au minimum d'un fichier nommé server.js. Ce fichier sera exécuté par l'interpréteur Node.js lors du démarrage de votre instance ou lors d'un déploiement avec l'accés Git. Afin de recevoir les requêtes HTTP et HTTPS, votre application doit écouter sur le port spécifié par la variable d'environnement //PORT// (process.env.PORT). ====Vhosts==== Contrairement aux instances PHP, chaque création de vhost ne crée pas un dossier spécifique sur votre disque. Le dossier nommé default présent dans vhosts permet de gérer les données pour votre instance Node.js. Une seule instance de votre application est exécutée, et doit gérer tous les vhosts que vous avez associé à votre instance Simple Hosting. ====Exemples==== Exemple d'une simple application Node.js affichant le nom du vhost //server.js// var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.write('Hello Node.js!\n'); if ('host' in req.headers) { var host = req.headers['host']; res.write('Vhost is ' + host.split(':')[0] + '\n'); } else { res.write('No vhost specified\n'); } res.end(); }).listen(process.env.PORT); Exemple vhost avec express.js : https://github.com/visionmedia/express/blob/master/examples/vhost/index.js ===== Démarrage ===== Simple Hosting supporte 3 façons de démarrer une application Node.js. La plateforme essayera de démarrer votre application suivant cette séquence : - Depuis le "start script" défini dans le fichier //package.json// - Depuis le champs "main" du le fichier //package.json// - Depuis un fichier //server.js// s'il existe à la racine de l'application L'ordre de démarrage a changé en Décembre 2015. Avant, les applications étaient démarrées en priorité à partir du fichier //server.js//. ==== Avec package.json (recommandé) ==== La manière "standard" de démarrer une application Node.js est d'utiliser les instructions définies dans package.json. Alors que Simple Hosting ne supportait pas cette fonctionnalité originalement, elle est désormais la manière recommandée de démarrer votre application. Le fichier //package.json// doit être placé à la racine de votre application. Il doit contenir un champ //package.json["main"]// pour définir un point d'entrée, ou contenir une commande de démarrage dans le champ //package.json["scripts"]["start"]//. La plupart des applications Node.js pré-packagées, comme par exemple le moteur de blogs [[http://wiki.gandi.net/tutorials/simple/nodejs/ghost|Ghost]], utilisent déjà cette convention et il est donc plus facile de les installer. === Définir un point d'entrée === Vous pouvez définir un point d'entrée dans le champs //[[https://docs.npmjs.com/files/package.json#main|main]]// de //package.json//. Il vous suffit d'introduire le nom d'un fichier placé à la racine de votre application pour que Simple Hosting l'utilise pour démarrer votre application. Par exemple, pour démarrer à partir du fichier "index.js": //package.json// { "name" : "foo", "version" : "1.2.3", "description" : "A packaged foo fooer for fooing foos", "main" : "index.js", } === Définir une commande de démarrage === Vous pouvez définir vous-même la commande de démarrage dans le champs //[[https://docs.npmjs.com/misc/scripts#default-values|['scripts']['start']]]//. Simple Hosting va simplement éxecuter cette commande pour démarrer votre application. L'exemple suivant est équivalent à l'exemple de "point d'entrée" décrit plus haut : //package.json// { "name" : "foo", "version" : "1.2.3", "description" : "A packaged foo fooer for fooing foos", "scripts": { "start": "node index.js" } } Le script de démarrage est très flexible et vous permet de personnaliser la manière de démarrer votre application. Par exemple, vous pouvez activer le support ES6 en lançant Node.js en [[https://github.com/nodejs/node-v0.x-archive/wiki/es6-(a.k.a.-harmony)-features-implemented-in-v8-and-available-in-node|mode harmony]]. //package.json// { "name" : "foo-ecma-script", "version" : "6", "description" : "ES6 on Simple Hosting", "engines": { "node": "6" }, "scripts": { "start": "node --harmony index.js" } } Vous pouvez également utiliser cette fonctionnalité avec des variables d'environnement pour démarrer votre application avec des gestionnaires de processus tels que [[https://github.com/Unitech/pm2|pm2]]. Ou encore pour expérimenter avec les threads grâce à [[https://github.com/libuv/libuv|libuv]]. ==== Avec server.js ==== La manière la plus simple de créer une application Node.js sur Simple Hosting est de placer un fichier nommé //server.js// à la racine de votre projet. Cette méthode était utilisée par défaut jusqu'en Décembre 2015. ===== Variables d'environnement ===== Vous pouvez utiliser les variables d'environnement pour lire ou définir des options de configuration, au niveau de la plateforme ou de votre application. Voici quelques exemples de variables d'environnement définies par Simple Hosting : * PORT=8080 * NODE_ENV=production * WEB_MEMORY=128 * WEB_CONCURRENCY=2 Les valeurs de //WEB_MEMORY// et //WEB_CONCURRENCY// dépendent de la taille de votre instance (S, M, L, XL, XXL). La première correspond à la valeur maximale. La dernière peut être modifiée selon vos critères, la valeur par défaut étant celle que nous recommandons. ==== Lire les variables d'environnement ==== Vous pouvez accéder aux variables d'environnement normalement, c'est-à-dire depuis //process.env//. Par exemple : var port = process.env.PORT; console.log(process.env.PORT); // 8080 ==== Définir des variables d'environnement ==== Vous pouvez définir ou réecrire des variables d'environnement depuis votre application ou depuis la commande de démarrage. Depuis votre application, il suffit de définir les variables en utilisant //process.env//. Par exemple : process.env.NODE_ENV = "staging"; console.log(process.env.NODE_ENV); // => "staging" Au démarrage, pour pouvez utiliser le champs //package.json['scripts']['start']// pour définir une ou plusieurs variables d'environnement au style shell. Par exemple : // package.json// { ... "scripts": { "start": "NODE_ENV=staging node index" } } Assurez-vous de ne pas écraser la variable d'environnement //PORT//, puisque vous pourriez perdre la connectivité avec la plateforme. De manière générale, veillez à ne pas écraser des variables d'environnement importantes avant de lancer votre application. =====Installation des dépendances de votre site===== La plateforme Simple Hosting Node.js se charge lors d'un déploiement via l’accès Git, d'installer les dépendances de votre site. Pour cela vous devez spécifier les dépendances dans le fichier "package.json" à la racine du vhost, soit dans 'vhost/default' : //package.json// { "name": "website", "version": "0.0.1", "dependencies": { "express": "3.x" } } Lors de l'installation, 'npm install' est lancé avec le paramètre '--production' par défaut. Il n'est pas possible de modifier ce paramètre =====Sélection de la version de Node.js===== Vous pouvez utiliser n'importe quelle version Node.js et de npm supportées par [[https://github.com/creationix/nvm | Node Version Manager (nvm)]]. Il vous suffit de définir les numéros des versions désirées dans les [[https://npmjs.org/doc/json.html#engines | propriétés engines["node"] et engines["npm"] ]]. { "engines": { "node": "6", "npm": "*" } } Les versions demandées seront installées pendant [[ ::fr:simple:git | la phase de build]], après avoir poussé le code de votre projet sur votre instance avec git et avoir lancé la commande "deploy" via SSH. ==== Node.js legacy ==== === Fichier .nvmrc === Simple Hosting peut installer la version de Node.js de votre choix grâce à Node Version Manager (nvm). Créez un fichier nommé ".nvmrc" à la racine de votre projet et écrivez-y la version désirée. **Quand vous déploierez votre code**, Simple Hosting détectera l'existence de ce fichier (cela ne fonctionnera pas si vous créez simplement le fichier via sFTP ou SSH). Si nécessaire, la plateforme installera la version de Node.js détectée avec "nvm" avant d'installer les dépendances de votre application. Exemple : $ echo "6.9.2" > .nvmrc $ cat .nvmrc 6.9.2 La présence du fichier ".nvmrc" est prioritaire par rapport à l'utilisation du champ "engines" dans package.json, qui sera ignoré si le fichier existe. Les binaires Node.js téléchargés avec **nvm** ne sont pas vérifiés ou supportés par Gandi. Nous vous prions de faire vous-mêmes les validations de stabilité et sécurité que vous jugerez nécessaires. === Package.json === Pour utiliser une des [[https://wiki.gandi.net/fr/simple/instance/nodejs#support_des_versions | versions de Node.js qui sont pré-installées sur votre instance]], il suffit de spécifier dans le fichier “package.json“ la version vous souhaitez utiliser dans le champ “engines“. Par exemple : //package.json// { "name": "website", "version": "0.0.1", "engines": { "node": "6" } } L'exemple ci-dessus forcera l'utilisation de la version 6.x de Node.js. Pour plus d'information sur le champ “engines“, voir https://npmjs.org/doc/json.html#engines [en]. Pour plus d'informations sur les versions actuelles de Node.js, voir https://nodejs.org. ===== Websockets ===== Il est désormais possible d'utiliser les Websockets sur les instances NodeJS (en Beta) ! Reportez vous à la page http://wiki.gandi.net/fr/simple/websockets pour plus d'informations. =====Logs===== Les sorties standard et d'erreur de votre site sont redirigées vers un fichier de log sur votre disque : * via la console SSH : /srv/data/var/log/www/nodejs.log * via SFTP : /lamp0/var/log/www/nodejs.log Ce fichier de log contient également la sortie du programme NPM chargé d'installer les dépendances de votre site. En complément vous pouvez consulter l'historique des actions effectuées par le programme chargé de démarrer votre site : * via la console SSH : /srv/data/var/log/www/nodejs-watchd.log * via SFTP : /lamp0/var/log/www/nodejs-watchd.log Vous pourrez surveiller si votre application Node.js a correctement démarré. =====Base de données===== ====MySQL==== MySQL 5.7 (Percona) est disponible pour les nouvelles instances Node.js sur Simple Hosting. Nous supportons également MySQL 5.6 (Percona) et MySQL 5.5 sur les instances existantes. Vous pouvez vous connecter au service MySQL via son socket Unix, disponible sur ''/srv/run/mysqld/mysqld.sock''. Par défaut, l'utilisateur de la base de données est ''root'' et aucun mot-de-passe n'est demandé pour effectuer une connexion locale. Nous vous recommandons de changer ces accès pour des raisons de sûreté. Néanmoins, cela pourra être pratique pour effectuer des tests. A ces fins, vous pouvez également utiliser la base de données ''default_db'', qui est prête à usage. Vous pourrez ensuite créer autant d'utilisateurs et de bases et données que nécessaire, même si généralement une suffit. Vous n'êtes limité que par l'espace disque disponible sur votre instance, que vous pouvez de toute façon augmenter à tout moment jusqu'à 1 To. Vous pourrez gérer votre bases de données MySQL avec les outils shell habituels (''mysql'', ''mysqldump'', etc.) via la console SSH, ou depuis la console web, avec PHPMyAdmin. Consultez [[ en:simple:mysql | l'article de référence sur l'utilisatio de MySQL sur Simple Hosting]] pour en savoir davantage. Voici un exemple d'application permettant de se connecter à la base de données par défaut : //index.js// var http = require('http'), mysql = require('mysql'); var mysql_conn = mysql.createConnection({ socketPath: '/srv/run/mysqld/mysqld.sock', database: 'default_db', user: 'root', password: '' }); var test_mysql_conn = function(callback) { mysql_conn.connect(function(err) { if (err) { console.log(err.code); if (callback) callback("FAILED"); } else { console.log('connected...'); if (callback) callback("OK"); } }); mysql_conn.end(); }; http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.write('Hello Node.js!\n'); test_mysql_conn(function(mysql_status) { res.write('MySQL connection: ' + mysql_status + '\n'); res.end(); }); }).listen(process.env.PORT); // package.json // { "name": "sample-nodejs-mysql-app", "version": "1.0.0", "description": "Sample Node.js MySQL app for Simple Hosting", "main": "index.js", "engines": { "node": "6" }, "dependencies": { "mysql": "*" } } ====PostgreSQL==== Nous offrons PostgreSQL 9.6 avec Node.js sur les nouvelles instances Simple Hosting. Nous supportons également PostgreSQL 9.4 et PostgreSQL 9.2 sur des instances existantes. Le service PostgreSQL de votre instance est disponible sur l'hôte ''localhost'', à travers le port ''5432''. Un utilisateur ''hosting-db'' a le droit de se connecter sans mot de passe et d'utiliser la base de données par défaut, appelée ''postgres''. Vous pouvez vous en servir pour effectuer des tests, mais nous vous recommandons de créer des mots de passe robustes pour une utilisation durable. Vous pouvez créer autant de bases de données et d'utilisateurs dont vous avez besoin, même si normalement un de chaque suffit. Vous n'êtes limité que par l'espace disque disponible sur votre instance, que vous pouvez augmenter à tout moment jusqu'à 1 To. Vous pouvez gérer votre base de données PostgreSQL avec les outils shell habituels via la console SSH (psql, pg_dump, etc.), ou depuis le panneau de contrôle Web avec phpPgAdmin. Consultez [[fr:simple:posgtresql | l'article de référence sur l'utilisation de PostgreSQL sur Simple Hosting]] pour en savoir plus. Voici un exemple d'application permettant de tester Node.js avec PostgreSQL sur Simple Hosting : //server.js// var http = require('http'), pg = require('pg'); var pg_url = "tcp://hosting-db@localhost/postgres"; var pg_conn = new pg.Client(pg_url); var test_pg_conn = function(callback) { pg_conn.connect(function(err) { if (err) { console.log(err); if (callback) callback("FAILED"); } else { console.log('Connected to PostgreSQL'); if (callback) callback("OK"); } }); }; http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.write('Hello Node.js!\n'); test_pg_conn(function(pg_status) { res.write('PostgreSQL connection: ' + pg_status + '\n'); res.end(); }); }).listen(process.env.PORT); //package.json// { "name": "sample-nodejs-pgsql-app", "version": "1.0.0", "description": "Sample Node.js PostgreSQL app for Simple Hosting", "main": "index.js", "engines": { "node": "6" }, "dependencies": { "pg": "*" } } ====MongoDB==== MongoDB 3.2 est disponible avec Node.js sur les nouvelles instances Simple Hosting. Nous supportons également MongoDB 2.4 sur les instances existantes. Sur votre instance, le service MongoDB est disponible sur ''localhost'', sur le port ''27017''. Vous n'aurez pas besoin d'utilisateur ni de mot de passe pour effectuer des tests, mais nous vous recommandons d'en créer pour un usage durable. Vous pouvez créer autant d'utilisateurs et de bases de données que nécessaire; vous êtes seulement limité par l'espace disque disponible sur votre instance, que nous pouvez augmenter à tout moment, jusqu'à 1 To. Vous pouvez gérer votre base de données MongoDB avec l'outil ''mongo'' via la console SSH , ou depuis le Web avec RockMongo. Consultez [[:en:simple:mongodb| l'article de référence sur l'utilisation de MongoDB sur Simple Hosting]] pour en savoir davantage. Voici un exemple d'utilisation de MongoDB avec Node.js sur Simple Hosting: //index.js// var http = require ("http"), mongo = require("mongodb"); var mongo_url = "mongodb://localhost:27017/sample"; var mongo_conn = mongo.MongoClient; var test_mongo_conn = function(callback) { mongo_conn.connect(mongo_url, function(err, db) { if (err) { console.log(err); if (callback) callback("NOT WORKING"); } else { console.log("Connected to server."); if (callback) callback("OK"); } if (db) db.close(); }); }; http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.write('Hello Node.js!\n'); test_mongo_conn(function(status) { res.write('MongoDB connection: ' + status + '\n'); res.end(); }); }).listen(process.env.PORT); //package.json// { "name": "sample-nodejs-mongodb-app", "version": "1.0.0", "description": "Sample Node.js MongoDB app for Simple Hosting", "main": "index.js", "engines": { "node": "6" }, "dependencies": { "mongodb": "*" } } Vous trouverez plus d'informations sur [[https://docs.mongodb.org/getting-started/node/ | l'utilisation de MongoDB avec Node.js sur le site officiel]]. =====Problèmes connus===== ====PostgreSQL==== L'installation du module //pg// ne fonctionne pas en utilisant la version de ''npm'' livrée avec Node.js 0.10.x. Il est conseillé de sélectionner d'autres versions de Node.js, en suivant les instructions de la section [[#selection_de_la_version_de_nodejs|Sélection de la version de Node.js]]. Lors de l'installation du module //pg//, les messages d'erreurs suivants apparaissent : gyp WARN EACCES user "root" does not have permission to access the dev dir "/srv/data/.node-gyp/0.8.22" gyp WARN EACCES attempting to reinstall using temporary dev dir "/srv/data/tmp/.node-gyp" You need to install postgresql-server-dev-X.Y for building a server-side extension or libpq-dev for building a client-side application. gyp: Call to 'pg_config --libdir' returned exit status 1. while trying to load binding.gyp gyp ERR! configure error gyp ERR! stack Error: `gyp` failed with exit code: 1 gyp ERR! stack at ChildProcess.onCpExit (/usr/lib/node_modules/npm/node_modules/node-gyp/lib/configure.js:416:16) gyp ERR! stack at ChildProcess.EventEmitter.emit (events.js:99:17) gyp ERR! stack at Process._handle.onexit (child_process.js:678:10) gyp ERR! System Linux 3.4.7-grsec-paas-19c573d gyp ERR! command "node" "/usr/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild" gyp ERR! cwd /srv/data/web/vhosts/default/node_modules/pg gyp ERR! node -v v0.8.22 gyp ERR! node-gyp -v v0.8.5 gyp ERR! not ok Le module //pg// est quand même installé, mais limité à l'implémentation en Javascript. La correction est en cours. ===== Voir aussi ===== * [[https://npmjs.org/|NPM]] * [[http://nodejs.org/|Node.js]] * [[http://expressjs.com/|express.js]] * [[https://npmjs.org/doc/json.html|le format JSON]] * [[fr:simple:git#les_instances_nodejs|accès Git pour les instances Node.js]] * [[http://wiki.postgresql.org/wiki/What%27s_new_in_PostgreSQL_9.2#JSON_datatype|le type de données JSON dans PostgreSQL]]