Installer une application Web statique sur CozyCloud

Publié le par /

Je l’ai déjà expliqué, je rêve de pouvoir faire de Cozy le pendant serveur de Firefox OS, une plateforme applicative libre et personnelle hébergeant des applications purement Web. J’ai donc essayé d’y installer certaine application Web conçue pour Firefox OS. Pour l’instant, ça n’est pas possible directement, car Cozy ne sait pas encore héberger des pages Web statiques. Une application Cozy nécessite un composant serveur. J’ai donc écrit rapidement un adaptateur pour transformer une application Web statique en application Cozy.

Écrire cet adaptateur s’est révélé être très simple.

Pour simplifier la gestion de dépendances entre l’adaptateur et mon application, j’ai d’abord rendu cette dernière disponible via npm. Il suffit pour cela de créer un fichier package.json (npm init permet de le faire de façon interactive) puis de le publier avec npm publish.

Pour ce qui est de l’adaptateur, Cozy est capable d’installer une application dotée d’un fichier package.json depuis un dépôt Git public. J’ai donc créé un dossier et l’ai initialisé :

mkdir toto
cd toto
git init
npm init
npm install --save express
npm install --save myapp

Pour des raisons de simplicité, j’utilise Express, qui fait tout ce que je veux en deux lignes de code. Il est probablement possible de réduire la taille de l’application installée et son empreinte en se passant d’Express et utilisant directement l’API Node.js. Toute contribution en ce sens sera la bienvenue ☺

Normalement, votre application devrait avoir été installée dans le dossier node_modules/myapp. Il suffit donc de demander à Express de servir les fichiers présents dans ce dossier :

var express = require('express');
var app  = express();
var port = process.env.PORT || 9250;
var host = process.env.HOST || "127.0.0.1";
// Serve static content
app.use(express.static(__dirname + '/node_modules/myapp'));
// Starts the server itself
http.createServer(app).listen(port, host, function() {
  console.log("Server listening to %s:%d within %s environment", host, port, app.get('env'));
});

Et c’est tout, il ne vous reste plus qu’à publier cet adaptateur, et vous devriez pouvoir utiliser vos applications Web statiques dans votre instance Cozy. Pour cela, il suffit de saisir l’URL du dépôt dans le formulaire en bas du gestionnaire d’applications de Cozy et de cliquer sur Installer.

Si vous voulez personnaliser l’icône de l’application dans Cozy, ajoutez le chemin d’une image dans le fichier package.json de l’adaptateur :

{
  "name": "cozy-myapp",
  "version": "0.0.1",
  "description": "CozyCloud wrapper for MyApp",
  "main": "server.js",
  "dependencies": {
    "myapp": ">= 0.0.1",
    "express": "^4.10.1"
  },
  "scripts": {
    "start": "node server.js"
  },
  "author": "Clochix",
  "license": "GPLv3",
  "icon-path": "myapp.png"
}

Adaptez votre application pour Cozy

L’application que j’ai portée permet de synchroniser des données avec un serveur remoteStorage. Or, vous pouvez [installer un tel serveur dans votre Cozy]((http://blog.cozycloud.cc/news/2014/08/12/when-unhosted-meets-cozy-cloud/). D’où l’idée de pousser un peu l’intégration et de préconfigurer mon application pour qu’elle utilise le serveur RS installé sur l’instance.

J’ai donc légèrement modifié mon application pour qu’elle utilise un fichier default.js contenant quelques valeurs par défaut. Je ne concatène pas ce fichier avec les autres fichiers javascript, obligeant le navigateur à faire une requête spécifique pour le récupérer. Je peux ainsi demander à Express d’intercepter cette requête et de renvoyer en lieu et place du fichier de mon application un autre fichier, contenant des options spécifiques à l’installation sur Cozy :

app.get('/js/default.js', function (req, res) {
  res.setHeader('Content-Type', 'text/javascript');
  res.sendFile('customConfig.js');
});

Le code étant plus parlant que les longues tirades, si le sujet vous intéresse je vous invite à jeter un œil au code de mon adaptateur, et n’hésitez pas à essayer de l’installer sur votre instance Cozy.

Pour réagir, n'hésitez-pas à m'écrire : clochix chez clochix.net ou à soumettre l'url de votre commentaire :
(Je traite les mentions à la main, elles peuvent mettre plusieurs jours avant d'apparaître)

Si vous avez un compte Github, vous pouvez me proposer des corrections en éditant ce billet

Fork me on GitHub