Ghost à publié sa nouvelle release 1.0, qui introduit également l'outil ghost-cli permettant d'installer ghost, de le mettre à jour et d'intéragir plus facilement avec la plateforme.

Le thème de base "casper" a également été mis à jour, et je trouve le nouveau design absolument génial, bien que j'ai effectué certaines modifications dans les styles, notamment concernant la dimensions des images.

Je n'ai donc pas hésité trop longtemps, car je trouvais déjà que Ghost était une solution très intéressante pour écrire des articles, sans avoir pour autant à ajouter des dizaines de plugins comme sur wordpress.

Je vais donc expliquer dans cet article comment installer Ghost via l'outil ghost-cli, et comment réaliser la migration depuis WordPress.

Pour résumer les fonctionnalités principales de Ghost :

  • Articles en markdown
  • Organisation des articles par tags
  • Support natif des meta datas
  • Support natif de l'AMP
  • Application Desktop

De quoi avons nous besoin ?

  • Un VPS avec Ubuntu 16.04 LTS
  • Un serveur MySQL
  • NGINX
  • Node v6
  • Un utilisateur avec sudo

Installation des pré-requis

On commence par créer un utilisateur et lui donner les droits sudo, puis on se connecte via cet utilisateur. Cet utilisateur ne doit pas s'appeller ghost, car l'utilisateur ghost sera automatiquement ajouté par ghost-cli

adduser --disabled-password --disabled-login monghost 
usermod -aG sudo monghost
su - monghost

On met à jour la liste des paquets et le serveur

sudo apt-get update
sudo apt-get upgrade

On installe la dernière release de nginx

wget -O - https://nginx.org/keys/nginx_signing.key | sudo apt-key add -
sudo echo "deb http://nginx.org/packages/ubuntu/ $(lsb_release -sc) nginx" > /etc/apt/sources.list.d/nginx.list
sudo apt update
sudo apt install nginx

On installe MariaDB 10.3

curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup \
| sudo bash -s -- --mariadb-server-version=10.3 --skip-maxscale

sudo apt update && sudo apt install mariadb-server

On installe nodejs v8 LTS

curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash 
sudo apt-get install -y nodejs

Installation de Ghost

On commence par installer ghost-cli

sudo npm i -g ghost-cli

Puis on créer le répertoire pour notre blog

sudo mkdir -p /var/www/ghost
sudo chown monghost:monghost /var/www/ghost
cd /var/www/ghost

Et on peut enfin lancer l'installation de Ghost, qui est totalement interactive et qui va :

  • Configurer la base de donnée
  • Installer la dernière version de Ghost
  • Configurer Ghost
  • Configurer Nginx et installer un certificat SSL avec Let's Encrypt
  • Déclarer Ghost en tant que service via systemd

Vous avez le choix pour chacune des étapes, de le faire via ghost-cli ou manuellement. Dans le cas de Nginx par exemple, si vous utiliser une configuration particulière, il sera préférable d'ajouter votre vhost manuellement.

On lance donc l'installation avec :

ghost install

configuration de nginx

Pour la configuration de Nginx, pour des performances optimales, j'utilise personnellement la fonctionnalité proxy-cache d'Nginx pour mettre en cache les pages du blog, cette technique est également appelée micro-caching puisque le délai d'expiration du cache est relative court mais autorise par contre Nginx à utiliser les fichiers en cache dans le cas ou l'upstream (le serveur nodejs Ghost dans ce cas) est indisponible.

Pour cela je commence par créer un répertoire pour stocker le cache nginx :

sudo mkdir -p /var/cache/nginx/static
sudo chown -R www-data:www-data /var/cache/nginx

Je peux ensuite créer mon vhost et définir le stockage du cache dans ce répertoire

proxy_cache_path /var/cache/nginx/static levels=1:2 keys_zone=GHOST:75m inactive=24h max_size=512m;
server {
# redirection du http vers https
    listen 80;
    listen [::]:80;
    server_name votredomain.tld www.votredomain.tld;

    return 301 https://votredomain.tld$request_uri;
}
server {
# redirection du www vers non-www
    server_name www.votredomain.tld

    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl on;
    ssl_certificate /etc/letsencrypt/live/votredomaine.tld/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/votredomaine.tld/key.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/votredomaine.tld/cert.pem;

    return 301 https://votredomain.tld$request_uri;

}
server {

    server_name votredomain.tld;

    root /var/www/votredomain.tld/system/nginx-root;

    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl on;
    ssl_certificate /etc/letsencrypt/live/votredomaine.tld/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/votredomaine.tld/key.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/votredomaine.tld/cert.pem;

    access_log /var/log/nginx/votredomaine.tld.access.log;
    error_log /var/log/nginx/votredomaine.tld.error.log;

    location / {
        proxy_cache STATIC;
        proxy_cache_valid 200 5m;
        proxy_cache_valid 404 1m;
        proxy_cache_key "$scheme$request_method$host$request_uri";
        proxy_cache_use_stale http_500 http_502 http_503 http_504 http_403 http_404 updating;
        proxy_cache_background_update on;
        
        proxy_ignore_headers X-Accel-Expires Expires Cache-Control;
        proxy_ignore_headers Set-Cookie;
        proxy_hide_header Set-Cookie;
        proxy_hide_header X-powered-by;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:2368;
    }
    location ~ ^/(?:ghost|signout) {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_pass http://127.0.0.1:2368;
        add_header Cache-Control "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0";
    }
    location /content/images {
        alias /var/wwww/votredomaine.tld/content/images;
        access_log off;
        expires max;
    }
    location /assets {
        alias /var/wwww/votredomaine.tld/content/themes/casper/assets;
        access_log off;
        expires 30d;
    }
    client_max_body_size 50m;
}

Pour installer le certificat SSL, j'utilise actuellement acme.sh, un client Acme écrit en bash que je trouve plus facile à utiliser que certbot, notamment pour la mise en place des renouvellement automatique.

Je vous met le lien de mon article qui explique comment installer acme.sh et comment générer un certificat SSL : Installer un certificat SSL Let's Encrypt avec Acme.sh

Mettre à jour Ghost

Là aussi, la nouvelle CLI de Ghost facilite vraiment le processus de mise à jour, puisqu'il suffit de se rendre dans le dossier de votre blog en tant que l'utilisateur définit pour utiliser la CLI puis d'utiliser ghost update

su - monghost
cd /var/www/ghost
ghost update

Migrer depuis WordPress

Pour migrer depuis WordPress, il faut tout d'abord extraire votre contenu au format .json en utilisant le plugin officiel publié par Ghost. Il est disponible dans l'annuaire de plugins WordPress

Après avoir extrait votre contenu, vous pourrez l'importer dans Ghost, il est restera cependant quelques tâches à réaliser manuellement :

  • Les images devront être importées manuellement ou hébergées sur un hébergeur externe
  • Les commentaires devront être importés sur une plateforme comme Disqus ou sur une solution self-hosted comme Isso
  • Les méta-data de vos articles devront être ajoutées manuellement, l'importateur Ghost ne traite que le contenu des articles et les tags

Je vais traiter dans un prochain article comment installer Isso pour héberger l'ensemble de vos commentaires et ne pas avoir à utiliser une solution comme disqus.


licence creative common

L’ensemble des articles publiés sur jesuisadmin.fr sont mis à disposition selon les termes de la licence CC BY-NC-SA 4.0.