in ghost blog linux mint installation ~ de lecture.

Installation de Ghost 1.19.0 sur Linux Mint 18

Il est généralement recommandé de suivre les instructions officielles lors de l'installation d'un moteur de blog (ou n'importe quel outil d'ailleurs), mais pour ma part j'ai préféré m'aventurer et comprendre un peu plus en profondeur la bête.
Pour ceux qui souhaitent utiliser Ghost CLI et suivre la documentation officielle, c'est ici.
Pour ceux qui souhaitent utiliser le mode aventurier (sur un environnement vierge), voici ce qu'il faut faire, pas à pas, pour installer la dernière version de Ghost sur un environnement Linux Mint.

ghost_logo_big

NODEJS

Node.js® est un pré-requis car Ghost est construit entièrement à partir de l'environnement d'exécution JavaScript de Chrome, aussi bien lors de la phase d'installation que lors de la phase d'exécution.

  • Téléchargement et installation
$ sudo curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
$ sudo apt-get install nodejs
  • Vérification
$ node -v (v6.11.0)
$ npm -v (3.10.10)

GHOST

C'est ici que l'aventure commence, nous allons récupérer le dernier zip officiel de l'outil et le configurer manuellement pour une exécution sur un environnement de production.

  • Téléchargement et installation
$ sudo mkdir -p /var/www/ghost

$ curl -L https://ghost.org/zip/ghost-latest.zip -o ghost.zip
$ sudo unzip -uo ghost.zip -d  /var/www/ghost
$ sudo cd /var/www/ghost 
$ sudo npm install --production
  • Démarrage de Ghost
$ npm start --production

NAME: InternalServerError
CODE: ECONNREFUSED
MESSAGE: The server has encountered an error.
Error: connect ECONNREFUSED 127.0.0.1:3306

Erreur n°1, vous ne possédez pas encore de base de données MySQL.

MYSQL

Vous l'aurez compris, par défaut Ghost communique avec une base de données de type MySQL, vous pourrez le changer plus tard avec sqlite3 si cela vous correspond mieux.

$ sudo apt-get install mysql-server

Lorsqu'il vous ai demandé de changer le mot de passe root, faites-le pour ne pas laisser une faille de sécurité évidente.

  • Redémarrer Ghost :
$ npm start --production

NAME: InternalServerError
CODE: ER_ACCESS_DENIED_ERROR
MESSAGE: The server has encountered an error.
Error: ER_ACCESS_DENIED_ERROR: Access denied for user 'root'@'localhost' (using password: NO)

Erreur n°2, le mot de passe root attendu par Ghost est vide par défaut, il faut donc le changer avec celui que vous avez saisi ci-dessus (disons "mon_joli_mdp").

$ nano core/server/config/env/config.production.json
{
    "database": {
        "client": "mysql",
        "connection": {
            "host"     : "127.0.0.1",
            "user"     : "root",
            "password" : "mon_joli_mdp",
            "database" : "ghost"
        }
    },
    ...
}
  • Redémarrer Ghost :
$ npm start --production

NAME: DatabaseIsNotOkError
CODE: DB_NOT_INITIALISED
MESSAGE: Please run knex-migrator init
DatabaseIsNotOkError: Please run knex-migrator init

Erreur n°3, la base de données n'a pas été initialisée, attention à bien le faire pour l'environnement de production (sinon cela est fait par défaut sur l'environnement de développement).

$ npm install -g knex-migrator
$ NODE_ENV=production knex-migrator init
  • Redémarrer Ghost :
$ npm start --production

INFO Ghost is running in production...
INFO Your blog is now available on http://localhost:2368/
INFO Ctrl+C to shut down
INFO Ghost boot 2.459s

PM2

Pour que votre blog démarre automatiquement lors d'un redémarrage de votre ordinateur, et éviter ainsi de devoir lancer à chaque fois la commande "npm start --production", voici un moyen de le faire :

$ sudo npm install -g pm2
$ NODE_ENV=production pm2 start index.js --name "ghost blog"
$ pm2 dump
$ pm2 startup

NGINX

Si vous souhaitez pointer un nom de domaine qui vous appartient (disons "mon_joli_nom_de_domaine") vers votre blog Ghost, il vous faut installer un serveur web, par exemple Nginx :

$ sudo apt-get install nginx

Ensuite il faut éditer le fichier de configuration de Ghost en ajoutant la clé "url" comme suit :

$ nano core/server/config/env/config.production.json
{
    "url": "http://www.mon_joli_nom_de_domaine.fr",
    "database": {
        ...
    },
    ...
}

Pour que le fichier soit pris en compte, il faut redémarrer votre blog, en utiliant PM2 comme vu ci-dessus :

$ pm2 restart "ghost blog"

Vous devez ensuite configurer Nginx pour qu'il fasse le lien entre votre nom de domaine, votre serveur et votre blog, voici un exemple :

server {
    listen 80;
    server_name mon_joli_nom_de_domaine.fr;

    ## no-www to www
    return 301 http://www.mon_joli_nom_de_domaine.fr$request_uri;
}

server {
    listen 80;
    server_name www.mon_joli_nom_de_domaine.fr;

    ## webapp ghost blog
    location / {
        proxy_set_header   X-Forwarded-Fort     $proxy_add_x_forwarded_for;
        proxy_set_header   X-Real-IP            $remote_addr;
        proxy_set_header   Host                 $host;
        proxy_set_header   X-Forwarded-Proto    $scheme;
        proxy_pass         http://127.0.0.1:2368;
    }
}
$ sudo service nginx restart

Enjoy !