Ghost comme module, publier ses propres pages HTML

Pendant un moment, la communauté s'est demandée comment avoir des pages statiques avec Ghost. Surtout quand on ne peut exécuter qu'une seule instance de node.js.

Ghost évolue

Ghost l'a rendu possible il y un moment : http://www.ghostforbeginners.com/how-to-publish-a-page-on-your-ghost-blog/
Mais ça reste assez limité, cette solution ne permet pas d'avoir une page totalement indépendante du blog.

Heureusement dans la version 0.5.2, Ghost est devenu un package npm, ce qui permet de l'installer à côté d'autre package, mais surtout de contrôler express. À partir de là, on peut tout faire !
Cet article décrit toutes les possibilités : https://github.com/TryGhost/Ghost/wiki/Using-Ghost-as-an-npm-module

La suite de ce billet va décrire comment servir une page statique, et ne pas se faire avoir avec son hébergeur.

Customiser son installation de Ghost

Créer son application

Il faut commencer par éditer le package.json du projet :

{
    "name": "sagix",
    "main": "server.js",
    "dependencies": {
        "ghost": "~0.5.8",
        "express": "~4.10.0"
    },
    "engines": {
      "node": "~0.10.0"
    }
}

Voici une version agrégée du fichier.
Il faut une dépendance à Ghost et une vers express.
Important, aussi, la version de nodejs à utiliser. Sur les serveurs on trouve la version 0.12 installé, mais Ghost ne support que la 0.10.

Initialisation du serveur

var ghost = require('ghost'),
express = require('express'),
path = require('path'),
parentApp = express();

process.env.NODE_ENV = 'production';

ghost({
    config: path.join(__dirname, 'config.ghost.js')
}).then(function (ghostServer) {
    ghostServer.start(parentApp);
});

Sur certain serveur, on ne contrôle avec la ligne de commande de démarrage, on force alors ici l'environnement de production :

process.env.NODE_ENV = 'production';

Puis on définit l'emplacement ce du fichier de configuration :

config: path.join(__dirname, 'config.ghost.js')

Et voilà ! Après avoir installé les dépendances, on est prêt à lancer notre blog !
Pour plus de détails sur la configuration : http://sagix.fr/installation-ghost-gandi/

Déplacer le dossier de contenu

Il est préférable de mettre le dossier de contenu du blog en dehors de l'installation de Ghost. Toutes les données et le thème seront dans un dossier séparé. On est sûr de ne rien perdre jouant avec notre dépendance à Ghost.

paths: {
    contentPath: path.join(__dirname, '/ghost/')
}

Il ne faut pas oublier de copier les dossiers, ainsi que le thème qui se trouve dans le dossier : /node_modules/ghost/content/
Et il faut indiquer au serveur l'emplacement du dossier :

parentApp.use(ghostServer.config.paths.subdir, ghostServer.rootApp);

Servir une page statique

Cette dernière partie est maintenant très simple.
Il suffit de déposer dans un dossier une page (index.html) avec toutes ses ressources : CSS, javascript, images...
Et de les rendre disponible avec express, une ligne suffit :

parentApp.use('/ma-page-statique', express.static(__dirname + '/dossier', { maxAge: 86400000 }));

Il faut indiquer un maxAge sinon rien ne sera mis en cache par le navigateur.

Astuce

Si vous voulez afficher un lien vers cette page dans l'en-tête du blog, modifiez le fichier index.hbs :
<a style="margin-right:1rem;" class="subscribe-button icon-link" href="{{@blog.url}}/ma-page-statique/">Ma page</a>